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 相关文章推荐
javaScript 读取和设置文档元素的样式属性
Apr 14 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
Jan 04 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
Mar 07 Javascript
JQuery调用绑定click事件的3种写法
Mar 28 Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
May 09 Javascript
JS动态添加选项案例分析
Oct 17 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
Jul 01 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
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的ob_start来生成静态页面的方法分析
2011/03/09 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
JavaScript URL参数读取改进版
2009/01/16 Javascript
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
python实现小球弹跳效果
2019/05/10 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
高校生生产实习自我鉴定
2013/09/21 职场文书
顶岗实习计划书
2014/01/10 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
机关作风建设整改方案
2014/10/27 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
城南旧事读书笔记
2015/06/29 职场文书
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫