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 相关文章推荐
小型js框架veryide.librar源代码
Mar 05 Javascript
url 特殊字符 传递参数解决方法
Jan 01 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
Jul 26 Javascript
js创建数据共享接口——简化框架之间相互传值
Oct 23 Javascript
firefox下input type=&quot;file&quot;的size是多大
Oct 24 Javascript
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
Jquery中的层次选择器与find()的区别示例介绍
Feb 20 Javascript
AngularJS的表单使用详解
Jun 17 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
javascript深拷贝、浅拷贝和循环引用深入理解
May 27 Javascript
React Hooks的深入理解与使用
Nov 12 Javascript
Vue实现购物车详情页面的方法
Aug 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实现的ping端口函数实例
2014/11/12 PHP
php按单词截取字符串的方法
2015/04/07 PHP
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
深入理解Python变量与常量
2016/06/02 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python async with和async for的使用
2019/06/20 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
python的列表List求均值和中位数实例
2020/03/03 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
python中return如何写
2020/06/18 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
我的祖国演讲稿
2014/05/04 职场文书
主要负责人任命书
2014/06/06 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers