我在jQuery(v1.7)中遇到了一些奇怪的行为:
我正在尝试将事件侦听器设置为一个元素,该元素实际上在某个时候通过 ajax 被替换。
$(document.getElementById('element')).live('click', function() {
// do something on click
});
虽然这适用于其他方法,但 live 方法拒绝运行。当用本机jQuery选择器替换它时,它可以工作。为什么?
$("#element").live('click', function() {
// do something on click
});
live
不是这样工作的。事件冒泡到文档,然后检查事件的target
以查看它是否与选择器匹配。
事件处理程序时,侦听事件的元素可能不存在,因此getElementById
不返回任何内容。
当您考虑live
的语义时,向其传递 DOM 元素是没有意义的。
document.getElementById 正在抓取当前存在的元素。当你用live传递字符串"#id"时,jQuery会在document.body上查找将来的事件,这些事件源自ID与该字符串匹配的元素。
作为旁注,将 .on() 视为 .live() 不仅计算成本高昂,而且已弃用。
我相当确定在第一种情况下,您将一个简单的节点传递给 jQuery 构造函数,这意味着一旦该节点消失,该对象将不再引用任何内容,因此live
无法工作。
另一方面,通过向它传递jQuery选择器,live
可以不断查找具有该ID的元素,即使它被删除,重新添加或以其他方式踢来踢去。
.live()
过滤所有单击事件,以查看哪些事件与您从中创建jQuery对象的选择器匹配。
它与 jQuery 对象中的当前元素无关。
编写$(element).live()
不会执行任何操作,因为没有选择器。
因为live
会将实际事件附加到文档中,这称为委派。
然后,当发生单击时,jQuery 会检查选择器中的元素是否是事件的起源,如果是,则调用您的函数。
虽然 $("#element") 可以查看是否有与选择器匹配的元素,但$(document.getElementById("element));
不能,因为没有选择器,只有一个对象,删除它后会丢失。
原生 JavaScript getElementById 为您提供实际的 DOM 对象,而 jquery 选择器为您提供围绕对象的 jquery 包装器。
我认为.live需要一个jquery包装器才能工作。
此外,您应该使用 .on 或 .delegate,因为 .live 已从 1.7 开始被弃用