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 相关文章推荐
动态加载script文件的两种方法
Aug 15 Javascript
javascript仿php的print_r函数输出json数据
Sep 13 Javascript
js获取元素相对窗口位置的实现代码
Sep 28 Javascript
JS实现往下不断流动网页背景的方法
Feb 27 Javascript
纯javascript制作日历控件
Jul 17 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
使用jQuery给input标签设置默认值
Jun 20 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
Dec 08 Javascript
简单实现jQuery手风琴效果
Aug 18 jQuery
jquery根据name取得select选中的值实例(超简单)
Jan 25 jQuery
vue axios数据请求get、post方法及实例详解
Sep 11 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 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
如何对PHP程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
一个PHP并发访问实例代码
2012/09/06 PHP
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
Python文件的读写和异常代码示例
2017/10/31 Python
selenium+python实现自动登录脚本
2018/04/22 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python Django的web开发实例(入门)
2019/07/31 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
智能钱包:Ekster
2019/11/21 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
大课间活动实施方案
2014/03/06 职场文书
幼儿园见习总结
2015/06/23 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
Python Parser的用法
2021/05/12 Python
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电