JS中事件冒泡和事件捕获介绍


Posted in Javascript onDecember 13, 2016

谈起JavaScript的 事件,事件冒泡、事件捕获、阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免。
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。
事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。

1、冒泡事件:

事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。通俗来讲就是,就是当设定了多个div的嵌套时;即建立了父子关系,当父div与子div共同加入了onclick事件时,当触发了子div的onclick事件后,子div进行相应的js操作,但是父div的onclick事件同样会被触发。

html:

<div>
 <input type="button" value="测试事件冒泡" />
</div>

js:

var $input = document.getElementsByTagName("input")[0];
   var $div = document.getElementsByTagName("div")[0];
   var $body = document.getElementsByTagName("body")[0];
 
   $input.onclick = function(e){
      this.style.border = "5px solid red"
      var e = e || window.e;
      alert("red")
   }
   $div.onclick = function(e){
      this.style.border = "5px solid green"
      alert("green")
   }
   $body.onclick = function(e){
      this.style.border = "5px solid yellow"
      alert("yellow")
   }

效果:依次弹出”red“,"green","yellow"。这就是事件冒泡:触发button这个元素,却连同父元素绑定的事件一同触发。

2、阻止事件冒泡

如果对input的事件绑定改为:

$input.onclick = function(e){
  this.style.border = "5px solid red"
  var e = e || window.e;
  alert("red")
  e.stopPropagation();
}

这个时候只会弹出”red“,因为阻止了事件冒泡。

3、事件捕获:

从顶层元素到目标元素或者从目标元素到顶层元素,和事件冒泡是一个相反的过程。事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。

$input.addEventListener("click", function(){
  this.style.border = "5px solid red";
  alert("red")
}, true)
$div.addEventListener("click", function(){
  this.style.border = "5px solid green";
  alert("green")
}, true)
$body.addEventListener("click", function(){
  this.style.border = "5px solid yellow";
  alert("yellow")
}, true)

这个时候依次弹出”yellow“,"green","red"。这就是事件的捕获。 

如果把addEventListener方法的第三个参数改成false,则表示只在冒泡的阶段触发,弹出的依次为:”red“,"green","yellow"。这是因为在W3C模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。

程序员可以自己选择绑定事件时采用事件捕获还是事件冒泡,方法就是绑定事件时通过addEventListener函数,它有三个参数,第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

ele.addEventListener('click',doSomething2,true)
true=捕获
false=冒泡

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
JS 遮照层实现代码
Mar 31 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 Javascript
怎么选择Javascript框架(Javascript Framework)
Nov 22 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
Jan 14 Javascript
JavaScript核心语法总结(推荐)
Jun 02 Javascript
js实现上传文件添加和删除文件选择框
Oct 24 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
Mar 28 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
浅谈react前后端同构渲染
Sep 20 Javascript
JS同步、异步、延迟加载的方法
May 05 Javascript
vue中的计算属性和侦听属性
Nov 06 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 #Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 #Javascript
浅析Jquery操作select
Dec 13 #Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 #Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 #Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 #Javascript
JS实现图片垂直居中显示小结
Dec 13 #Javascript
You might like
处理php自动反斜杠的函数代码
2010/01/05 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
PDO::_construct讲解
2019/01/27 PHP
js控制CSS样式属性语法对照表
2012/12/11 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
python 列表降维的实例讲解
2018/06/28 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
个人作风建设心得体会
2014/10/22 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
PHP新手指南
2021/04/01 PHP
详解JS ES6编码规范
2021/05/07 Javascript
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫