将大量元素事件监听器委托给 document.body 是不是很疯狂?

Ada*_*ant 5 javascript events dom-events

在阅读了有关最佳性能 JavaScript 的文章后,我了解到最好尽量减少与 DOM 的交互,并更多地依赖 JavaScript 本身的逻辑。

其中一部分是对元素列表使用单个事件侦听器并读取点击目标,而不是对每个元素使用一个事件侦听器

ul#menu
  li#one One
  li#two Two
  li#three Three

$ul = document.getElementById('#menu')
$ul.addEventListener('click', function(e) {
  if (e.target.id == ...) { ... } // You get the idea
})
Run Code Online (Sandbox Code Playgroud)

我有一个网站,有几个导航栏、几个下拉按钮等。那么为什么不在主体上创建一个事件侦听器并只查看事件目标呢?

document.body.addEventListener('click', function(e) {
  if (e.target.id == ...) { ... };
})
Run Code Online (Sandbox Code Playgroud)

从技术角度我无法判断这个解决方案有什么问题。有些东西对我来说似乎太重了,它有一种代码的味道。

这在移动设备上会有问题吗?DOM 含量高的本质是否<body>最终对性能造成的损害大于好处?

没有使用 jQuery,请建议纯 JS 解决方案。

小智 4

在阅读了有关最佳性能 JavaScript 的文章后,我了解到最好尽量减少与 DOM 的交互,并更多地依赖 JavaScript 本身的逻辑。

我不确定这意味着什么。无论它做什么,您是否也阅读过有关何时担心优化的部分(稍后,或永远,或当您确实必须时)?

其中一部分是对元素列表使用单个事件侦听器并读取点击目标,而不是对每个元素使用一个事件侦听器

这是一种最适用于以下情况的模型:您有一百个<li>元素要侦听事件,因此您不必将事件处理程序附加到每个元素,而是将一个事件处理程序附加到<ul>. 就我个人而言,我不相信这样做有这么大的好处,但无论如何,这就是逻辑。

这可能有益的原因有两个:

  1. 只有一个事件处理程序占用内存,而不是 100 个。在当今时代,这不太令人信服。

  2. 添加新元素时,无需显式向它们添加事件处理程序,因为事件处理程序已在其祖先上就位。这确实可以使程序逻辑更简单。

然而,将其扩展到将一个主事件处理程序放在主体上就太过分了。正如一位评论者提到的,该事件处理程序中的逻辑最终将成为一大堆意大利面条。

一个好的基本规则是将事件处理程序放在所涉及的元素上,或者放在附近的祖先父元素上,以便在多个子元素/后代元素上以相同或相似的方式处理事件。

所以你的“这疯了吗”问题的答案是,是的