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 相关文章推荐
IE与firefox之jquery用法区别
Oct 03 Javascript
JavaScript 对象成员的可见性说明
Oct 16 Javascript
JQuery验证工具类搜集整理
Jan 16 Javascript
jquery 显示*天*时*分*秒实现时间计时器
May 07 Javascript
AngularJS基础 ng-mouseover 指令简单示例
Aug 02 Javascript
JavaScript+CSS相册特效实例代码
Sep 07 Javascript
Node错误处理笔记之挖坑系列教程
Jun 05 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
Aug 13 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
Jul 04 Javascript
vue 兄弟组件的信息传递的方法实例详解
Aug 30 Javascript
JS实现碰撞检测效果
Mar 12 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循环语句笔记(foreach,list)
2011/11/29 PHP
php表单处理操作
2017/11/16 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
使用python实现链表操作
2018/01/26 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
python返回数组的索引实例
2019/11/28 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
税务干部鉴定材料
2014/02/11 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
大学生实训报告总结
2014/11/05 职场文书
庆六一开幕词
2015/01/29 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书