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 相关文章推荐
js传值 判断
Oct 26 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
Dec 08 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
Jan 11 Javascript
JS取request值以及自动执行使用示例
Feb 24 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
JS实现的RC4加密算法示例
Aug 16 Javascript
原生js实现Flappy Bird小游戏
Dec 24 Javascript
Bootstrap实现模态框效果
Sep 30 Javascript
vue 全局环境切换问题
Oct 27 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 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模板之Phpbean的目录结构
2008/01/10 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
[51:06]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第二场 1月26日
2021/03/11 DOTA
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
Django用户身份验证完成示例代码
2020/04/03 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
应届毕业生应聘自荐信范文
2014/02/26 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
会计学专业求职信
2014/07/17 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
债务纠纷起诉书
2015/05/20 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
好员工观后感
2015/06/17 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Python 高级库15 个让新手爱不释手(推荐)
2021/05/15 Python