JS阻止事件冒泡

在前端开发中,我们通常要处理很多与鼠标、键盘等用户交互相关的事件。但是,有时候这些事件会冒泡到它们的父元素或者祖先元素中,从而影响到页面的其他部分。幸运的是,我们可以通过JS阻止事件冒泡来避免这种情况发生。本文将会从多个方面详细介绍JS阻止事件冒泡的方法和应用场景。

一、JS阻止事件冒泡的方法

在介绍具体的JS阻止事件冒泡方法之前,我们先来了解一下事件冒泡的概念。当鼠标在某个元素上触发一个事件时,这个事件会向该元素的父级元素冒泡,直到冒泡到document对象为止。下面是JS阻止事件冒泡的几种常见方法:

1. stopPropagation()

使用stopPropagation()方法可以阻止事件冒泡。这个方法是事件对象的一个方法,用来停止事件传播,防止触发父级元素的同名事件。具体的调用方式如下:

  
    document.querySelector('#child').addEventListener('click', function(event) {
      event.stopPropagation();
      console.log('child clicked');
    });
  

上面的代码中,当鼠标在id为child的元素上点击时,click事件不会向其父元素冒泡,因为我们使用了stopPropagation()方法阻止了事件的传播。因此,当我们在child元素上点击时,控制台只会输出’child clicked’,而不会输出’parent clicked’。

2. stopImmediatePropagation()

有时候一个元素上会同时绑定多个事件处理函数,如果你想阻止所有的事件冒泡并且阻止该元素上的所有其他事件处理函数的执行,可以使用stopImmediatePropagation()方法。它的调用方式和stopPropagation()类似,只不过它可以防止元素上其他的事件处理函数执行。下面是一个使用stopImmediatePropagation()方法的例子:

  
    document.querySelector('#child').addEventListener('click', function(event) {
      event.stopImmediatePropagation();
      console.log('child clicked');
    });

    document.querySelector('#child').addEventListener('click', function(event) {
      console.log('child clicked again');
    });
  

上面的代码中,当我们在id为child的元素上点击时,事件不仅不会向其父元素冒泡,而且不会执行child元素上其他的事件处理函数。当我们点击元素时,在控制台中只会输出’child clicked’,不会输出’child clicked again’。

3. addEventListener(options)

在addEventListener的第二个参数中,你可以传递一个options对象来指定事件处理函数的行为。其中的passive属性可以设置为true来防止事件传播。这个方法是比较新的方法,在较老的浏览器中可能不支持。下面是一个使用addEventListener()的例子:

  
    document.querySelector('#child').addEventListener('click', function(event) {      
      console.log('child clicked');
    }, { passive: true });
  

需要注意的是,在某些高频事件(例如touchmove等)中使用passive可以提高性能。

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

在前端开发中,有时候我们需要同时阻止事件冒泡和默认事件的执行。默认事件是指浏览器对某些事件的默认行为的处理方式,例如当我们在一个链接上点击时,浏览器默认会打开链接地址。下面是一种同时阻止事件冒泡和默认事件的方法:

  
    document.querySelector('#child').addEventListener('click', function(event) {
      event.preventDefault();
      event.stopPropagation();
      console.log('child clicked');
    });
  

在这个例子中,我们使用event.preventDefault()来阻止默认事件,使用event.stopPropagation()来阻止事件冒泡。这样就可以在不影响元素的默认行为的情况下阻止事件冒泡了。

三、JS阻止冒泡和捕获

在事件传播过程中,从最外层的元素往目标元素方向传播的过程称为事件捕获,而从目标元素往最外层元素方向传播的过程称为事件冒泡。默认情况下,addEventListener()方法被调用时,第三个参数useCapture默认为false,即默认使用事件冒泡。我们可以把该参数设置为true来使用事件捕获。下面是使用事件捕获和阻止事件冒泡的例子:

  
    document.querySelector('html').addEventListener("click", function(event) {
      console.log("html clicked");
    }, true);

    document.querySelector('body').addEventListener("click", function(event) {
      event.stopPropagation();
      console.log("body clicked");
    }, true);

    document.querySelector('#child').addEventListener("click", function(event) {
      console.log("child clicked");
    }, true);
  

在这个例子中,我们可以看到当鼠标点击child元素时,事件会从最外层的html元素被捕获,向下传递到了body元素,接着到了child元素,而且click事件也不会继续往上传到body和html元素。这是因为我们在body元素上调用了event.stopPropagation()方法。而当我们在body或者html上点击时,它们的点击事件不会冒泡给child元素。

四、JS阻止事件冒泡的两种方法

除了上面提到的stopPropagation()和stopImmediatePropagation()之外,还有两种阻止事件冒泡的方法:

1. return false

在事件处理函数中使用return false可以阻止事件冒泡。例如:

  
    document.querySelector('#child').addEventListener('click', function(event) {
      console.log('child clicked');
      return false;
    });
  

在这个例子中,当我们在child元素上点击时,事件不会冒泡给parent元素了,因为我们在事件处理函数中返回了false。需要注意的是,return false不仅会阻止事件冒泡,还会阻止默认事件的执行。

2. onclick

可以在HTML中使用onclick属性来指定元素被点击时的处理函数,并且使用return false来阻止事件冒泡和默认事件。例如:

  
    <div id="child" onclick="console.log('child clicked'); return false;">child</div>
  

在这个例子中,当我们在child元素上点击时,事件不会向其父元素冒泡,而且也不会执行浏览器默认的行为。

五、原生JS阻止事件冒泡的方法

在原生的JS中,我们也可以使用return false或者event.stopPropagation()来阻止事件冒泡。例如:

  
    document.getElementById('child').onclick = function(event) {
      console.log('child clicked');
      return false;
    };
  

需要注意的是,当我们使用原生的JS时,请勿在事件处理函数中使用return false和调用event.preventDefault(),因为这会导致一些错误,例如IE浏览器中会出现无法禁用链接的情况。

六、JS阻止事件冒泡不起作用

有时候,阻止事件冒泡的方法并不起作用,这可能是由于事件处理函数的执行时间较长,导致无法成功阻止事件冒泡。这时候我们可以使用setTimeout()函数来解决这个问题。例如:

  
    document.querySelector('#child').addEventListener('click', function(event) {      
      setTimeout(function() {
        event.stopPropagation();
        console.log('child clicked');
      }, 100);
    });
  

在这个例子中,我们使用了setTimeout()函数来延迟事件处理函数的执行时间,使事件能够成功地被阻止冒泡。

七、Vue阻止事件冒泡

在Vue中,可以使用.stop修饰符来阻止事件冒泡。例如:

  
    <div id="child" @click.stop="handler">child</div>
  

在这个例子中,我们使用@click事件监听给child元素绑定了一个事件处理函数handler,并使用.stop修饰符阻止了事件冒泡。也可以使用@mousedown.stop等事件在Vue中阻止事件冒泡。

八、CSS阻止事件冒泡

在CSS中,可以使用pointer-events属性阻止事件往下传递。例如:

  
    #child {
      pointer-events: none;
    }
  

在这个例子中,我们使用pointer-events: none来阻止了child元素上的所有事件(包括鼠标和键盘事件)。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/157618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-18 20:01
下一篇 2024-11-18 20:01

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • 解析js base64并转成unit

    本文将从多个方面详细介绍js中如何解析base64编码并转成unit格式。 一、base64编码解析 在JavaScript中解析base64编码可以使用atob()函数,它会将b…

    编程 2025-04-29
  • Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的解决方法

    本文将解决Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的问题。同时,给出一些相关示例代码,以帮助读者更好的理解并处理这个问题。 一、问题解…

    编程 2025-04-29
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • 抖音外放亲妈下葬事件的背后真相

    近期,一段抖音外放亲妈下葬的视频引发广泛关注和热议。不少人对这个事件感到震惊和愤怒,认为这种行为非常不尊重亲人,触犯了社会公德和家庭道德。但是,事情真相到底是什么呢?我们有必要从多…

    编程 2025-04-28
  • JS图片沿着SVG路径移动实现方法

    本文将为大家详细介绍如何使用JS实现图片沿着SVG路径移动的效果,包括路径制作、路径效果、以及实现代码等内容。 一、路径制作 路径的制作,我们需要使用到SVG,SVG是可缩放矢量图…

    编程 2025-04-27
  • 如何使用JS调用Python脚本

    本文将详细介绍通过JS调用Python脚本的方法,包括使用Node.js、Python shell、child_process等三种方法,以及在Web应用中的应用。 一、使用Nod…

    编程 2025-04-27
  • cc.director.on事件监听器

    本文将从多个方面详细介绍Cocos Creator中的cc.director.on事件监听器。 一、cc.director.on的作用和用法 cc.director.on是Coco…

    编程 2025-04-27
  • 如何反混淆美团slider.js

    本文将从多个方面详细阐述如何反混淆美团slider.js。在开始之前,需要明确的是,混淆是一种保护JavaScript代码的方法,其目的是使代码难以理解和修改。因此,在进行反混淆操…

    编程 2025-04-27
  • Python要学JS吗?

    Python和JavaScript都是非常受欢迎的编程语言。然而,你可能会问,既然我已经学了Python,是不是也需要学一下JS呢?在本文中,我们将围绕这个问题进行讨论,并从多个角…

    编程 2025-04-27

发表回复

登录后才能评论