JavaScript中捕获/阻止捕获、冒泡/阻止冒泡

事件流描述的是从页面中接收事件的顺序。提出事件流概念的正是IE和Netscape,但是前者提出的是我们常用的事件冒泡流,而后者提出的是事件捕获流。
第一部分:事件冒泡
即事件开始由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档)。
下面举一个简单的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bubble</title>
<style>
button{
background: red;
color:white;
}
#third{
width: 50px;
height: 50px;
border:thin solid red;
}
#second{
width: 100px;
height: 100px;
border:thin solid red;
}
#first{
width:200px;
height: 200px;
border:thin solid red;
}
</style>
</head>
<body>
<div id="first">
<div id="second" >
<div id="third" >
<button id="button">事件冒泡</button>
</div>
</div>
</div>
<script>
document.getElementById("button").addEventListener("click",function(){
alert("button");
},false);
document.getElementById("third").addEventListener("click",function(){
alert("third");
},false);
document.getElementById("second").addEventListener("click",function(){
alert("second");
},false);
document.getElementById("first").addEventListener("click",function(){
alert("first");
},false);
</script>
</body>
</html>
这时,我们只点击button元素,效果如下:
可以看到,虽然我们只点击了button元素,但是,button外的third、second、first上的事件由内向外以此被触发,触发的顺序是由DOM树的下层到DOM树的最上面,故称为冒泡。
(说明:尽管这里我使用了DOM2级事件处理程序,并设置每个事件为冒泡阶段发生,但是即使使用DOM0级,得到的结果也是这样的,冒泡是默认的)
但是如果我们不希望事件冒泡呢?那么如何阻止事件冒泡?
实际上,事件的对象有一个stopPropagation()方法可以阻止事件冒泡,我们只需要把上个例子中button的事件处理程序修改如下:
document.getElementById("button").addEventListener("click",function(event){
alert("button");
event.stopPropagation();
},false);
这样,点击button后,只会弹出一个弹窗,显示button。
注意:现代所有的浏览器都支持事件冒泡,只是在实现上有一些差别。
第二部分:事件捕获
事件捕获和事件冒泡是刚好相反的,事件捕获是指不太具体的节点应该更早的接收到事件,而最具体的节点应该最后接收到事件。举例如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bubble</title>
<style>
button{
background: red;
color:white;
}
#third{
width: 50px;
height: 50px;
border:thin solid red;
}
#second{
width: 100px;
height: 100px;
border:thin solid red;
}
#first{
width:200px;
height: 200px;
border:thin solid red;
}
</style>
</head>
<body>
<div id="first">
<div id="second" >
<div id="third" >
<button id="button">事件冒泡</button>
</div>
</div>
</div>
<script>
document.getElementById("button").addEventListener("click",function(){
alert("button");
},true);
document.getElementById("third").addEventListener("click",function(){
alert("third");
},true);
document.getElementById("second").addEventListener("click",function(){
alert("second");
},true);
document.getElementById("first").addEventListener("click",function(){
alert("first");
},true);
</script>
</body>
</html>
大家可以看到这个例子我只是把addEventListener()方法的第三个参数由前面例子的false修改为了true,也就是使用捕获方式获得button,那么结果如下:
我们可以看到最外层的事件先被触发,最后才是我们点击的button事件被触发,这便是事件捕获。
那么我们如何才能阻止事件的捕获呢?使用event.stopPropagation()方法吗?答案是否定的,这里要知道,stopPropagation()方法只能阻止事件的冒泡,而不能阻止事件捕获。
但是我们可以使用DOM3级新增事件stopImmediatePropagation()方法来阻止事件捕获,另外此方法还可以阻止事件冒泡。应用如下:
document.getElementById("second").addEventListener("click",function(){
alert("second");
event.stopImmediatePropagation();
},true);
这样,就可以在id为second处阻止事件的捕获了。
注意:尽管这是Netscape Navigator提出的事件流,但是现在所有的浏览器都支持这种事件流模型。但是由于老的浏览器不支持,所以很少有人使用事件捕获。
第三部分:DOM事件流
DOM2级事件规定的时间流包括 三个阶段:
注意:在DOM事件流中,实际的目标在捕获阶段不会接收到事件,下一个阶段是处于目标阶段,这时事件被触发,最后进入事件冒泡阶段。我们认为处于目标阶段是事件冒泡阶段的一部分。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# JavaScript中捕获与冒泡
# JavaScript中捕获与冒泡详解
# JS中捕获与冒泡
# 浅谈javascript中的事件冒泡和事件捕获
# JS中事件冒泡和事件捕获介绍
# javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
# js事件冒泡、事件捕获和阻止默认事件详解
# javascript事件冒泡和事件捕获详解
# js之事件冒泡和事件捕获详细介绍
# JS冒泡事件与事件捕获实例详解
# js冒泡、捕获事件及阻止冒泡方法详细总结
# JS中绑定事件顺序(事件冒泡与事件捕获区别)
# js事件冒泡与事件捕获详解
# 可以看到
# 的是
# 这是
# 还可以
# 才是
# 不太
# 是由
# 是指
# 只需
# 上有
# 是从
# 我们可以
# 要把
# 只会
# 希望能
# 弹出
# 要知道
# 不支持
# 所示
# 向外
相关文章:
教学网站制作软件,学习*后期制作的网站有哪些?
行程制作网站有哪些,第三方机票电子行程单怎么开?
网站制作价目表怎么做,珍爱网婚介费用多少?
装修招标网站设计制作流程,装修招标流程?
建站之星如何开启自定义404页面避免用户流失?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何在Windows服务器上快速搭建网站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
简单实现Android验证码
如何选择高效便捷的WAP商城建站系统?
TestNG的testng.xml配置文件怎么写
如何在云虚拟主机上快速搭建个人网站?
javascript基本数据类型及类型检测常用方法小结
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
再谈Python中的字符串与字符编码(推荐)
建站之星下载版如何获取与安装?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
婚礼视频制作网站,学习*后期制作的网站有哪些?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
如何在橙子建站中快速调整背景颜色?
建站上市公司网站建设方案与SEO优化服务定制指南
如何快速搭建自助建站会员专属系统?
如何通过西部数码建站助手快速创建专业网站?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
建站主机如何选?性能与价格怎样平衡?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
广州美橙建站如何快速搭建多端合一网站?
如何通过虚拟机搭建网站?详细步骤解析
高防服务器如何保障网站安全无虞?
宁波免费建站如何选择可靠模板与平台?
建站之星如何助力网站排名飙升?揭秘高效技巧
公司网站制作价格怎么算,公司办个官网需要多少钱?
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何选择香港主机高效搭建外贸独立站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
如何在宝塔面板创建新站点?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
全景视频制作网站有哪些,全景图怎么做成网页?
如何选择高效可靠的多用户建站源码资源?
清除minerd进程的简单方法
建站主机选虚拟主机还是云服务器更好?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何基于云服务器快速搭建网站及云盘系统?
建站之星代理平台如何选择最佳方案?
*请认真填写需求信息,我们会在24小时内与您取得联系。