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 相关文章推荐
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
用Javascript实现Windows任务管理器的代码
Mar 27 Javascript
jquery1.9 下检测浏览器类型和版本的方法
Dec 26 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
Mar 26 Javascript
zepto.js 实时监听输入框的方法
Dec 04 Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
解决echarts echarts数据动态更新和dataZoom被重置问题
Jul 20 Javascript
详解JavaScript中的链式调用
Nov 27 Javascript
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
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学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
php中执行系统命令的方法
2015/03/21 PHP
PHP7多线程搭建教程
2017/04/21 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
js实现进度条的方法
2015/02/13 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
python实现无证书加密解密实例
2014/10/27 Python
Python求出0~100以内的所有素数
2018/01/23 Python
python实现IOU计算案例
2020/04/12 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
怎样声明子类
2013/07/02 面试题
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
法制宣传月活动方案
2014/05/11 职场文书
师德模范事迹材料
2014/06/03 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
个人委托书范本
2014/09/13 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
惊天动地观后感
2015/06/10 职场文书