我在用 Vue 做一个弹窗,里面有个按钮要阻止点击事件冒泡到外层遮罩,但用了 @click.stop 好像没生效?
在真机上点按钮还是会触发外层的关闭逻辑,是不是移动端 touch 事件和 click 不一样?我试过加 .stop 和 .prevent 都不行。
<div @click="closeModal" class="mask">
<div @click.stop class="popup">
<button @click.stop="handleConfirm">确定</button>
</div>
</div>
touch事件的时候。你提到的情况很有可能是因为移动端设备上浏览器对touch事件的处理机制与click事件不同。具体来说,移动端设备上的点击事件通常会经过一系列的touch事件(如touchstart,touchmove,touchend)之后才会触发click事件。有时候,click.stop或者click.prevent并不能有效阻止这些touch事件的冒泡。解决这个问题的一个方法是同时监听并阻止
touch事件的冒泡。下面是一个示例代码,展示了如何在 Vue 中实现这一点:在这个例子中,我们在
popup和button元素上添加了@touchstart.stop修饰符。这样可以确保当用户在这些元素上触摸时,触摸事件的冒泡也会被阻止。具体来说,为什么这么做有效呢?因为
touchstart通常是移动端点击操作的第一个事件,通过在这里阻止事件冒泡,我们可以防止后续的touchmove和touchend事件以及最终的click事件继续冒泡到父元素。另外,如果你还想确保
click事件也被彻底阻止,可以考虑使用原生 JavaScript 来手动阻止事件冒泡,如下所示:在这个版本中,我们在
handlePopupClick和handleTouchStart方法中手动调用了event.stopPropagation(),确保无论是click还是touch事件都不会冒泡到父元素。希望这个解决方案能帮到你,解决移动端点击事件冒泡的问题。有时候移动端开发就是得这么细致入微地去处理各种小问题。