我想为将要创建的与JQuery选择器匹配的所有标记创建等效的onCreate
事件。
例如,让我们考虑一个文档,其中$("#foo > .bar > ul > li")
的结果是空集。我有一个名为fooBar
的函数,我想在创建匹配$("#foo > .bar > ul > li")
的标记时调用此函数。
我想在我的
中定义此事件$(function() {});
有人知道这种可能性吗?
答案 0 :(得分:3)
据我所知,当元素添加到DOM时,没有任何事件被触发,所以没有什么可以绑定处理程序来检查这一点。
您可以做的是设置一个轮询例程,该例程将定期检查DOM以查找与您的选择器匹配的元素,将当前匹配数与之前的值进行比较,并执行您希望的任何操作(如果它们不同)。
var matchedElements = 0;
function poll() {
var $elements = $("#foo > .bar > ul > li");
if($elements.length > matchedElements) {
fooBar();
}
matchedElements = $elements.length;
}
setInterval(poll, 500); // runs poll() every half a second
这一切都假设您没有控制这些元素的创建,或者至少没有以一种允许您可靠地知道它们已被创建的方式控制它们。
如果这些元素的唯一来源是您编写的单个函数,那么您可以简单地扩展它以触发jQuery中绑定的自定义事件的处理程序。
答案 1 :(得分:3)
您可以访问document
上的DOMNodeInserted
事件以检测更改,并使用.is
检查它们是否与您选择的选择器匹配。
$(function() {
var selector = "whatever";
$(document).on('DOMNodeInserted', function(e) {
if ($(e.srcElement || e.target).is(selector)) {
alert("Matching element inserted!");
}
});
});
<强> See it in action 强>
这种方法很方便,但确实有两个缺点:
DOMNodeInserted
事件。关于第一个,我不认为这是一个问题。它可能已被弃用,但只要没有其他选择,我真的不认为任何浏览器供应商会提取此功能。也许在五年左右这将成为一个实际问题,但由于代码总共10行左右,因此更新它以使用最新标准肯定会很容易。
对于IE兼容性,可悲的事实是你不能直接做任何事情。但是,您可以采用通过修改DOM元素原型来提供结果的冗长,可怕的黑客攻击。请参阅example tailored to work on IE8。
可悲的是,这种方法存在多个问题:
Node.prototype
上定义了这些方法,而不是Element.prototype
)。即使开玩笑,也不应该提及定位未来的浏览器。最后,你可以随时决定使用民意调查来检测变化,正如安东尼在答案中解释的那样。