[转帖]玩转js事件机制
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
js事件机制正文首先,我们要知道js事件流的概念。 一、js事件流js事件流一共分为
来张图让你更好的理解: 二、举个例子我们要实现这个效果,定义三个容器,给三个容器都添加一个点击监听事件,点击相应的容器并输出相应的打印。我们需要观察的是点击相应的容器的输出结果。 1.第一种情况当 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> #greenBox{ width: 200px; height: 200px; background: #c2f5ca; } #pinkBox{ width: 100px; height: 100px; background-color: #f7d0d0; color:#fff; position: absolute; } #blackBox{ width: 50px; height: 50px; background: #000; } </style>
</head> <body> <div id="greenBox"> <div id="pinkBox"> <div id="blackBox"></div> </div> </div>
<script> let greenBox=document.getElementById('greenBox') let pinkBox=document.getElementById('pinkBox') let blackBox=document.getElementById('blackBox') greenBox.addEventListener('click',()=>{ console.log('greenBox') }) pinkBox.addEventListener('click',(event)=>{ console.log('pinkBox') }) blackBox.addEventListener('click',(event)=>{ console.log('blackBox') }) </script> </body> </html> 当我们点击
2.第二种情况当addEventListener监听事件有 1)我们在greenBox的监听事件中添加第三个参数true,代码如下:
<script> greenBox.addEventListener('click',()=>{ console.log('greenBox') },true) pinkBox.addEventListener('click',(event)=>{ console.log('pinkBox') }) blackBox.addEventListener('click',(event)=>{ console.log('blackBox') }) </script> 当我们点击黑色容器时,得到的打印结果:
2)我们在greenBox的监听事件中添加第三个参数false,在pinkBox的监听事件中添加第三个参数true,代码如下: <script> greenBox.addEventListener('click',()=>{ console.log('greenBox') },flase) pinkBox.addEventListener('click',(event)=>{ console.log('pinkBox') },true) blackBox.addEventListener('click',(event)=>{ console.log('blackBox') }) </script> 当我们点击黑色容器时,得到的打印结果: 这个结果也是在意料之中的,首先pinkBox在遇到注册的的捕获事件触发,而blackBox默认在遇到注册的的冒泡事件触发,greenBox在遇到注册的的冒泡事件触发。 三、阻止默认事件当我们想只触发其中的
四、事件代理
1.来个例子我们要实现一个列表,其中有五项,点击任何一项输出相应的列表项文本。 我们大多数小白会这么写,采用循环进行遍历: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style> li { width: 100px; background: #efe5ad; font-size: 20px; margin: 10px; } </style> <body> <ul id="ul"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> <script> let li = document.getElementsByTagName("li"); for (let i = 0; i < li.length; i++) { li[i].addEventListener("click", () => { console.log(li[i].innerHTML) }) } </script> </body> </html> 但是这样做每次循环都需要创建一个监听事件,这就不优雅了,试着利用js事件流来优化它一下吧! <script> //事件代理 let ul = document.getElementById("ul"); ul.addEventListener("click", (event) => { console.log(event.target.innerHTML); }) </script> 我们只需要获取ul的dom结构,调用ul监听事件参数event中的taget中的innerHTML就可以得到值啦! 2.优点
最后我们开头的问题想必大家都有答案了,是因为在菜品这个div中默认设置了阻止默认事件的函数stopPropagation(),当点击按钮时只会触发这个按钮的冒泡事件。故点击按钮并不会跳转到这个菜品的详情页。 ------------------------------- https://juejin.cn/post/7232905822279204919 该文章在 2023/5/18 8:44:09 编辑过 |
关键字查询
相关文章
正在查询... |