给100个按钮添加点击事件
答:监听这 100 个按钮的祖先,等冒泡的时候判断 target 是不是这 100 个按钮中的一个
div1.addEventListener('click',(e)=>{const t = e.targetif(t.tagName.toLowerCase() === 'button'){console.log('button 被点击了')console.log('button data-id 是'+t.dataset.id)}})
代码:http://js.jirengu.com/yexex/1/edit?html,js,output
冒泡允许我们利用事件委托——这个概念依赖于这样一个事实,如果你想要在大量子元素中单击任何一个都可以运行一段代码,你可以将事件监听器设置在其父节点上,并让子节点上发生的事件冒泡到父节点上,而不是每个子节点单独设置事件监听器。
一个很好的例子是一系列列表项,如果你想让每个列表项被点击时弹出一条信息,你可以将click单击事件监听器设置在父元素<ul>上,这样事件就会从列表项冒泡到其父元素<ul>上。
<ul id="parent-list"><li id="post-1">Item 1</li><li id="post-2">Item 2</li><li id="post-3">Item 3</li><li id="post-4">Item 4</li><li id="post-5">Item 5</li><li id="post-6">Item 6</li></ul>
document.getElementById("parent-list").addEventListener("click", function(e) {// e.target is the clicked element!// If it was a list itemif(e.target && e.target.nodeName == "LI") {// List item found! Output the ID!console.log("List item ", e.target.id.replace("post-", ""), " was clicked!");}});
优点:
省监听数(内存)
可以监听动态元素(要监听的元素还没创建)
将事件委托封装
on: function(element, eventType, selector, fn) {element.addEventListener(eventType, e => {let el = e.targetwhile (!el.matches(selector)) {if (element === el) {el = nullbreak}el = el.parentNode}el && fn.call(el, e, el)})return element},
