【问题标题】:Are there performance drawbacks to using a delegated event handler in JavaScript and jQuery?在 JavaScript 和 jQuery 中使用委托事件处理程序是否存在性能缺陷?
【发布时间】:2015-09-04 12:02:43
【问题描述】:

我在我的 JavaScript 代码中使用了委托事件处理程序 (jQuery),所以当点击动态添加的按钮时会发生一些事情。

我想知道这是否存在性能缺陷?

// Delegated event handler
$(document).on('click', '#dynamicallyAddedButton', function(){
    console.log("Hello");
});

在性能方面与此相比如何?

// Regular event handler
$("#regularButton").on('click', function(){
    console.log("Hello Again");
});

查看jQuery documentation,似乎事件总是在 DOM 树上冒泡。这是否意味着元素嵌套得越深,事件发生的时间就越长?

编辑:Is there a performance benefit to using JavaScript's event delegation rather than jQuery's? 正在问一个类似的问题,那里的答案很有用。我想知道使用常规事件处理程序和委托事件处理程序之间有什么区别。链接的问题看起来好像事件在不断地冒泡 DOM 树。使用委托事件处理程序,事件是否会冒泡到顶部,然后返回到指定元素?

【问题讨论】:

标签: javascript jquery performance dom


【解决方案1】:

每次您几乎单击文档中的任何位置时,该事件都会手动冒泡到document 元素(在自然冒泡发生之后)并将运行选择器引擎对于单击的元素和document 之间的每个 元素。

因此,如果您单击嵌套 20 个元素深度的元素,则选择器引擎将为该一次单击运行 20 次。

此外,document 拥有的每个选择器都会发生这种情况。因此,如果您给它 20 个选择器并单击 20 个深度元素,则选择器引擎必须为那一次单击运行 400 次。 (当然,手动冒泡只发生一次。)

基于选择器的委托很好,但如果可能的话,尽量让它更接近目标元素。

【讨论】:

  • 那么在委托事件处理程序上,它是否必须冒泡到顶部并返回到指定元素?奇怪的是,如果事件每次被点击时都会冒泡到顶部,那么动态添加的元素就不能有常规的事件处理程序。
  • @jabeoogie:它们可以有常规处理程序,但您需要在创建它们时手动分配它们。 IMO,这不是一个坏主意。还是我误解了你的意思?
  • 概述一下,“冒泡”的发生与分配的任何处理程序无关。它实际上从顶部开始,然后首先下降到event.target。这称为“捕获”阶段。然后它会冒泡回到顶部。这是冒泡阶段。这就是 jQuery 绑定的处理程序被触发的地方。然后 jQuery 手动从 event.target 重新开始,并在循环中针对当前元素测试选择器,向上遍历 .parentNodes 直到到达原始绑定元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2014-05-15
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多