由于我还是MVC 3和 jquery的新手,我想知道如何解决以下问题的最佳实践方案:

我有一个视图,我使用jquery ajax来获取并显示产品A的一些产品详细信息的部分视图.加载的部分视图包含一堆html和jquery代码,它与局部视图中定义的id相关联.

因此,我想重复使用相同的部分视图来显示同一视图中其他产品的详细信息(例如,在弹出对话框中显示产品B的详细信息).每当显示弹出窗口时,新获取的部分视图将与产品A的部分视图冲突,因为在html中使用相同的id.

有没有办法在部分视图中封装html和javascript,并重复使用几页,而不用担心与ID和内容的任何冲突?

我希望我的问题有道理.谢谢,

/尼玛

更新

这里是一些伪代码,概述了我的问题:

视图

<script type="text/javascript">
$(document).ready(function () {

    $('.productItems').click(function () {
        var input = { productId: $(this).attr('data-productID') };
        var url = url = '<%: Url.Content("~/ProductDetails/ShowProductDetails") %>';


        // Show the modal Box with product details
        $('#dialogBox').dialog({
            title: $(this).attr('data-productTitle')
        });


        // Fetch content in the background
        $.get(url,input,function (result,response) {
            $('#dialogBox').html(result);
            });
    });
});
</script>


<div id="detailsArea">
    <% Html.RenderPartial("ProductDetails",Model.Product); %>
</div>

<div id="productLinks">
  <span class="productItems" data-productID="123">Product B</a>
</div>

<div id="dialogBox" style="display: none;"></div>

控制器 – >动作(ShowProductDetails)

public ActionResult ShowProductDetails(int productId)
{
  // Get product from db. and return the partial view

  return PartialView("ProductDetails",p);
}

部分视图(ProductDetails)

<script type="text/javascript">

   function SetProductTabContent(selectedTab) {
        $("#productDescriptionContent > div").css('display','none');

        switch (selectedTab) {

            case '#tab-1':
                $('#productDescriptionText').css('display','block');
                break;

            case '#tab-2':
                $('#productSpecificationText').css('display','block');
                break;   
        }


$(document).ready(function () {
    // Get all the menu items
    var menuItems = $("#productMenu a");

    // Select the first tab as default
    menuItems.first().addClass("menuItemActive");

    // Handle the look of the tabs,when user selects one. 
    menuItems.click(function () {

        var item = $(this);

        // Get content for the selected tab
        SetProductTabContent(item.attr('href'));

        menuItems.removeClass("menuItemActive");
        item.addClass("menuItemActive");
        return false;
    });
});
</script>


<div id="productMenu" style="">
    <a href="#tab-1">
        <div class="menuItemHeader">Menu1</div>
    </a>
    <a href="#tab-2">
        <div class="menuItemHeader">Menu2 </div>
    </a>
</div>


<div id="productDescriptionContent">

        <div id="productDescriptionText" style="display: none;">
            <%: Model.Product.Description %>
        </div>
        <div id="productSpecificationText" style="display: none;">
            <%: Model.Product.Description2%>
        </div>
</div>

问题
当部分视图在DOM中加载两次时,div会发生冲突.

解决方法

是.正如您所指出的,不要在JavaScript中使用ids和id选择器.而是使用类选择器:

例如,在你看来的标记:

<div class="container">Partial View content</div>

JS:

var $div = $('div.container');
// do something

为了消除选择具有相同类名称的其他标签的可能性,将部分视图中的元素分配给编程名称,该元素仅用作选择器句柄而不是CSS类.

虽然基于ID的查找是最佳性能明智的,但在这种情况下,通过[tag class]查找可以更有意义地避免id冲突.基于[标签类]的查询在性能方面非常接近id选择器.

此外,您可以通过限制查找范围获得进一步改进:

<div class="container">Partial View content <span class="child">Child content </span></div>

var $span = $(span.child')  // scope of lookup here is entire document

但是,如果您知道该小孩在容器区域内,则可以通过以下方式限制范围:

var $div = $('div.container').children('span.child'); // or just '.child'

另一个提示是进行一次查找并重新使用它:

// less performant
function doSomething() {

    // do something here
    $('div.container').css('color','red');

    // do other things
    $('div.container').find('.child');

   // do more things
    $('div.container').click(function() {...});
}


// better
function doSomething() {
    var $div = $('div.container');

    // do something here
    $div.css('color','red');

    // do other things
    $div.find('.child');

   // do more things
    $div.click(function() {...});

   // or chaining them when appropriate
   $('div.container').css('color','red').click(function() { ... });


}

更新:重构OP的帖子来演示这个概念:

<script type="text/javascript">

       function SetProductTabContent(selectedTab,ctx) {
            var $container = $("div.pv_productDescriptionContent",ctx);

            // this will find only the immediate child (as you had shown with '>' selector)
            $container.children('div').css('display','none');  

            switch (selectedTab) {

                case '#tab-1':
                    $('div.pv_productDescriptionText',$container).css('display','block');
                    // or $container.children('div.pv_productDescriptionText').css('display','block');
                    break;

                case '#tab-2':
                    $('div.pv_productSpecificationText','block');
                    // or $container.children('div.pv_productSpecificationText').css('display','block');
                    break;   
            }


    function SetUpMenuItems(ctx) {
        // Get all the menu items within the passed in context (parent element)
        var menuItems = $("div.pv_productMenu a",ctx);

        // Select the first tab as default
        menuItems.first().addClass("menuItemActive");

        // Handle the look of the tabs,when user selects one. 
        menuItems.click(function () {

            var item = $(this);

            // Get content for the selected tab
            SetProductTabContent(item.attr('href'),ctx);

            menuItems.removeClass("menuItemActive");
            item.addClass("menuItemActive");
            return false;
        });
    }
    </script>


<div style="" class="pv_productMenu">
    <a href="#tab-1">
        <div class="menuItemHeader">
            Menu1</div>
    </a><a href="#tab-2">
        <div class="menuItemHeader">
            Menu2
        </div>
    </a>
</div>
<div class="pv_productDescriptionContent">
    <div class="pv_productDescriptionText" style="display: none;">
        <%: Model.Product.Description %>
    </div>
    <div class="pv_productSpecificationText" style="display: none;">
        <%: Model.Product.Description2%>
    </div>
</div>

注意:我删除了document.ready包装器,因为加载部分视图时不会触发.相反,我重构了你的View的JS来调用setup函数,并且传入范围(这将避免使用同一个类选择其他div):

// Fetch content in the background
$.get(url,response) {
       $('#dialogBox').html(result);
       SetUpMenuItems($('#dialogBox'));   
});

显然,您可以根据您认为合适的应用进一步修改这个内容,我所看到的是一个想法,而不是最终的解决方案.

>如果再次加载#dialog,它们将覆盖现有的标记,因此不会有重复.>如果您在其他容器中再次加载部分视图,则可以将其作为上下文传递,这将阻止您访问#dialog的子项>我想出了这个任意前缀pv_的程序化类句柄.这样,您可以看到类名,如果是用于CSS或在脚本中使用.

MVC 3,部分视图和jquery的重用,而不影响DOM的更多相关文章

  1. 使用Html5多媒体实现微信语音功能

    这篇文章主要介绍了使用Html5多媒体实现微信语音功能,需要的朋友可以参考下

  2. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. canvas 实现 github404动态效果的示例代码

    本篇文章主要介绍了canvas 实现 github404动态效果的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. iOS 10 Safari问题在DOM中不再包含元素

    使用此链接,您可以重现该错误.https://jsfiddle.net/pw7e2j3q/如果您点击元素并从dom中删除它,然后单击链接测试.你应该看到旧的元素弹出选择.是否有一些黑客来解决这个问题?解决方法我能够重现这个问题.问题是,每当您尝试删除其更改事件上的选择框时,iOS10都无法正确解除对选择框的绑定.要解决此问题,您需要将代码更改事件代码放在具有一些超时

  5. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  6. ios – Cordova 3.7在每个本机通话中复制iframe

    由于我已升级到Cordova3.7,每个本地调用都将一个新的iframe附加到DOM,如下所示.为了排除我现有的代码影响cordova的可能性,我尝试使用cordovaCLI创建一个新的代码,添加控制台插件,并在设备控制台中的setInterval循环中调用console.log().因此,我在DOM中收到了大量的iframe.我在iPad3,iOS7上尝试过使用xCode6构建应用程序.有没有人遇到这个问题?

  7. 在IOS9中的Cordova应用程序使用JQuery / Javascript的window.history问题

    在两个测试用例中唯一改变的是Cordova.js.解决方法我看到这是几个星期前,但我会发布这个,以防其他人遇到它.听起来它可能与iOS9中的哈希更改生成的导航事件有关.如果是这样,可以将其添加到index.html以禁用哈希侦听:

  8. iOS 5上的jQuery事件

    解决方法在Apple开发论坛上由一个人回答:我需要在将元素添加到DOM之后才绑定(),如下所示:

  9. 升级到iOS 11.3之后,每个apple-mobile-web-app都无法显示全屏幕

    我有一个包含元的Web应用程序在iOS11.3之前,当“添加到主屏幕”时,它将像没有导航栏的独立应用程序一样打开.11.3之后,它现在打开浏览器中的导航栏.解决方法经过数小时的故障排除后,我发现以下可能对其他人有所帮助.对于Android/Chrome兼容性,我的html文件中已经包含以下内容:manifest.json没有“display”:“standalone”条目,只是定义了图标和名称.似

  10. 用swift开发计算器

    来自:https://itunes.apple.com/us/course/developing-ios-8-apps-swift/id961180099

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部