一个事件监听器循环元素VS单个元素上的事件监听器?

Posted

技术标签:

【中文标题】一个事件监听器循环元素VS单个元素上的事件监听器?【英文标题】:One event listener looping elements VS event listener on individual elements? 【发布时间】:2021-03-17 15:30:14 【问题描述】:

在文档级别使用一个事件监听器循环元素是否比在单个元素上使用多个事件监听器更高效?

例如:

const elements = []

const logic = (e) =>  /*any logic*/ 

// event listener on individual elements
elements.forEach((el) => el.addEventListener('click', logic))

// one event listener looping elements
document.addEventListener('click', (e) => 
  elements.forEach((el) => 
    if (e.target.isEqualNode(el)) logic(el)
  )
)

另外,有没有人做过任何有效的测量来证明让一个侦听器循环元素比向每个单独的元素添加事件侦听器更有效?

【问题讨论】:

我严重怀疑该选择在 99% 的情况下是否会对性能产生任何影响。选择任何使代码更易于管理的东西,或者其他任何你喜欢的东西 【参考方案1】:

我已经阅读了更多关于此的内容,我认为使用多个 addEventListener 对性能没有任何影响。

总之,人们可能遇到的唯一性能问题是使用匿名函数而不是静态函数。

例如:

const elements = []

elements.forEach((el) => 
  // a new handler is created with each iteration
  el.addEventListener('click', () =>  /* some logic */ ) // anonymous function
)

// static function
const logic = () => 
  /* some logic */


elements.forEach((el) => 
  // result in smaller memory consumption because there is only one handler
  el.addEventListener('click', logic)
)

所以,在循环中使用匿名函数时要小心

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Memory_issues

【讨论】:

以上是关于一个事件监听器循环元素VS单个元素上的事件监听器?的主要内容,如果未能解决你的问题,请参考以下文章

View 元素上的事件监听器

如何将html5画布上的点击事件传递给兄弟画布元素上的事件监听器

在循环中单击另一个元素时将事件侦听器添加到元素

未在 React 中呈现的元素上的触发事件侦听器

如何在 Nativescript-Vue 中直接监听组件根元素上的原生事件?

js常用对象:点击双击onload事件鼠标相关onblur事件和onfocus事件等;通过循环给多个元素添加事件通过addEventListener() 方法 监听事件函数