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 Event学习第六章 事件的访问
Feb 07 Javascript
基于jquery的图片懒加载js
Jun 30 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
Jul 11 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
javascript获取元素离文档各边距离的方法
Feb 13 Javascript
jQuery插件制作之参数用法实例分析
Jun 01 Javascript
js实现按钮控制带有停顿效果的图片滚动
Aug 30 Javascript
AngularJS+Bootstrap实现多文件上传与管理
Nov 08 Javascript
js实现文本上下来回滚动
Feb 03 Javascript
微信小程序 定位到当前城市实现实例代码
Feb 23 Javascript
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 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 array_merge函数
2014/08/31 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
PHP 裁剪图片
2021/03/09 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
初学Python实用技巧两则
2014/08/29 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
python小项目之五子棋游戏
2019/12/26 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
英国办公用品商店:Office Outlet
2018/04/04 全球购物
工作人员思想汇报
2014/01/09 职场文书
档案信息化建设方案
2014/05/16 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
人与自然的观后感
2015/06/18 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
员工试用期工作总结
2019/06/20 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
PHP实现两种排课方式
2021/06/26 PHP
如何Python使用re模块实现okenizer
2022/04/30 Python