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 相关文章推荐
JQuery 写的个性导航菜单
Dec 24 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
Aug 30 Javascript
jquery prop的使用介绍及与attr的区别
Dec 19 Javascript
js中函数调用的两种常用方法使用介绍
Jul 17 Javascript
JS简单操作select和dropdownlist实例
Nov 26 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
js实现固定宽高滑动轮播图效果
Jan 13 Javascript
a标签置灰不可点击的实现方法
Feb 06 Javascript
深入理解vue路由的使用
Mar 24 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
JavaScript面向对象精要(上部)
Sep 12 Javascript
Node批量爬取头条视频并保存方法
Sep 20 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/04/05 PHP
php实现的操作excel类详解
2016/01/15 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
Python中static相关知识小结
2018/01/02 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
常见的软件开发流程有哪些
2015/11/14 面试题
员工晚婚的请假条
2014/02/08 职场文书
电子商务专业自荐信
2014/06/02 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
2014年大学生工作总结
2014/11/20 职场文书
土地租赁协议书
2015/01/29 职场文书
滴水洞导游词
2015/02/10 职场文书
财政局个人年终总结
2015/03/03 职场文书
简短清晨问候语
2015/11/10 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android