JS阻止事件冒泡和默认事件

妖狐艹你老母 2021-11-22 12:46 588阅读 0赞

本文转载自掘金中我的小伙伴的一篇文章:https://juejin.im/post/5bf7ad096fb9a049ed308353

什么是事件冒泡?

当事件发生后,这个事件就要开始传播(从里到外,或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,或处理事件的函数并未绑定在该事件源上。如下图:

1

  • 我们经常利用事件冒泡机制去减少给DOM添加过多的绑定事件即*事件委托,但是有时候事件冒泡也会比较烦人,影响我们的事件正常处理机制,如下:




    最外层

    第二层

    第三层
    最底






    复制代码

1 1

如何阻止事件冒泡?

由上图我们可以看出,我们只点击了最里面的那个div,但是在他的父级及以上div身上所绑定的事件都被触发了,这显然不是我们想要的结果,我们实际需求是只想要触发点击的那个div上绑定的事件,我们该如何阻止浏览器的这种事件处理机制呢?

  1. function bubbles(e){
  2. var ev = e || window.event;
  3. if(ev && ev.stopPropagation) {
  4. //非IE浏览器
  5. ev.stopPropagation();
  6. } else {
  7. //IE浏览器(IE11以下)
  8. ev.cancelBubble = true;
  9. }
  10. console.log( "最底层盒子被点击了")
  11. }复制代码

1 2

这样我们就可以实现点击哪个div触发哪个div的方法,而对其他div不造成影响了

阻止默认事件

一共有如下三种方式:

  1. //谷歌及IE8以上
  2. e.preventDefault();
  3. //IE8及以下
  4. window.event.returnValue = false;
  5. //无兼容问题(但不能用于节点直接onclick绑定函数)
  6. return false;复制代码

具体用法:

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>阻止默认事件 </title>
  8. </head>
  9. <body>
  10. <div id="info">
  11. <a href="www.baidu.com" id="test">阻止默认事件 </a>
  12. </div>
  13. <script>
  14. var aDom = document.getElementById( 'test');
  15. aDom.onclick = function ( e ){
  16. if(e && e.preventDefault) {
  17. //非IE浏览器
  18. e.preventDefault();
  19. } else {
  20. //IE浏览器(IE11以下)
  21. window.event.returnValue = false;
  22. }
  23. //return false; //或者不写上面的判断直接写这句
  24. };
  25. </script>
  26. </body>
  27. </html>复制代码

使用return false的注意点

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>阻止默认事件 </title>
  8. </head>
  9. <body>
  10. <div id="info">
  11. <a href="www.baidu.com" onclick="defaultEvent()">阻止默认事件 </a>
  12. </div>
  13. <script>
  14. function defaultEvent(){
  15. return false;
  16. }
  17. </script>
  18. </body>
  19. </html>复制代码

以上代码,完全无效,无法通过这个函数阻止a标签的跳转,return false不能适用于直接用onclick绑定的事件,所以当我们使用这种绑定事件方式时,我们还是需要采用e.preventDefault()这个函数

在jQuery中使用return false时,相当于同时使用event.preventDefault和event.stopPropagation,它会阻止冒泡也会阻止默认行为。 但是使用原生js写时,return false只会阻止默认行为。

发表评论

表情:
评论列表 (有 0 条评论,588人围观)

还没有评论,来说两句吧...

相关阅读