深入理解事件冒泡(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 相关文章推荐
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
javascript:json数据的页面绑定示例代码
Jan 26 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 Javascript
三种带箭头提示框总结实例
Jun 14 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
Apr 12 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
深入理解vue-class-component源码阅读
Feb 18 Javascript
layui实现数据表格点击搜索功能
Mar 26 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
Sep 23 Javascript
Vue脚手架编写试卷页面功能
Mar 17 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
dedecms中常见问题修改方法总结
2007/03/21 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
关于JavaScript的一些看法
2009/05/27 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
python3 拼接字符串的7种方法
2018/09/12 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
Flask框架web开发之零基础入门
2018/12/10 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
详解python中__name__的意义以及作用
2019/08/07 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
Python控制台实现交互式环境执行
2020/06/09 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
三关爱志愿服务活动方案
2014/08/17 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年纠风工作总结
2014/12/08 职场文书
创先争优承诺书
2015/01/20 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书