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 相关文章推荐
jquery实现预览提交的表单代码分享
May 21 Javascript
javascript操作字符串的原生方法
Dec 22 Javascript
jQuery中noConflict()用法实例分析
Feb 08 Javascript
jQuery实现图片走马灯效果的原理分析
Jan 16 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
Jan 06 Javascript
JavaScript轻松创建级联函数的方法示例
Feb 10 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
Aug 29 Javascript
Vue实现验证码功能
Dec 03 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
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
phpmail类发送邮件函数代码
2012/02/20 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
Python下的twisted框架入门指引
2015/04/15 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
python 穷举指定长度的密码例子
2020/04/02 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
联想中国官方商城:Lenovo China
2017/10/18 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
C#面试题问题集
2016/04/02 面试题
机械工程师求职自我评价
2013/09/23 职场文书
公司门卫岗位职责
2014/03/15 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
Go获取两个时区的时间差
2022/04/20 Golang
如何Python使用re模块实现okenizer
2022/04/30 Python