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 相关文章推荐
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
Jan 15 Javascript
javaScript中with函数用法实例分析
Jun 08 Javascript
JavaScript中各种引用类型的常用操作方法小结
May 05 Javascript
Three.js入门之hello world以及如何绘制线
Sep 25 Javascript
详解vue中axios的封装
Jul 18 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
Sep 15 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
JS实现简易计算器
Feb 14 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 Javascript
原生js实现日期选择插件
May 21 Javascript
vue实现图片按比例缩放问题操作
Aug 11 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
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
Python实现类继承实例
2014/07/04 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
Python之py2exe打包工具详解
2017/06/14 Python
python psutil库安装教程
2018/03/19 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
python字典的常用方法总结
2019/07/31 Python
python创建学生成绩管理系统
2019/11/22 Python
Python列表切片常用操作实例解析
2020/03/10 Python
django配置app中的静态文件步骤
2020/03/27 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
自我评价的范文
2014/02/02 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
单位综合评价意见
2015/06/05 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
vue ref如何获取子组件属性值
2022/03/31 Vue.js
Go并发4种方法简明讲解
2022/04/06 Golang
Redis+AOP+自定义注解实现限流
2022/06/28 Redis
Java获取字符串编码格式实现思路
2022/09/23 Java/Android