js事件冒泡与事件捕获详解


Posted in Javascript onFebruary 20, 2017

(一)事件绑定

1.普通事件绑定

给html添加一个以on开头的特定的属性(如onclick,onfocus);

<button id="A" onclick="alert(this.id)">方式一</button>

<button id="A" onclick="handler(this)">方式二</button>
<script>
 function handler(btn){
 alert(this.id); //undefined this指向window对象
 alert(btn.id); //A 
 }
</script>
<button id="A">方式三</button>
<script>
 var btn = document.getElementById("A");
 btn.onclick = function(){
 alert("1:"+this.id);
 }
 btn.onclick = function(){
 alert("2:"+this.id);
 }
 //只能绑定一个事件处理函数,后面的会覆盖前面的;
</script>

2.符合W3C标准的事件绑定(addEventListener和removeEventListener)

target.addEventListener(type, listener[, useCapture]);

type:必须,表示监听事件类型的字符串;

listener:必须,当所监听的事件类型触发时,会接收到一个事件通知对象;listener 必须是一个实现了 EventListener 接口的对象,或者是一个函数;

useCapture:可选,Boolean,默认为false,表示事件传播方式为事件冒泡;true,表示事件传播方式为事件捕获;

(事件捕获与事件冒泡下面有讲到)

这两个函数Firefox和Chrome都支持,IE9及以后也支持这两个函数;IE使用attachEvent/detachEvent来进行事件绑定和取消;

<button id="B">W3C标准一</button>
<script>
 var btn = document.getElementById("B");
 btn.addEventListener("click",handler,false);
 function handler(){
 alert(this.id); //B this指向的是dom对象; attachEvent指向的是window对象
 }
</script>
<button id="B">W3C标准二</button>
<script>
 var btn = document.getElementById("B");
 btn.addEventListener("click",handler,true);
 btn.addEventListener("click",handler,false);
 function handler(){
 alert(this.id); //B
 }
 //当点击按钮时,函数handler会执行2次,一次为事件捕获,一次为事件冒泡;
 //如果绑定的是同一个事件处理函数,且都是事件捕获或都是事件冒泡,那么只能绑定一次;
</script>

3.IE浏览器使用attachEvent/detachEvent进行事件绑定与取消

<button id="C">IE</button>
<script>
 var btn = document.getElementById("C");
 btn.attachEvent("click",handler);
 function handler(){
 alert(this.id); //undifined this指向的是window对象; addEventListener指向的是dom对象
 }
</script>

注:同一个事件处理函数只能绑定一次;不同的函数对象可以重复绑定不会覆盖;匿名函数和匿名函数即使代码完全一样,也是互相不相同的;

(二)事件捕获与事件冒泡

<div id="A">
 <div id="B">
 <div id="C"></div>
 </div>
</div>

事件捕获:就是从最外层到目标对象的顺序触发(如上面的代码,如果点击C,它的触发顺序为A→B→C)

事件冒泡:就是从目标对象到外层的顺序触发(如果点击C,它的触发顺序为C→B→A)

DOM事件流:就是支持两种事件模型,捕获型事件和冒泡型事件,捕获型事件先发生;两种事件流会触及DOM中的所有对象,从document对象开始,也在document对象结束。

图片来自网络:

js事件冒泡与事件捕获详解

<div id="A" style="width:300px; height:300px; background:red;position:relative;">
 <div id="B" style="width:200px;height:200px; background:green;position:relative;top:50px;margin:auto;">
 <div id="C" style="width:100px;height:100px; background:blue;position:relative;top:50px;margin:auto;"></div> 
 </div>
</div>
<script>
 var A = document.getElementById("A"); 
 var B = document.getElementById("B"); 
 var C = document.getElementById("C"); 
 // 目标(目标阶段的处理函数,先注册先执行)
 C.addEventListener('click',function(){alert("Ct");},true);
 C.addEventListener('click',function(){alert("Cf");},false);
 // 事件冒泡
 A.addEventListener('click',function(){alert("Af");},false);
 B.addEventListener('click',function(){alert("Bf");},false);
 // 事件捕获
 A.addEventListener('click',function(){alert("At");},true);
 B.addEventListener('click',function(){alert("Bt");},true); 
</script>
//当点击C时(蓝色),输出At Bt Ct Cf Bf Af

阻止事件的传播:

• 在W3c中,使用stopPropagation()方法

• 在IE下设置cancelBubble = true;

阻止事件的默认行为:

• 在W3c中,使用preventDefault()方法;

• 在IE下设置window.event.returnValue = false;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Javascript 生成指定范围数值随机数
Jan 09 Javascript
javascript AutoScroller 函数类
May 29 Javascript
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
Aug 28 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
如何制作幻灯片(代码分享)
Jan 06 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
微信小程序switch组件使用详解
Jan 31 Javascript
node中modules.exports与exports导出的区别
Jun 08 Javascript
对angularJs中$sce服务安全显示html文本的实例
Sep 30 Javascript
解决layui表格的表头不滚动的问题
Sep 04 Javascript
关于ES6的六个小特性(二)
Feb 20 #Javascript
JavaScript 总结几个提高性能知识点(推荐)
Feb 20 #Javascript
JS批量替换内容中关键词为超链接
Feb 20 #Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 #Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 #Javascript
Angular.js跨controller实现参数传递的两种方法
Feb 20 #Javascript
Bootstrap table右键功能实现方法
Feb 20 #Javascript
You might like
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
domReady的实现案例
2016/11/23 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
两道JAVA笔试题
2016/09/14 面试题
毕业生个人投资创业计划书
2014/01/04 职场文书
单位提档介绍信
2014/01/17 职场文书
同学聚会通知短信
2015/04/20 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
小学班主任研修日志
2015/11/13 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
自考生自我评价
2019/06/21 职场文书