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实现漂浮在网页右侧的qq在线客服插件示例
May 13 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
javascript数组去重的六种方法汇总
Aug 16 Javascript
javascript实现保留两位小数的多种方法
Dec 18 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 Javascript
angular十大常见问题
Mar 07 Javascript
JS表格组件神器bootstrap table使用指南详解
Apr 12 Javascript
d3.js实现立体柱图的方法详解
Apr 28 Javascript
AngularJS中的promise用法分析
May 19 Javascript
解决vue热替换失效的根本原因
Sep 19 Javascript
vue实现评论列表功能
Oct 25 Javascript
Vue引入Stylus知识点总结
Jan 16 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使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
Ext面向对象开发实践(续)
2008/11/18 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
jquery ztree实现右键收藏功能
2017/11/20 jQuery
layui表格数据重载
2019/07/27 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
综合素质的自我鉴定
2013/10/07 职场文书
高三语文教学反思
2014/01/15 职场文书
导航工程专业自荐信
2014/09/02 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
实现GO语言对数组切片去重
2022/04/20 Golang