移动端长按事件和点击事件冲突怎么办?
我在移动端项目里给图片列表加长按删除功能,但发现长按触发的时候会同时触发点击事件。比如用户长按图片想删除,结果页面直接跳转到详情页了。
我用了touchstart设setTimeout,touchend清除的常规方法,但点击事件还是会被触发。代码大概是这样写的:
<div class="item"
ontouchstart="handleStart(event)"
ontouchend="handleEnd(event)"
onclick="navigateToDetail()">
长按测试区域
</div>
试过给事件加stopPropagation也不行,有没有更好的实现方式?或者应该怎么调整事件监听顺序?
我一般的做法是:不要直接用 onclick,而是把点击行为也用 touchend 实现,并且通过一个标记位来判断是点击还是长按。这样可以完全控制流程,避免两者冲突。
下面是一个修改后的实现逻辑:
HTML部分改成这样:
关键点在于:
1. 不用 onclick,自己控制点击逻辑
2. 用 isLongPress 标记判断是否触发了长按
3. 长按触发后,clearTimeout 保证点击不会执行
这样就能彻底避免点击和长按互相干扰的问题。另外,移动端 touch 事件有时候会有延迟,所以你也可以考虑引入 fastclick 或者使用更现代的 pointerEvent,但上面这种标记法已经能解决大多数问题。
如果后续你还要防止用户恶意快速重复点击,可以在 handleTap 里加防抖或者节流逻辑,防止注入攻击。