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 相关文章推荐
网页加载时页面显示进度条加载完成之后显示网页内容
Dec 23 Javascript
web性能优化之javascript性能调优
Dec 28 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
Mar 15 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
May 18 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
利用JS实现scroll自定义滚动效果详解
Oct 17 Javascript
JavaScript实现的反序列化json字符串操作示例
Jul 18 Javascript
Javascript数组及类数组相关原理详解
Oct 29 Javascript
JavaScript实现简单动态表格
Dec 02 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异步执行的详解
2013/06/03 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
checkbox使用示例
2013/08/23 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python求解平方根的方法
2015/03/11 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python2.7安装图文教程
2018/03/13 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
汽车运用工程毕业生自荐信
2013/10/29 职场文书
初中生物教学反思
2014/01/10 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
《凡卡》教学反思
2014/04/09 职场文书
建议书格式
2015/02/04 职场文书
小学国庆节活动总结
2015/03/23 职场文书
灵能百分百第三季什么时候来?
2022/03/15 日漫