如何使用jQuery解决动态加载页面中的重复对象?

时间:2009-11-05 11:41:56

标签: asp.net jquery asp.net-mvc ajax asp.net-ajax

我想解决动态加载内容中的重复对象。请查看以下源代码以便于理解。

基页HTML包含1个动态加载内容

<body>
     <div id="general-div"></div>>
     <div id="div1"></div>
     <div id="placeholder1">
          Dynamic Content will be placed inside this.

          <div class="inner-div"></div>
          <div class="div1"></div>
     </div>
</body>

对于本页标题中的脚本,可以很容易地选择“general-div”对象,如下面的代码。

 $('#general-div')

在占位符1中选择“inner-div”对象非常容易。所以我可以使用下面的代码进行选择。

 $('.inner-div')

以上代码可以完美运行。但是,当同一文档中有多个重复对象(如下面的HTML)时,我无法使用上述代码。上面的代码将返回2个不符合我想要的对象。

基页HTML - 加载其他动态加载内容后

<body>
     <div id="general-div"></div>>
     <div id="div1"></div>
     <div id="placeholder1">
          Dynamic Content will be placed inside this.

          <div class="inner-div"></div>
          <div class="div1"></div>
     </div>
     <div id="placeholder2">
          Dynamic Content will be placed inside this.

          <div class="inner-div"></div>
          <div class="div1"></div>
     </div>
</body>

可能的解决方案1 ​​

我必须在动态加载内容中创建指定的jQuery对象foreach脚本,如下面的代码。

 // Deep copy for jQuery object.
 var specfiedjQueryObj = $.extend(true, {}, jQuery);

 // modify find function in jQuery object.
 specfiedjQueryObj.fn.find = function(selector)
 {
      // by adding placeholder selector before eval result.
      return new specfiedjQueryObj.fn.old_find('#placeholder1 ' + selector);
 };

 // So, I can select any object in dynamic loading content.
 (function($)
 {
      // This result must be 1 object.
      $('.div1'); 
 })(temp);

即使这个解决方案应该工作得很好。但我发现jQuery是一个非常复杂的对象。我尝试使用它时发现了很多错误。

你有什么想法解决这个问题吗?

PS。 PlaceHolder Id不是固定ID。所以,在选择器规则中修复它是不可能的。而且,我不完全知道文件中的元素和位置(第一个,最后一个或中间)的数量。由于动态加载,内容将显示在很多页面上。

4 个答案:

答案 0 :(得分:1)

$('div[id^=placeholder]:last')怎么样?

Selectors / attrubuteStartsWith

答案 1 :(得分:1)

您只需使用$('.innerdiv:first')获取first$('.inner-div:last')即可获得last。或者,如果您有多个并且想要选择特定的$('.inner-div:nth(x)'),其中x是项目的索引。

答案 2 :(得分:0)

以下函数将处理来自部分加载视图页面的数据,并为脚本中的每个jQuery选择器添加指定的上下文。这个答案效果很好。但是,它不支持外部脚本文件。

function renderPartialView(control, data)
{
    // For detecting all script tag in loaded data.
    var reExtractScript = /(<script type="text\/javascript">)([\s\S]+?)(<\/script>)/gi;

    // For detecting all "$" sign (must be jQuery object) in loaded data.
    var reFindDollarSign = /\$\(([\S]+?)\)/gi;

    // Find all matched string in loaded data.
    var result = reExtractScript.exec(data);
    var allScript = '';

    if (result)
    {
        for (i = 0; i < result.length; i += 4)
        {   
            // Remove current script from loaded script.        
            data = data.replace(result[i], '');

            // Replace all "$" function by adding context parameter that is control.
            allScript += result[i+2].replace(reFindDollarSign, '$($1, "' + control + '")');
        }
    }

    // Load non-script html to control.
    $(control).html(data);

    // Evaluate all script that is found in loaded data.
    eval(allScript);
}

// This script will partially download view page from server in the same domain
$(function()
{
    $.get(getUrl('~/Profile/Section/ViewEducation'), null, function(data)
    {
        // When partial loading is complete, all loaded data will be sent to “renderPartialView” function
        renderPartialView('#education-view', data);
    });
});

答案 3 :(得分:0)

好的,让我们来谈谈你的HTML示例。我添加了一类占位符,稍后在id中添加了一个破折号。

<div id="placeholder-1" class="placeholder">
     Dynamic Content will be placed inside this.

     <div class="inner-div">baz</div>
     <div class="div1">zip</div>
     <a href="#" class="action">action</a>
</div>
<div id="placeholder-2" class="placeholder">
     Dynamic Content will be placed inside this.

     <div class="inner-div">foo</div>
     <div class="div1">bar</div>
     <a href="#" class="action">action</a>
</div>

现在我可以使用$('.placeholder a.action').bind('click', ... );将事件绑定到这些链接中的每一个如果我希望将此事件发送到页面上的所有未来html块,我会$('.placeholder a.action').live('click', ... );

此代码会将事件附加到这些链接,var语句可以捕获<div>的id或内部文本。通过这种方式,您没有碰撞的id属性值,但您可以使用类占位符遍历div内的操作。

$('.placeholder a.action').live('click', function(){
    // get the id
    var id = $(this).parents('div.placeholder').attr('id').split('-')[1];
    // get the text inside the div with class inner-div
    var inner_div = $(this).parents('div.placeholder').children('.inner-div').text();
    // get the text inside the div with class div1
    var div1 = $(this).parents('div.placeholder').children('.div1').text();
    return false;
});