在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、事件流
1、概念事件的传播过程即 2、DOM事件流DOM事件,也是有一个流程的。从事件触发开始到事件响应是有三个阶段。
上面例子中,开电脑这个事件的过程就像 了解了事件源,让我们看看它的三个过程吧! 事件捕获:
事件捕获处于事件流的第一步, 目标阶段: 当事件到达目标节点的,事件就进入了目标阶段。事件在目标节点上被触发。 事件冒泡: 事件冒泡与事件捕获顺序相反。事件捕获的顺序是从外到内,事件冒泡是从内到外。 看一个例子,点击 box3 会将 box2 与 box1 的点击事件触发。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript 事件冒泡</title> </head> <style type="text/css"> #box1 { background: blueviolet;} #box2 {background: aquamarine;} #box3 {background: tomato;} div { padding: 40px; margin: auto;} </style> <body> <div id="box1"> <div id="box2"> <div id="box3"></div> </div> </div> <script> window.onload = function () { const box1 = document.getElementById('box1') const box2 = document.getElementById('box2') const box3 = document.getElementById('box3') box1.onclick = sayBox1; box2.onclick = sayBox2; box3.onclick = sayBox3; function sayBox3() { console.log('你点了最里面的box'); } function sayBox2() { console.log('你点了最中间的box'); } function sayBox1() { console.log('你点了最外面的box'); } } </script> </body> </html>
现代浏览器都是从 现在我们知道了事件流的三个阶段后,那我们可以利用这个特性做什么呢? 二、事件委托设想这样一个场景,当你有一堆的<li>标签在一个 <ul id="myUl"> <li>item 1</li> <li>item 2</li> <li>item 3</li> ... </ul> 可能还是有点不好理解,简单来说,就是利用事件冒泡,将某个元素上的事件委托给他的父级。 举个生活中的例子,双十一快递到了,需要快递小哥送快递一般是挨家挨户送货上门,这样效率慢,小哥想了个办法,把一个小区的快递都放在小区里面的快递驿站,进行送快递的事件委托,小区的收件人能通过取件码去快递驿站领取到自己的快递。 可是这样做有什么好处呢? 1、事件委托的优点事件委托有两个好处
减少内存消耗,优化页面性能 在 在上面给 动态绑定事件: 如果子元素不确定或者动态生成,可以通过监听父元素来取代监听子元素。 可以使用事件委托就可以不用给每一个 我们知道了事件委托的优点,那么该如何使用呢? 2、事件委托的使用事件委托的使用需要用的 用法: element.addEventListener(eventType, function, useCapture);
第三个参数
看下面例子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaScript 事件委托</title> </head> <body> <ul> <li>item 1</li> <li>item 2</li> <li>item 3</li> <li>item 4</li> </ul> <script> const myUl = document.getElementsByTagName("ul")[0]; myUl.addEventListener("click", myUlFn); function myUlFn(e) { if (e.target.tagName.toLowerCase() === 'li') { // 判断是否为所需要点击的元素 console.log(`您点击了${e.target.innerText}`); } } </script> </body> </html>
事件冒泡有时候确实很有用,但是有时候也讨人烦,当你不需要它的时候能不能取消掉呢? 三、禁止事件冒泡与捕获
禁止冒泡和捕获可以用到方法 使用起来也很简单,没有返回值也没有参数。 event.stopPropagation(); 请看下面例子,这个例子实在上文事件冒泡例子基础上稍加修改得到的 <div id="box1"> <div id="box2"> <div id="box3"></div> </div> </div> <script> const box1 = document.getElementById('box1') const box2 = document.getElementById('box2') const box3 = document.getElementById('box3') box1.onclick = sayBox1; box2.onclick = sayBox2; box3.onclick = sayBox3; function sayBox3() { console.log('你点了最里面的box'); } function sayBox2(e) { console.log('你点了最中间的box'); e.stopPropagation(); //禁止事件捕获和冒泡 } function sayBox1() { console.log('你点了最外面的box'); } </script> 当事件冒泡到 到此这篇关于JavaScript 事件捕获冒泡与捕获详情的文章就介绍到这了,更多相关JavaScript事件捕获冒泡与捕获内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! 四、参考文献MDN中文版 https://developer.mozilla.org/zh-CN/ |
请发表评论