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 07 Javascript
asp.net 30分钟掌握无刷新 Repeater
Sep 16 Javascript
js中文逗号转英文实现
Feb 11 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
基于Vue.js实现数字拼图游戏
Aug 02 Javascript
AngularJS基础 ng-model-options 指令简单示例
Aug 02 Javascript
基于JS实现的随机数字抽签实例
Dec 08 Javascript
jQuery实现一个简单的轮播图
Feb 19 Javascript
详解用vue编写弹出框组件
Jul 04 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
Sep 11 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 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计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
javascript prototype原型操作笔记
2009/12/07 Javascript
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
详解Vue方法与事件
2017/03/09 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Python深入学习之特殊方法与多范式
2014/08/31 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python颜色随机生成器的实例代码
2020/01/10 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
索尼巴西商店:Sony巴西
2019/06/21 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
2014年清明节寄语
2014/04/03 职场文书
合作经营协议书
2014/04/17 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
公司财务部岗位职责
2015/04/14 职场文书
Python 图片添加美颜效果
2022/04/28 Python
Spring中bean集合注入的方法详解
2022/07/07 Java/Android