一般从.live()
to转换.on()
比较简单;这样做的确切过程记录在.live()
.
using 的语法.live()
具有稍微误导的一般形式$(selector).live(event, handler)
,因为它给人的印象是发生了一些模糊的奇妙事情,并且它恰好知道何时将匹配的元素添加到 DOM。实际上,正如大多数人所知,它实际上是将事件处理程序委托给文档。
考虑到这一点,很容易看出它是如何转换为.on()
of:的一般形式的$(document).on(event, selector, handler)
。
但是,这种转换取决于知道是什么selector
。如果像问题中的示例一样,您使用任意 jQuery 对象并调用.live()
它,您将如何转换为 using .on()
?
答案是您需要某种方式来确定selector
应该是什么。幸运的是,jQuery 已经为您完成了这项工作,并将其存储在selector
结果对象的属性中。
因此,使用我们的任意 jQuery 对象$obj
,而不是:
$obj.live(event, handler);
我们会改为:
$(document).on(event, $obj.selector, handler);
该属性有一些限制selector
,主要是在链接函数以修改匹配元素集时。举个例子,下面的代码:
var $obj = $('#foo');
console.log($obj.selector); // #foo
console.log($obj.find('a').selector); // #foo a
console.log($obj.children('a').selector); // (an empty string)
正确使用.find()
更新选择器。但是,使用.children()
不会,而是完全删除它(为什么不给#foo > a
...?)。
因此,对于“简单”的 jQuery 对象(即那些仅使用选择器构建的对象),上述方法可以工作。
如果您不知道选择器,那么您可以尝试自己模拟事件委托:
$(document).on(event, function(event) {
if($obj.filter($(event.target).parents().andSelf()).length) {
// do your actions here
}
});
这实质上检查事件的初始目标或其任何祖先是否在您的$obj
jQuery 对象的匹配元素集中,并且仅在这种情况下执行任何操作。
注意:该selector
属性的存在可能记录在 API 中的某处,但我不记得曾经见过它。