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关于图形报表的运用实现代码
Jan 06 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 Javascript
JavaScript实现图片DIV竖向滑动的方法
Apr 25 Javascript
js电话号码验证方法
Sep 28 Javascript
JQuery日历插件My97DatePicker日期范围限制
Jan 20 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
js与jquery分别实现tab标签页功能的方法
Nov 18 Javascript
原生js实现放大镜
Feb 20 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
Feb 01 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
Aug 04 Javascript
vue项目实现多语言切换的思路
Sep 17 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 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
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
AngularJS内置指令
2015/02/04 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
vue实现a标签点击高亮方法
2018/03/17 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python中unittest用法实例
2014/09/25 Python
Python中input和raw_input的一点区别
2014/10/21 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python代码如何注释
2020/06/01 Python
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
幼儿园老师寄语
2014/04/03 职场文书
小学生常见病防治方案
2014/06/06 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
python 中的jieba分词库
2021/11/23 Python