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