$(“#element”)和$(document.getElementById(“element”))之间的差异?

时间:2012-08-14 23:30:27

标签: jquery live

我在jQuery(v1.7)中遇到了一些奇怪的行为:

我正在尝试将事件侦听器设置为一个实际在某个时候通过ajax替换的元素。

$(document.getElementById('element')).live('click', function() {
    // do something on click
});

虽然这适用于其他方法,但live方法拒绝运行。 当用本机jQuery选择器替换它时,它可以工作。为什么呢?

$("#element").live('click', function() {
    // do something on click
}); 

6 个答案:

答案 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以来已被弃用