JavaScript事件冒泡与事件捕获实例分析


Posted in Javascript onAugust 01, 2018

本文实例讲述了JavaScript事件冒泡与事件捕获。分享给大家供大家参考,具体如下:

1、事件冒泡

在一个对象上触发某类事件,如onclick事件等,在其祖先节点上也会依次触发该事件。

<body onclick="alert('body')">
  <div onclick="alert('div')">
    <a href="" onclick=" rel="external nofollow" alert('a')">事件冒泡</a>
  </div>
</body>

依次输出:a、div、body

注意:不是所有的事件都能冒泡。blurfocusloadunload等事件不冒泡。

2、阻止事件冒泡

若只希望事件发生在该子元素而不是在它的祖先元素上,则需要阻止事件冒泡。

IE浏览器和其他浏览器阻止事件冒泡的方式不同:

function stopBubble(e){
  if(e && e.stopPropagation)
    e.stopPropagation(); // 非IE浏览器
  else
    window.event.cancelBubble = true; // IE浏览器
}
<div>
  <a href="">事件冒泡</a>
</div>
<script>
  function stopBubble(e){
    if(e && e.stopPropagation)
      e.stopPropagation(); // 非IE浏览器
    else
      window.event.cancelBubble = true; // IE浏览器
  }
  document.getElementsByTagName("body")[0].onclick = function(e) {
    stopBubble(e);
    alert('body');
  }
  document.getElementsByTagName("div")[0].onclick = function(e) {
    stopBubble(e);
    alert('div');
  }
  document.getElementsByTagName("a")[0].onclick = function(e) {
    stopBubble(e);
    alert('a');
  }
</script>

输出:a

3、事件冒泡与事件捕获

事件捕获:事件从document开始往下查找,直到捕获到事件目标(target)。

事件冒泡:事件从事件目标(target)开始,往上冒泡直到document为止。

传统的element.onclick = doSomething这样的事件绑定,一般采用的是事件冒泡形式。

<div>
  <p>传统的事件冒泡</p>
</div>
<script>
  document.getElementsByTagName("p")[0].onclick = function(e) {
    alert('p');
  };
  document.getElementsByTagName("div")[0].onclick = function(e) {
    alert('div');
  };
</script>

依次输出:p、div

其实,可以选择绑定事件时采用事件捕获还是事件冒泡,方法是绑定事件时通过addEventListener函数,它有3个参数,第3个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡,如element.addEventListener('click', doSomething, true)

<div>
  <p>设置的事件冒泡</p>
</div>
<script>
  document.getElementsByTagName("p")[0].addEventListener('click', function(e) {
    alert('p');
  }, false);
  document.getElementsByTagName("div")[0].addEventListener('click', function(e) {
    alert('div');
  }, false);
</script>

依次输出:p、div

<div>
  <p>设置的事件捕获</p>
</div>
<script>
  document.getElementsByTagName("p")[0].addEventListener('click', function(e) {
    alert('p');
  }, true);
  document.getElementsByTagName("div")[0].addEventListener('click', function(e) {
    alert('div');
  }, true);
</script>

依次输出:div、p

注意:Chrome和Firefox都支持事件捕获和事件冒泡,但IE只支持事件冒泡,不支持事件捕获,也不支持addEventListener函数,提供了另一个函数attachEvent,如ele.attachEvent("onclick", doSomething)

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
执行iframe中的javascript方法
Oct 07 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
Jul 20 Javascript
JavaScript继承方式实例
Oct 29 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
AngularJS基础知识笔记之过滤器
May 10 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
Oct 28 Javascript
详解微信小程序 相对定位和绝对定位
May 11 Javascript
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
js中的reduce()函数讲解
Jan 18 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 Javascript
详解vue-cli中使用rem,vue自适应
May 06 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 #Javascript
create-react-app 修改为多入口编译的方法
Aug 01 #Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 #Javascript
JavaScript执行环境及作用域链实例分析
Aug 01 #Javascript
Vue.js 利用v-for中的index值实现隔行变色
Aug 01 #Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 #Javascript
看看“疫苗查询”小程序有温度的代码
Jul 31 #Javascript
You might like
第一个无线电台是由谁发明的
2021/03/01 无线电
thinkphp模板用法和内容输出实例
2014/11/28 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
python实现简易内存监控
2018/06/21 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Python匿名函数及应用示例
2019/04/09 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
python中的unittest框架实例详解
2021/02/05 Python
Python运算符+与+=的方法实例
2021/02/18 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
师德建设实施方案
2014/03/21 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
化验室岗位职责
2015/02/14 职场文书
婚育证明样本
2015/06/16 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
2019秋季运动会口号
2019/06/25 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS