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进行跨域请求
Jan 25 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
Dec 29 Javascript
javascript正则表达式之search()用法实例
Jan 19 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
Jan 23 Javascript
JQuery实现样式设置、追加、移除与切换的方法
Jun 11 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
微信小程序 form组件详解
Oct 25 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
ajax与json 获取数据并在前台使用简单实例
Jan 19 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
Apr 19 jQuery
如何自动化部署项目?折腾服务器之旅~
Apr 16 Javascript
Vue-CLI与Vuex使用方法实例分析
Jan 06 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
解析左右值无限分类的实现算法
2013/06/20 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
javascript call和apply方法
2008/11/24 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
JS实现页面打印功能
2017/03/16 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python操作MySQL数据库的方法分享
2012/05/29 Python
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
python批量修改文件名的实现代码
2014/09/01 Python
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
Python数据结构之图的应用示例
2018/05/11 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
学习新党章思想汇报
2014/01/09 职场文书
大学毕业感言
2014/01/10 职场文书
工作睡觉检讨书
2014/02/25 职场文书
大学生安全责任书
2014/07/25 职场文书
具结保证书范本
2015/05/11 职场文书