深入理解事件冒泡(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 相关文章推荐
在javascript将NodeList作为Array数组处理的方法
Jul 09 Javascript
JQuery中getJSON的使用方法
Dec 13 Javascript
jquery动态加载图片数据练习代码
Aug 04 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
javascript的渐进增强与平稳退化浅谈
Nov 12 Javascript
详解AngularJS中的filter过滤器用法
Jan 04 Javascript
JS批量替换内容中关键词为超链接
Feb 20 Javascript
详解用Node.js写一个简单的命令行工具
Mar 01 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 jQuery
原生JavaScript实现的无缝滚动功能详解
Jan 17 Javascript
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
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的简单采集数据入库程序
2014/07/30 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
Python实现全角半角字符互转的方法
2016/11/28 Python
python的Tqdm模块的使用
2018/01/10 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
python3 字符串知识点学习笔记
2020/02/08 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
美国在线家具网站:GDFStudio
2021/03/13 全球购物
给领导的检讨书
2014/02/16 职场文书
班组长竞聘书
2014/03/31 职场文书
身边的榜样活动方案
2014/08/20 职场文书
股指期货心得体会
2014/09/10 职场文书
整改落实自查报告
2014/11/05 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python