【问题标题】:Should I attach my .on('click') event to the document or element我应该将我的 .on('click') 事件附加到文档或元素吗
【发布时间】:2013-07-03 08:34:48
【问题描述】:

昨天我正在阅读 .on() 的 jQuery 文档,其中声明:

避免对大型文档

的委托事件过度使用 document 或 document.body

但是今天,我在看这个JSPERF,发现当点击事件附加到文档时性能更好。

所以现在,我很困惑。性能测试与文档背道而驰?

【问题讨论】:

  • $link附加的点击事件,document只是event.target的监听器

标签: javascript jquery javascript-events


【解决方案1】:

您的 JSPerf 在这里测试附加事件的速度,而不是它们对累积页面性能的影响。这是错误的测试!

Javascript 事件在 DOM 中一直传播到文档根目录。这意味着如果你在document 上有一个on("click", ...) 处理程序,那么文档中每个元素 上的每次点击 都会运行一个事件处理程序,所以jQuery 可以测试其来源是否与委托目标匹配,以查看是否应将其传递给该事件处理程序。

假设您的页面在文档上有 10 个不同的委托事件处理程序,它们都处理各种点击。每次单击页面中的任何元素时,事件都会冒泡到文档根目录,并且必须测试所有 10 个处理程序以确定应该运行哪个(如果有)。

一般来说,您希望您的委托事件在树中尽可能深,同时仍然启用您的功能,因为这会限制可能调用此事件的元素数量,并且您可以更早地处理该事件以防止它发生向上传播 DOM 树。

【讨论】:

    【解决方案2】:

    这取决于。 当然,您可以将处理程序附加到您想要的任何元素,在某些情况下,您必须将其附加到 documentbody(例如,如果您想要定位 all页面上的链接)。但是,如果您确定某些元素将始终仅出现在给定元素(已创建)内 - 那么为了性能起见,您可以将事件处理程序附加到该公共父级。

    【讨论】:

      【解决方案3】:

      重点是过分

      恕我直言,任何 DOM 上的过多委托都是可怕的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 1970-01-01
        • 2016-10-05
        • 1970-01-01
        相关资源
        最近更新 更多