【问题标题】:jQuery: difference between .click() AND .on("click")jQuery:.click() 和 .on("click") 之间的区别
【发布时间】:2025-12-26 10:20:21
【问题描述】:

我经常用

$(selector).click(...

但有些人建议我改用这个:

$(selector).on("click", function(...

$(selector).live("click"...(已弃用)

我阅读了手册,但我的初学者的头脑无法理解它。我对他们使用的所有术语感到困惑。我仍然不知道区别也不知道为什么要使用.on()
http://api.jquery.com/on/

【问题讨论】:

  • 来自文档:“从 jQuery 1.7 开始,.on() 方法提供了附加事件处理程序所需的所有功能。对于旧 jQuery 事件方法的等价物,请参阅 .bind(), .delegate() 和 .live()。”

标签: javascript binding methods jquery


【解决方案1】:

唯一的区别是 .click() 将应用于具有特定选择器的 DOM 中存在的元素(仅已经存在的元素)。
另一方面,.on(selector ,"click",callback); 将应用于与该选择器匹配的所有元素 即使在未来, 让我举个例子:

$('p').click(function(){
$(this).next('<p>this is a copy of the previous paragraph </p>');
});

如果您单击“这是上一个段落的副本”的段落(新段落),您不会得到想要的结果,即在单击的段落旁边添加一个段落,因为它是一开始没有

但是如果你使用

$('p').on("click",function(){
$(this).next('<p>this is a copy of the previous paragraph </p>');
});

你会得到你想要的(因为 .on.delegate 找到匹配的,即使是新的)

【讨论】:

    【解决方案2】:

    在一天结束时,每个事件都绑定到 DOM 中的 some 元素。对于.bind,您直接绑定到jQuery 对象中的元素(或多个元素)。例如,如果您的 jQuery 对象包含 100 个元素,那么您将绑定 100 个事件侦听器。

    .live.delegate.on的情况下,绑定了一个单个事件监听器,通常在DOM树的最顶层节点之一上:documentdocument.documentElement&lt;html&gt; 元素)或document.body。因为 DOM 事件在树中冒泡,所以附加到 body 元素的事件处理程序实际上可以接收来自页面上任何元素的点击事件。因此,您可以只绑定一个,而不是绑定 100 个事件。

    对于少量元素(例如少于五个),直接绑定事件处理程序可能会更快(尽管性能不太可能成为问题)。对于大量元素,请始终使用.on

    .on 的另一个优点是,如果您将元素添加到 DOM,则无需担心将事件处理程序绑定到这些新元素。以 HTML 列表为例:

    <ul id="todo">
      <li>buy milk</li>
      <li>arrange haircut</li>
      <li>pay credit card bill</li>
    </ul>
    

    接下来,一些 jQuery:

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

    现在,如果我们添加一个待办事项呢?

    $('#todo').append('<li>answer all the questions on SO</li>')
    

    单击此待办事项不会将其从列表中删除,因为它没有绑定任何事件处理程序。相反,如果我们使用.on,则新项目将无需我们付出任何额外努力即可工作。以下是.on 版本的外观:

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

    【讨论】:

    • 你为什么使用 $(event.target).remove(); 而不是 $(this).remove();?另外,我在 JSFiddle 中尝试过,但无法正常工作:-( http://jsfiddle.net/u6qWs/1/
    • @Omar 关于event.target 的好点。在我写这篇文章的时候,我不确定this 在传递给.on 的事件处理程序中的绑定。刚刚阅读了该方法的文档,我现在意识到 thisevent.type 在这种情况下将引用同一个对象(但并非在所有情况下)。
    • @Omar .on 方法是在刚刚发布的 jQuery 1.7 中添加的。你的小提琴使用 jQuery 1.6.4。
    • @davidchambers 哎呀!我修好了小提琴。感谢您指出。它还活着!!! http://jsfiddle.net/u6qWs/4/ 顺便说一下,您的样本很棒,但缺少分号“;”在每一行的末尾。
    • 使用上面提到的函数对子“$('#todo').children()”使用click()方法的一点观察将删除子对象本身。因此没有子对象=否事件的对象。另一方面,在#todo 上使用.on 方法不会删除#todo 对象,而是针对所有“li 元素”。我认为这是应该提出的要点。.on click 方法可以将元素作为论据
    【解决方案3】:

    在普通的.click(... 中,如果选择器的目标即时更改(例如通过一些 ajax 响应),那么您需要再次分配行为。

    .live(... 上,该行为将自动重新应用于选择器。

    .on(... 是非常新的(jQuery 1.7),它可以使用委托事件覆盖live 场景,这是一种更快的附加行为方式。

    【讨论】:

    • 所以...如果我克隆一个元素,或者动态使用ajax创建内容,如果我使用.click() 对新内容不起作用,但 .on("click") 会起作用吗?我认为它被称为绑定方法/事件?
    • 还可以使用.on() 使用地图同时附加多个事件。
    • @Omar:是的,假设您正确获得了委托。例如,如果您在表中谈论 trs,那么您需要执行 $("#myTable").on("click", "tr", ...。看看api.jquery.com/on
    • @pedram-behroozi 我什至不知道 jQuery 地图是什么……它使用 GPS? :p。 Aaaaa...如何使用地图同时附加多个事件?
    • @cherouvim 我阅读了 api.jquery.com/on ...但就像我解释的那样,我是一个初学者,不了解他们使用的所有术语。我更困惑了:-(