昨天我正在阅读 .on() 的 jQuery 文档,其中指出:
避免过度使用 document 或 document.body 来处理大型文档上的委托事件
但是今天,我正在查看这个JSPERF,我注意到当单击事件附加到文档时性能更好。
所以现在,我很困惑。性能测试与文档相反?
昨天我正在阅读 .on() 的 jQuery 文档,其中指出:
避免过度使用 document 或 document.body 来处理大型文档上的委托事件
但是今天,我正在查看这个JSPERF,我注意到当单击事件附加到文档时性能更好。
所以现在,我很困惑。性能测试与文档相反?
您的 JSPerf 正在测试附加事件的速度,而不是它们对累积页面性能的影响。这是错误的测试!
Javascript 事件沿着 DOM 向上传播到文档根目录。这意味着如果您有一个on("click", ...)
处理程序 on document
,那么每次点击文档中的每个元素都会运行一个事件处理程序,因此 jQuery 可以测试其来源是否与委托目标匹配,以查看是否应将其传递给该事件处理程序.
想象一下,您的页面在文档上有 10 个不同的委托事件处理程序,它们都处理各种点击。每次单击页面中的任何元素时,事件都会冒泡到文档根目录,并且必须测试所有 10 个处理程序以确定应该运行哪个(如果有)。
通常,您希望您的委托事件在树中尽可能深,同时仍然启用您的功能,因为这会限制可能调用此事件的元素数量,并且您可以更早地处理该事件以防止它传播DOM 树。
这取决于。当然,您可以将处理程序附加到您想要的任何元素,并且在某些情况下,您必须将其附加到document
或body
(例如,如果您想要定位页面上的所有链接)。但是,如果您确定某些元素将始终仅出现在给定元素(已创建)内 - 那么为了性能起见,您可以将事件处理程序附加到该公共父级。
过分了。
恕我直言,任何 DOM 上的过多代表都是可怕的