jQuery:如何在尚未添加到DOM的元素上调用jQuery插件函数?
我有一个jQuery插件,我正在使用:
$(document).ready(function(){ $('.elements').fancyPlugin(); });
这很有效,直到我开始添加新元素:
$.get('ajax.html', function(data){ $('#container').html(data); });
我可以像这样再次调用插件函数:
$.get('ajax.html', function(data){ $('#container').html(data).find('.elements').fancyPlugin(); });
…除了AJAX发生在另一个jQuery插件中,该插件不应该知道fancyPlugin()
。
如何将此插件应用于所有当前和未来的元素?
我认为这将适用于IE以外的所有浏览器:
document.body.addEventListener("DOMNodeInserted", function(event){ var $elementJustAdded = $(event.target); if ($elementJustAdded.hasClass('elements')) { $elementJustAdded.fancyPlugin(); } }, false);
另一种方法是创建自己的事件:
var container=$('#container'); $.get('ajax.html', function(data){ container.html(data); $('.elements',container).trigger('added.yourns'); }); container.on('added.yourns','.elements',function(){ $(this).fancyPlugin(); });
然后,在添加元素时,只需使用trigger
方法触发事件!
var aDiv=$('div'); aDiv.appendTo(someNode); aDiv.trigger('added.yourns');
这样做将使您能够在任何JavaScript文件中附加任何行为!
如果使用AJAX添加这些元素,则可以使用.ajaxSuccess()
方法:
$('#container').ajaxSuccess(function(result) { $('.elements').fancyPlugin(); });
这是一个现场演示 。
让您的AJAX处理程序触发一些自定义事件,如contentAdded
,并将fancyPlugin
绑定到该事件。
或者,您可以使用DOM突变事件为容器中的任何更改调用fancyPlugin
。 本机浏览器支持还没有完成,但是有些插件可以解决这个问题。
有趣。 从本质上讲,你会喜欢这样的东西:
$('selector').ready( ... do something ... );
问题是那种逻辑不可用。 在页面上加载的元素不会触发我所知道的任何特定事件,它们只是从它们上面的DOM节点inheritanceCSS。 我要做的只是从$.get
成功函数中触发一个自定义事件。 您的其余代码可以挂钩到该事件,以执行可能需要的任何插件重新加载工作。 您可以使用该事件传递相关选择器的列表,并使用它来调用相应的插件(您可以在哈希表中保留一组selector -> plugin refresh function
关系)
你看过jQuery .live事件处理程序吗? 如果新项目符合指定要求,则会在将新项目添加到dom时自动绑定。
如果你做这样的事怎么办?
$(document).ready(function(){ $('.elements').live('load', function () { $(this).fancyPlugin(); }) });
在ajax调用之后或在返回的内容中,事件不会重新绑定。 live()
现在和将来都会为事件附加一个处理程序。“