深入理解事件冒泡(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删除节点的三个方法即remove()detach()和empty()
Dec 27 Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
jquery实现从数组移除指定的值
Jun 24 Javascript
jquery事件的ready()方法使用详解
Nov 11 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
Dec 02 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
Dec 09 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
async/await地狱该如何避免详解
May 10 Javascript
解决vue中虚拟dom,无法实时更新的问题
Sep 15 Javascript
vue axios封装及API统一管理的方法
Apr 18 Javascript
js实现微信聊天效果
Aug 09 Javascript
prettier自动格式化去换行的实现代码
Aug 25 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
php 学习资料零碎东西
2010/12/04 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
2016/10/21 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
python实现的解析crontab配置文件代码
2014/06/30 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python闭包实现计数器的方法
2015/05/05 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
主管职责范文
2013/11/09 职场文书
《金子》教学反思
2014/04/13 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers