有很多关于将未来的操作绑定到不存在的元素的问题,最终都用live /delegate来回答。我想知道如何对与选择器匹配的所有现有元素以及与尚未创建的同一选择器匹配的所有未来元素运行任意回调(例如,添加类或触发插件) 。
似乎 livequery 插件的主要功能使其成为核心,但另一部分,附加任意回调不知何故丢失了。
另一个常见的答案是事件委托,但是如果一个人无法访问创建元素以触发事件的所有供应商代码怎么办?
这是一些真实世界的代码:
// with livequery
$('input[type=text], input[type=password], textarea, .basic_form .block select, .order_form .form_item select, .order_form .form_item input')
.livequery(function(){
$(this)
.focus(function(){
$(this).addClass('active');
})
.blur(function(){
$(this).removeClass('active');
})
.addClass('text');
});
// with live
$('input[type=text], input[type=password], textarea, .basic_form .block select, .order_form .form_item select, .order_form .form_item input')
.live('focus', function(){
$(this).addClass('active');
})
.live('blur', function(){
$(this).removeClass('active');
});
// now how to add the class to future elements?
// (or apply another plugin or whatever arbitrary non-event thing)
一种方法是监控何时添加/删除新节点并重新触发我们的选择器。感谢@arnorhs,我们知道了DOMNodeInserted事件,我会忽略跨浏览器问题,希望那些小的 IE 补丁有朝一日可以到达 jQuery 的上游,或者知道可以包装 jQuery DOM 函数。
但是,即使我们可以确保 DOMNodeInserted 触发跨浏览器,使用多个选择器绑定到它也是荒谬的。可以随时创建数百个元素,并且对这些元素中的每一个进行潜在的数十个选择器调用将会爬行。
到目前为止我最好的主意
监视 DOMNodeInserted/Deleted 和/或挂钩到 jQuery 的 DOM 操作例程以仅设置一个“重新初始化”应该发生的标志可能会更好吗?然后可能只有一个计时器每 x 秒检查一次该标志,仅在 DOM 实际更改时运行所有这些选择器/回调。
如果您快速添加/删除大量元素(如动画或____),那仍然可能非常糟糕。如果 x 较低,则必须每 x 秒为每个保存的选择器重新解析一次 DOM 可能会过于紧张,而如果 x 很高,则界面会显得迟钝。
还有其他新颖的解决方案吗?
当它允许我时,我会添加一个赏金。我为最新颖的解决方案添加了赏金!
基本上我得到的是一种更面向方面的操作 DOM 的方法。一种可以允许将来创建新元素的方法,并且应该使用初始 document.ready 修改来创建它们。
JS 最近能够做很多魔法,我希望它会很明显。