我已经读到,在文档对象中,有许多单独的事件处理程序分散在它周围,在父节点上执行事件委托,其事件处理程序中event.target
,对性能要好得多。
我只是想知道这如何扩展到所有事件处理。如果整个应用程序位于单个父节点内(例如<div id="app"></div>
单页应用程序),那么仅抓取此顶级节点上的所有事件是否有意义?
在许多情况下,这会提高性能吗?什么时候不会?
想象一个有 10 列和 10 行的表格。 如果为每个单元格添加一个处理程序,则将有 100 个处理程序。 如果每行添加一个处理程序,则将有 10 个处理程序。 如果将处理程序添加到表中,则有 1。
代价是代码复杂性。 每个单元格都有一个处理程序意味着代码非常具体,因为它与单个单元格及其内容有关。 但是在表级别,您必须隔离哪个单元格接收了事件,然后根据单个单元格执行相同的代码。
想象一下,如果您有处理程序在行收到相同事件时也执行某些操作 - 现在,随着您处理不同的情况,您的代码会变得更大、更复杂。
每次事件在父元素中发生时,该代码都会运行,而这种额外的复杂性很快就会妨碍。 为什么要通过 10 次代码检查来运行一个用例。 触发事件处理程序更接近事件发生的位置会删除大部分附加逻辑。
这曾经确实是一个问题,因为每个表单元格的处理程序可能会迅速耗尽较大表上的内存(我正在看你 IE6)。 但是浏览器现在在这方面做得更好,所以它更多地变成了组织代码以提高可读性、理解、维护和性能的问题。 (性能仍然是一个因素...