$(document).on('click','#id',function(){})vs $('#id')。on('click',function(){})[关闭]


82

我试图找出两者之间的区别

$(document).on('click', '#id', function(){});

$('#id').on('click', function(){});

我无法找到有关两者之间是否有任何区别的信息,如果有的话,那有什么区别。

有人可以解释一下是否有任何区别吗?


2
您是否阅读过文档或在此站点上进行过搜索。应该有几百万个答案可供选择?
adeneo

9
尽管事实清楚地记录了这一点,但您仍然会得到“饥饿的河马”的回答。第一个代码是“单击文档时,如果它的ID为#id,则触发此代码”。第二个提示是“单击ID为#id的当前存在的任何内容时,触发此代码”。第一个用于将事件分配给当时不存在但将来会使用的元素。第二个将不会为以后添加的任何元素触发。
恢复莫妮卡·塞利奥(Monica Cellio)2013年

6
我确实做到了,但显然还不够彻底。搜索很难,因为我不知道要搜索什么。我不知道这叫什么。
斯蒂芬,2013年

1
在的文档中对此进行了说明on()。要做很多阅读工作即可:)
恢复莫妮卡·塞利奥(Monica Cellio)

8
如果应该以不具建设性的方式关闭该文件,或者因为存在针对它的文档而关闭该文件,那么应该关闭大约99.9%的stackoverflow问题,在这种情况下,如果发现余下的0.1%可能会倒闭,请您好运。贬义的“饥饿的河马”这一说法也是如此。
cesoid

Answers:


68

第一个示例演示事件委托。事件处理程序绑定到DOM树上方的一个元素(在本例中为document),并在事件到达某个元素(源于与选择器匹配的元素)到达该元素时执行。

这是可能的,因为大多数DOM事件都从起源点冒泡到树上。如果您单击该#id元素,则会生成一个click事件,该事件将在所有祖先元素之间冒泡(注意:实际上,在此之前存在一个阶段,称为“捕获阶段”,当事件从树上下降到目标)。您可以在任何这些祖先上捕获事件。

第二个示例将事件处理程序直接绑定到元素。事件仍然会冒泡(除非您在处理程序中阻止该事件),但是由于处理程序已绑定到目标,因此您将看不到此过程的效果。

通过委派事件处理程序,可以确保对绑定时DOM中不存在的元素执行该事件处理程序。如果您的#id元素是在第二个示例之后创建的,则处理程序将永远不会执行。通过绑定到您知道在执行时肯定在DOM中的元素,可以确保处理程序实际上将附加到某些东西上,并可以在以后适当时执行。


1
我想知道哪个代表更快。我想提高我的jquery代码的质量。由于DOM的委派事件比#Element的委派事件花了一点时间。请分享你的想法
阿伦摹

1
@James Allardice-使用后一种方法,$(document).on('click', $('#id'), function()...如何使用$(this)引用$('#id')$(this)目前正在引用document-据我了解。
cheshireoctopus

13

考虑以下代码

<ul id="myTask">
  <li>Coding</li>
  <li>Answering</li>
  <li>Getting Paid</li>
</ul>

现在,区别就在这里

// Remove the myTask item when clicked.
$('#myTask').children().click(function () {
  $(this).remove()
});

现在,如果我们再次添加myTask怎么办?

$('#myTask').append('<li>Answer this question on SO</li>');

单击此myTask项不会将其从列表中删除,因为它没有绑定任何事件处理程序。如果相反,我们将使用.on,那么新项目就可以正常工作了。.on版本的外观如下:

$('#myTask').on('click', 'li', function (event) {
  $(event.target).remove()
});

概要:

与之间的区别是,当与事件关联的DOM元素在以后动态添加时,可能不会起作用;而在与调用关联的DOM元素可能在稍后的位置动态生成的情况下,可以使用.on()和之间的区别。.click().click().click().on().on()


Bhushan,是否有理由使用前者而不是后者?
肖恩·玛盖尔

@SzilardMagyar我想我已经回答了,在我的答案的摘要部分..
普山Firake

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.