阅读目录
总结它是描述事件触发时序问题的术语。
事件捕获指的是从 document 到触发事件的那个节点,即自上而下的去触发事件。
相反的,事件冒泡是自下而上的去触发事件。
绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。
true,事件捕获;
false,事件冒泡。
默认false,即事件冒泡。
1、事件冒泡是什么?
先 child,然后 parent。事件的触发顺序自内向外,这就是事件冒泡。
2、事件捕获是什么?
先 parent 然后 child。事件触发顺序变更为自外向内,这就是事件捕获。
3、如何在事件冒泡和事件捕获中切换?
绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。
true,事件捕获;false,事件冒泡。默认false,即事件冒泡。
document.getElementById("parent").addEventListener("click",function(e){
alert("parent事件被触发,"+e.target.id);
},true);
4、如何实现鼠标放到li上对应的 li
背景变灰?
$("li").on("mouseover",function(){
$(this).css("background-color","#ddd").siblings().css("background-color","white");
})
$("ul").on("mouseover",function(e){
$(e.target).css("background-color","#ddd").siblings().css("background-color","white");
})
事件冒泡和事件捕获
听老师讲解事件冒泡和事件捕获机制的时候跟听天书一样,只依稀记得IE使用的是事件冒泡,其他浏览器则是事件捕获。
当时的我,把它当成IE浏览器兼容问题,所以没有深究(IE8以下版本的浏览器已基本退出市场)。工作至今,虽然多次遇到该类问题,但均未深究,始终一知半解,遇到了全TM靠猜(选A不行就选B呗)。今天闲来无事自己做了个 demo,算是把这个问题彻底搞明白了。
先上结论:
他们是描述事件触发时序问题的术语。事件捕获指的是从 document 到触发事件的那个节点,即自上而下的去触发事件。
相反的,事件冒泡是自下而上的去触发事件。
绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。
true,事件捕获;
false,事件冒泡。
默认false,即事件冒泡。
Jquery 的 e.stopPropagation 会阻止冒泡,意思就是到我为止,我的爹和祖宗的哪些事儿我就不管了。
HTML结构
<div id="parent" style="width: 100px;background-color: aliceblue;height: 50px;">
<div id="child" class="child" style="width: 20px;background-color: antiquewhite;height: 20px;"></div>
</div>
<script>
// 现在我们给它们绑定上事件
document.getElementById("parent").addEventListener("click",function(e){
alert("parent事件被触发,"+this.id);
})
document.getElementById("child").addEventListener("click",function(e){
alert("child事件被触发,"+this.id)
})
</script>
现在改变第三个参数的值为 true
document.getElementById("parent").addEventListener("click",function(e){
alert("parent事件被触发,"+e.target.id);
},true)
document.getElementById("child").addEventListener("click",function(e){
alert("child事件被触发,"+e.target.id)
},true)
结论:
先 parent 然后 child。事件触发顺序变更为自外向内,这就是事件捕获。
需求:鼠标放到 li上对应的 li 背景变灰
利用事件冒泡实现
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
</ul>
<script>
// 利用事件冒泡实现
$("ul").on("mouseover",function(e){
$(e.target).css("background-color","#ddd").siblings().css("background-color","white");
})
</script>
直接给所有 li 都绑上事件也可以只要……
$("li").on("mouseover",function(){
$(this).css("background-color","#ddd").siblings().css("background-color","white");
})
这样也行。而且从代码简洁程度上,两者是相若仿佛的。但是,前者少了一个遍历所有li节点的操作,所以在性能上肯定是更优的。
还有就是,如果我们在绑定事件完成后,页面又动态的加载了一些元素……
源码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>事件冒泡</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
</ul>
<script>
$("<li>item7</li>").appendTo("ul");
$("li").on("mouseover",function(){
$(this).css("background-color","#ddd").siblings().css("background-color","white");
})
</script>
</body>
</html>
这时候,第二种方案,由于绑定事件的时候item7还不存在,所以为了效果,我们还要给它再绑定一次事件。而利用冒泡方案由于是给ul绑的事件……
高下立判!
标签:触发,捕获,JavaScript,li,冒泡,background,事件 From: https://blog.51cto.com/u_13571520/6046077