全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript中捕获与冒泡详解及实例

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小时内与您取得联系。