给100个按钮添加点击事件

答:监听这 100 个按钮的祖先,等冒泡的时候判断 target 是不是这 100 个按钮中的一个

  1. div1.addEventListener('click',(e)=>{
  2. const t = e.target
  3. if(t.tagName.toLowerCase() === 'button'){
  4. console.log('button 被点击了')
  5. console.log('button data-id 是'+t.dataset.id)
  6. }
  7. })

代码:http://js.jirengu.com/yexex/1/edit?html,js,output

冒泡允许我们利用事件委托——这个概念依赖于这样一个事实,如果你想要在大量子元素中单击任何一个都可以运行一段代码,你可以将事件监听器设置在其父节点上,并让子节点上发生的事件冒泡到父节点上,而不是每个子节点单独设置事件监听器。

一个很好的例子是一系列列表项,如果你想让每个列表项被点击时弹出一条信息,你可以将click单击事件监听器设置在父元素<ul>上,这样事件就会从列表项冒泡到其父元素<ul>上。

  1. <ul id="parent-list">
  2. <li id="post-1">Item 1</li>
  3. <li id="post-2">Item 2</li>
  4. <li id="post-3">Item 3</li>
  5. <li id="post-4">Item 4</li>
  6. <li id="post-5">Item 5</li>
  7. <li id="post-6">Item 6</li>
  8. </ul>
  1. document.getElementById("parent-list").addEventListener("click", function(e) {
  2. // e.target is the clicked element!
  3. // If it was a list item
  4. if(e.target && e.target.nodeName == "LI") {
  5. // List item found! Output the ID!
  6. console.log("List item ", e.target.id.replace("post-", ""), " was clicked!");
  7. }
  8. });

优点:
省监听数(内存)
可以监听动态元素(要监听的元素还没创建)

将事件委托封装

  1. on: function(element, eventType, selector, fn) {
  2. element.addEventListener(eventType, e => {
  3. let el = e.target
  4. while (!el.matches(selector)) {
  5. if (element === el) {
  6. el = null
  7. break
  8. }
  9. el = el.parentNode
  10. }
  11. el && fn.call(el, e, el)
  12. })
  13. return element
  14. },

参考文章:
https://davidwalsh.name/event-delegate
MDN | 事件委托
轮子