当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何让子元素的click事件不会影响到父元素的dbclick事件?

黄英韶
2024-01-10

子元素有click事件,父元素有dbclick事件,想要做到快速双击子元素的时候,不要触发父元素的dbclick事件

<div @dblclick="changeFullScreen">    <div @click.stop="showPreset($event)">    </div></div>showPreset(event) {    console.log('aaaaa')    // event.topImmediatePropagation()    // return false}changeFullScreen() {    console.log('bbbb')}

尝试了给子元素添加阻止冒泡、return false等操作,均无效

共有3个答案

巩枫
2024-01-10

给父元素添加self修饰符:

  <div    style="width: 100px; height: 100px; background-color: palegoldenrod"    @dblclick.self="changeFullScreen"  >    <div      style="width: 50px; height: 50px; background-color: palegreen"      @click.stop="showPreset($event)"    ></div>  </div>

PixPin_2024-01-10_16-54-38.gif

满勇军
2024-01-10

你这是事件冒泡使用错误,点击事件和双击事件都不是同一个事件,你阻止单击事件冒泡跟双击事件冒泡有什么关系呢?所以你要做的是在子元素上也绑定上双击事件,但是这个双击事件什么都不做。

有两种方式,第一种是子元素也绑定双击事件,该事件什么都不做只做阻止双击事件冒泡:

<div @dblclick="changeFullScreen">    // 在子元素上绑定双击事件并阻止双击事件冒泡    <div @click="showPreset($event)" @dbclick.stop="nothingFn">    </div></div>// nothingFn 这个函数什么都不做nothingFn() {};showPreset(event) {    console.log('aaaaa')    // event.topImmediatePropagation()    // return false}changeFullScreen() {    console.log('bbbb')}

第二种方式是利用事件冒泡的原理,查看事件对象event.target,通过这种方式判断到底是谁触发双击事件,如果是父元素就执行,如果是子元素就不执行。

郑曜灿
2024-01-10

要阻止子元素的 click 事件影响到父元素的 dbclick 事件,你需要使用 JavaScript 来编写更具体的逻辑来控制事件的冒泡和默认行为。在你的例子中,你已经尝试了使用 .stop 修饰符来阻止事件冒泡,但这对 dbclick 事件并不起作用。

一个解决方案是检查事件对象的 type 属性,然后根据这个属性来决定是否调用父元素的 dbclick 事件处理器。这样你就可以区分是 click 事件还是 dbclick 事件,并相应地处理它们。

下面是一个示例代码,展示了如何实现这个逻辑:

<template>  <div @dblclick="changeFullScreen" ref="parentElement">    <div @click="handleChildClick($event)">    </div>  </div></template><script>export default {  methods: {    handleChildClick(event) {      // 检查事件的类型,如果是双击事件(dblclick),则阻止默认行为并阻止冒泡      if (event.type === 'dblclick') {        event.preventDefault();        event.stopPropagation();      }    },    changeFullScreen() {      console.log('bbbb')    },  },};</script>

在这个示例中,我们给父元素添加了一个 ref,以便在 Vue 实例中引用它。然后,我们在子元素的 click 事件处理器中检查事件的类型。如果是双击事件(dblclick),我们调用 preventDefault() 来阻止默认行为,并调用 stopPropagation() 来阻止事件冒泡。这样,当用户快速双击子元素时,父元素的 dbclick 事件处理器就不会被触发。

 类似资料:
  • 我有一个创建元素的脚本,创建过程的一部分是添加onclick事件(使用addEventListener),但当我单击子元素时,会触发父元素的onclick事件。当源是子元素时,如何防止检测到单击?

  • div元素无法选择,受body的onselectstart影响。 实际上并不知道是哪个父元素。 用js如何移除这个事件?

  • 如上所示,在这种情况下,底下的click事件不生效,如何才能让其生效? 小弟在这里先谢谢各位大神的解答,感激不尽!!

  • 问题内容: 我正在尝试 在React元素上模拟,但无法弄清楚为什么它不起作用(触发时它没有反应)。 我只想使用JavaScript发布Facebook评论,但我停留在第一步(执行on 元素)。 我的代码是: 这是我尝试执行的网址: **https://www.facebook.com/plugins/feedback.php …** PS:我对React没有经验,我也不知道在技术上是否可行。这是可

  • 我通过以下方式通过文本找到了一个孩子。 问题是我需要单击父元素。页面上的元素是动态显示的,之前我只知道文本。是否可以对此进行编程? 我的html:

  • 问题内容: 我怎样才能改变父母的背景的时候或者是:focus’d(或任何其他动态伪类? 例如 问题答案: 不幸的是,css不支持父选择器。 因此,唯一的方法就是像jQuery父方法那样使用javascript 。 更新: CSS选择器第4级将支持父选择器