Event delegation
事件代理
<div id="div1">
<a href="#">a1</a>
<a href="#">a2</a>
<a href="#">a3</a>
<a href="#">a4</a>
</div>
<button>
click to add more a
</button>
const div1 = document.getElementById('div1')
div1.addEventListener('click',e=>{
const target = e.target
if(e.nodeName === 'A'){
alert(target.innerHTML)
}
})
代码简洁
减少浏览器内存使用
但是不要滥用
通用的事件绑定函数
function bindEvent(elem,type,selector,fn){
if(fn == null){
fn = selector
selector = null
}
elem.addEventListener(type,e=>{
let target
if(selector){
//需要代理
target = e.target
if(target.matches(selector)){
fn.call(target,e)
}
}else{
//不需要代理
fn.call(target,e)
}
})
}
描述事件冒泡的流程
- 基于DOM树形结构
- 事件会顺着触发元素向上冒泡
- 应用场景:代理
无限下拉图片列表,如何监听每个图片的点击
1.事件代理
2.用e.target获取触发元素
3.用matches来判断是否判断元素