事件捕获与事件冒泡
- 对一个多级元素,分别给每级设置监听函数,点击最里层元素的时候,监听函数调用顺序?
- 浏览器同时支持两种调用顺序:首先从外向内看,然后从内向外调看
- 有监听函数就调用,并提供事件信息,没有就跳过

事件捕获
事件冒泡
事件绑定API
divClassName.attachEventListener('click',fn,bool);
- divClassName.attachEventListener(e,fn,bool);(e对象被传给所有的监听函数,事件结束后,e对象就不存在了 )
target和currentTarget的区别
- e.target是指用户操作的元素
- e.currentTarget是程序员监听的元素
- 举例
- div>span{文字},用户点击文字
- e.target是span
- e.currentTarget是div
一个特例
- 只有一个div被监听(不考虑父子同时被监听)
- fn分别在捕获阶段和冒泡阶段监听click事件
- 用户点击的元素就是开发者监听的
- ⭐这种情况下,不分冒泡和捕获的顺序,谁的监听事件写在前面就执行谁。
取消冒泡
事件
事件委托
- 原理:利用事件的冒泡原理
- 通俗来说,就是把一个元素响应事件的函数委托到另一个元素(一般是该元素的祖先元素)。真正绑定事件的元素是外层元素,当事件响应到需要绑定的元素上时,会通过冒泡机制从而触发它外层元素绑定的函数,然后执行。
- 如果要确定绑定某个元素,可以配合matches函数和if-else来触发事件。
- 也可以通过内到外递归的方式,要绑定的元素在指定范围内向上查找父级元素,直到到代理事件的函数
事件委托的实现
<ul id="list">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
......
<li>item n</li>
</ul>
- 实现功能:把 #list 下的 li 元素的事件代理委托到它的父层元素也就是 #list 上:
document.getElementById('list').addEventListener('click', function (e) {
var event = e;
var target = event.target;
if (target.nodeName.toLocaleLowerCase === 'li') {
console.log('the content is: ', target.innerHTML);
}
});
优点
学习dom过程中的相关实践
自己尝试封装的dom库函数