深入理解事件冒泡(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 相关文章推荐
一个判断email合法性的函数[非正则]
Dec 09 Javascript
JQuery 前台切换网站的样式实现
Jun 22 Javascript
xml 封装与解析(javascript和C#中)
Jul 26 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
Feb 19 Javascript
基于jquery实现图片放大功能
May 07 Javascript
jQuery中Find选择器用法示例
Sep 21 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
JS脚本实现网页自动秒杀点击
Jan 11 Javascript
解决angularjs中同步执行http请求的方法
Aug 13 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
Sep 28 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 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学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
在视频前插入广告
2006/11/20 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
实例详解Node.js 函数
2018/06/10 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
pycharm 使用心得(三)Hello world!
2014/06/05 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
老公保证书范文
2014/04/29 职场文书
MySQL约束超详解
2021/09/04 MySQL