gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:14:03 25 4
gpt4 key购买 nike

在阅读了关于性能最佳的 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
})

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

document.body.addEventListener('click', function(e) {
if (e.target.id == ...) { ... };
})

我无法从技术 Angular 判断这个解决方案有什么问题。有些东西对我来说太重了,它有一股代码味。

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

没有使用 jQuery,请推荐纯 JS 解决方案。

最佳答案

After reading about optimally-performing JavaScript, I learned it's best to minimize interaction with the DOM, and rely more on the logic within JavaScript itself.

我不确定这是什么意思。无论它做什么,您是否还阅读了有关何时担心优化(稍后、从不或何时真正需要)的部分?

Part of this is using a single event listener for a list of elements and reading the click target, rather than an event listener for each and every one

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

这有两个好处:

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

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

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

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

所以对于“这疯狂吗”这个问题的答案是,

关于javascript - 将大量元素事件监听器委托(delegate)给 document.body 是不是很疯狂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26659058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com