js中事件的三个阶段(JavaScript中事件冒泡机制示例详析)
js中事件的三个阶段
JavaScript中事件冒泡机制示例详析什么是冒泡?
DOM事件流(event flow )存在三个阶段:事件捕获阶段、 处于目标阶段、 事件冒泡阶段。
事件捕获(event capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会从根节点开始由外到内进行事件传播,即点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件。
事件冒泡(dubbed bubbling):与事件捕获恰恰相反,事件冒泡顺序是由内到外进行事件传播,直到根节点。
dom标准事件流的触发的先后顺序为:先捕获再冒泡,即当触发dom事件时,会先进行事件捕获,捕获到事件源之后通过事件传播进行事件冒泡。不同的浏览器对此有着不同的实现,IE10及以下不支持捕获型事件,所以就少了一个事件捕获阶段,IE11、Chrome 、Firefox、Safari等浏览器则同时存在。
addEventListener()方法
这个方法设定一个事件监听器,当某一事件发生通过设定的参数执行操作。语法是:
addEventListener(event, function, useCapture)
参数 event 是必须的,表示监听的事件,例如 click, touchstart 等,就是之前不加前缀 on 的事件。
参数 function 也是必须的,表示事件触发后调用的函数,可以是外部定义函数,也可以是匿名函数。
参数 useCapture 是选填的,填true或者false,用于描述事件是冒泡还是捕获,true表示捕获,默认的false表示冒泡。
移除事件监听
如果要移除 addEventListener() 添加的事件监听,就要使用removeEventListener(),语法是:
removeEventListener(event, function)
参数与addEventListener()一致。
兼容性
IE 8及更早的版本,和Opera 7.0及更早的版本,不支持 addEventListener() 和 removeEventListener() 方法,他们使用的是一下方法代替:
添加事件:
attachEvent(event, function)
移除事件:
**detachEvent(event, function) **
可以用以下方法解决兼容性问题:
if (li1.addEventListener) { li1.addEventListener('click', function () { console.log("支持") }); } else if (li1.attachEvent) { li1.attachEvent('onclick', function () { console.log("不支持") }); }
冒泡和捕获的具体区别
HTML
<li id="li1"> <li id="li2"></li> </li>
JS
<script> var li1 = document.getElementById("li1"); var li2 = document.getElementById("li2"); li1.addEventListener('click',function(){ console.log("li1--捕获阶段") },true); li2.addEventListener('click',function(){ console.log("li2--捕获阶段") },true); li1.addEventListener('click',function(){ console.log("li1--冒泡阶段") }); li2.addEventListener('click',function(){ console.log("li2--冒泡阶段") }); </script>
输出结果(点击li2的时候执行的结果)
解决办法
function stopBubble(e) { if (e && e.stopPropagation) { e.stopPropagation(); //因此它支持W3C的stopPropagation()方法 } else { window.event.cancelBubble = true; //否则,我们需要使用IE的方式来取消事件冒泡 } }
总结
到此这篇关于JavaScript中事件冒泡机制的文章就介绍到这了,更多相关JavaScript事件冒泡内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- 常用JS验证函数
- js中push和join
- js实现页面自动跳转
- 创建jsp时如何默认生成的是utf-8(js判断文件是否为utf-8编码的方法)
- nodejs部署上传文件(node.js使用express-fileupload中间件实现文件上传)
- JS函数前面感叹号的作用
- JS中sort()和reverse()
- 原生js实现轮播图代码(js实现轮播图制作方法)
- js编写一个数组去重的方法(JS实现数组过滤从简单到多条件筛选)
- 利用前端做扫雷游戏(js实现经典扫雷游戏)
- thinkphp框架实例(ThinkPHP框架整合微信支付之JSAPI模式图文详解)
- 通过js获取Url的参数值
- 纯css和js有什么区别(CSS语法与JSON、JS对象区别比较)
- jsp实现短信验证码(手动实现js短信验证码输入框)
- 火狐查看json数据
- js中作用域
- 一部手机两套系统 OPPO Find X3的正确打开方式你知道吗(一部手机两套系统)
- OPPO用户看过来 汇总几个春节实用技巧,轻松搞定多设备联动玩法(汇总几个春节实用技巧)
- 北京旅游攻略(北京旅游攻略5日游及其花费)
- 四川旅游攻略(四川旅游攻略自由行攻略)
- 上海迪士尼攻略(上海迪士尼攻略旅游)
- 哪里可以看熊猫(成都哪里可以看熊猫)
热门推荐
- computer browser服务启动后停止(用户IIS APPPOOLDefaultAppPool登录失败的解决方法)
- meta标签中viewport
- 阿里云服务器可以连接几个面板(阿里云云服务器宝塔面板的安装图文教程详解)
- docker实现redis集群(详解使用Docker进行Redis主从复制实践)
- docker的漏洞(一次docker错误的耗时排查过程记录)
- php数组练习题答案(PHP 数组黑名单/白名单实例代码详解)
- mysql安装失败原因和解决方法(MySQL MGR搭建过程中常遇见的问题及解决办法)
- js如何解决iphone异形屏适配(Html5适配iphoneX刘海屏的简单实现)
- dedecms仿站教程(如何让dedecms变成全站动态浏览有利于企业站)
- javascript中图片轮播效果代码(JavaScript实现简单的轮播图效果)