深入理解事件冒泡(Bubble)和事件捕捉(capture)


Posted in Javascript onMay 28, 2016

事件的发生顺序

假设在一个元素中又嵌套了另一个元素并且两者都有一个onClick事件处理函数(event handler)。如果用户单击元素2,则元素1和元素2的单击事件都会被触发。但是哪一个事件先被触发?哪一个事件处理函数会被首先执行?换句话说,事件的发生顺序到底如何?如下图是当点击span元素区域是,三个点击事件都会被触发,但是先后顺序是怎样的呢?

<div onclick="func1">
   <p onclick="func2">
     <span onclick=""func3>
     </span>
   </p>
 </div>

两种模型

对于这个事件的处理顺序上,Netscape和微软有两种截然不同的处理方法:

•Netscape主张事件会从最外层开始发生,直到最具体的元素,这种事件发生顺序被称为捕获型

•微软则保持事件从最内部元素开始发生,然后一直向上传播,这种事件顺序被称为冒泡型

这两种事件顺序是截然相反的。Explorer浏览器只支持冒泡事件,Mozilla,Opera7和Konqueror两者都支持。而更古老的opera和iCab两者都不支持

w3c

任何发生在w3c事件模型中的事件,首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段。

对于正常的web开发,可以选择是在捕获阶段还是冒泡阶段绑定事件处理函数,这是通过addEventListener()方法实现的,如果这个函数的useCapture参数是true,则在捕获阶段绑定函数,反之false,在冒泡阶段绑定函数。

element.addEventListener(event, function, useCapture)

阻止冒泡

在正常的开发过程中,如果想要阻止事件的传播,通过一个方法实现。

在微软的模型中,你必须设置事件的cancelBubble的属性为true

window.event.cancelBubble = true

在w3c模型中你必须调用事件的stopPropagation()方法

e.stopPropagation()

通过调用这些方法会阻止所有冒泡向外传播。跨浏览器解决方案:

function doSomething(e) {
  if (!e) {
    var e = window.event;
    e.cancelBubble = true;
  }
  if (e.stopPropagation) {
    e.stopPropagation();
  }
}

以上这篇深入理解事件冒泡(Bubble)和事件捕捉(capture)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习jquery之一
Apr 27 Javascript
js multiple全选与取消全选实现代码
Dec 04 Javascript
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
jquery无缝向上滚动实现代码
Mar 29 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
angular中使用Socket.io实例代码
Jun 03 Javascript
React中jquery引用的实现方法
Sep 12 jQuery
浅谈React的最大亮点之虚拟DOM
May 29 Javascript
详解Vue demo实现商品列表的展示
May 07 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 #Javascript
jQuery Mobile动态刷新页面样式的实现方法
May 28 #Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 #Javascript
jQuery操作动态生成的内容的方法
May 28 #Javascript
javascript 用函数实现继承详解
May 28 #Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 #Javascript
jQuery实现布局高宽自适应的简单实例
May 28 #Javascript
You might like
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
Python3搜索及替换文件中文本的方法
2015/05/22 Python
浅谈Python中的私有变量
2018/02/28 Python
Python扩展内置类型详解
2018/03/26 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
春风行动实施方案
2014/03/28 职场文书
党课培训主持词
2014/04/01 职场文书
《画》教学反思
2014/04/14 职场文书
经济管理自荐书
2014/06/09 职场文书
环境科学专业求职信
2014/08/04 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
新郎结婚感言
2015/07/31 职场文书
修辞手法有哪些?
2019/08/29 职场文书