2010-12-06 62 views
3

我正在将我的web应用程序转换为完全的AJAX体系结构。jQuery:我可以自动将插件应用于动态添加的元素吗?

我有我最初加载的母版页和加载了动态内容的div容器。

我创建了几个jQuery插件,我将其应用于某些元素以扩展其功能。我通常调用的函数每个页面加载过程如下:

$(document).ready(function() { 

    // Enable fancy AJAX search 
    $(".entity-search-table").EntitySearch(); 

}); 

这将找到合适的div(S),并调用插件来实现必要的功能。

在AJAX环境中,我不能在页面加载时应用插件,因为元素将被动态地添加和删除。

我想要做这样的事情:

$(document).ready(function() { 

    // Enable fancy AJAX search 
    $(".entity-search-table").live("load", function() { 
     $(this).EntitySearch(); 
    }); 

}); 

问:是否存在时选择相匹配的<div>或其他元素添加到DOM,我可以触发事件的任何方式?

每次AJAX请求完成时激活插件似乎令人难以置信的浪费。插件仅在第一次添加到DOM时才需要应用到该元素。

感谢您的帮助!

+0

你可能已经有你的架构正在进行,但如果你不这样做,我会为我的[AJAXFetch jQuery插件](http://phrogz.net/JS/AJAXFetch/)插入一个插件,它使用标记以允许您自动在页面上执行各种AJAX风格的交换。 – Phrogz 2010-12-06 03:30:10

回答

4

是的 - 看看liveQuery。例如:

$('.entity-search-table').livequery(function(){ 
    $(this).EntitySearch(); 
}); 
+1

这绑定到每个的加载事件,你需要* only *`$(this)。EntitySearch();`作为处理程序的主体:) – 2010-12-06 03:21:31

+0

@Nick - 这就是我从我从未使用过的东西中创建一个示例所得到的结果:S – karim79 2010-12-06 03:23:36

0

使用住在你的插件代码中直接

jQuery.fn.EntitySearch = function() { 
    this.live(..., function(){ your plugin code }); 
    return this; 
} 

1

这似乎令人难以置信的浪费每一个AJAX请求完成的时间来激活插件绑定。插件仅在第一次添加到DOM时才需要应用到该元素。

你可以得到两全其美的位置,例如:

$("#something").load("url", function() { 
    $(".entity-search-table", this).EntitySearch(); 
}); 

这样,它的唯一应用插件,您只是加载的.entity-search-table元素,因为我们指定的上下文$(selector, context)限制它。

0

DOM 2 MutationEvent是你真正想要的,但不幸的是它不被IE支持。您需要在插件中使用live()/delegate()绑定,或者(正如我在解决此问题时所做的那样)使用来自AJAX加载器的回调来指示已更改的范围。

相关问题