当前位置: 首页 > ops >正文

如何避免双击时触发单击事件

当一个元素上,同时绑定了双击事件和单击事件,当双击时,会触发单击事件,如何避免双击时触发单击事件?

方法 1:使用 setTimeout 延迟处理单击事件​

通过延迟单击事件的处理时间,避免与双击事件冲突。

<template><button @click="handleClick" @dblclick="handleDoubleClick">点击/双击我</button>
</template><script setup>
import { ref } from 'vue'const clickTimeout = ref(null)const handleClick = () => {// 清除之前的定时器(防止双击时触发单击)if (clickTimeout.value) {clearTimeout(clickTimeout.value)clickTimeout.value = nullreturn}// 设置新的定时器,延迟执行单击逻辑clickTimeout.value = setTimeout(() => {console.log('单击事件触发')// 执行单击逻辑...clickTimeout.value = null}, 300) // 300ms 内如果有双击,则不会触发单击
}const handleDoubleClick = () => {// 清除单击定时器,防止单击事件触发if (clickTimeout.value) {clearTimeout(clickTimeout.value)clickTimeout.value = null}console.log('双击事件触发')// 执行双击逻辑...
}
</script>

方法2:使用 v-click-outside 或自定义指令

如果需要在复杂交互中区分单击和双击,可以封装一个自定义指令。

实现方式:

// directives/clickOrDoubleClick.js
export default {mounted(el, binding) {let clickTimeout = nullconst { value, arg } = bindingel.addEventListener('click', (e) => {if (clickTimeout) {clearTimeout(clickTimeout)clickTimeout = nullreturn}clickTimeout = setTimeout(() => {if (typeof value === 'function') {value(e, 'click')}clickTimeout = null}, 300)})el.addEventListener('dblclick', (e) => {if (clickTimeout) {clearTimeout(clickTimeout)clickTimeout = null}if (typeof value === 'function') {value(e, 'dblclick')}})},unmounted(el) {el.removeEventListener('click', () => {})el.removeEventListener('dblclick', () => {})},
}

注册指令​

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import clickOrDoubleClick from './directives/clickOrDoubleClick'const app = createApp(App)
app.directive('click-or-double-click', clickOrDoubleClick)
app.mount('#app')

使用方式

<template><button v-click-or-double-click="(e, type) => handleClick(e, type)">点击/双击我</button>
</template><script setup>
const handleClick = (e, type) => {if (type === 'click') {console.log('单击事件')} else if (type === 'dblclick') {console.log('双击事件')}
}
</script>

方法 4:使用 lodash.debounce 或 lodash.throttle(适用于复杂场景)​

如果单击事件逻辑较复杂,可以使用防抖(debounce)或节流(throttle)来优化。

<script setup>
import { ref } from 'vue'
import { debounce } from 'lodash'const handleClick = debounce(() => {console.log('单击事件(防抖处理)')
}, 300)const handleDoubleClick = () => {console.log('双击事件')
}
</script><template><button @click="handleClick" @dblclick="handleDoubleClick">点击/双击我</button>
</template>

注意​​

  • 防抖适用于单击事件,但双击事件仍然需要单独处理。
  • 如果双击事件触发后,单击事件仍然可能被误触发,建议结合 setTimeout 方法。
http://www.xdnf.cn/news/4997.html

相关文章:

  • 自然语言处理 (NLP) 技术发展:从规则到大型语言模型的演进之路
  • C++ 引用传参机制
  • Oracle Fusion常用表
  • AD 绘制原理图--元件的放置
  • 大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统
  • 计算几何图形算法经典问题整理
  • 卡洛诗的“破”与“立”
  • RDD转换算子案例
  • 我的AD快捷键方案【留存】
  • C++ -- string
  • 裸机上的 printf:在无操作系统环境下构建 C 标准库
  • 《工业计算机硬件技术支持手册》适用于哪些人群?
  • STM32F103RCT6 + MFC实现网口设备搜索、修改IP、固件升级等功能
  • 西门子 PLC 串口转网口模块(三格电子)
  • 前端使用腾讯地图api实现定位功能
  • Spring生态全景解析:Spring、Spring MVC、SpringBoot与Spring Cloud的关系
  • Google的A2A和MCP什么关系
  • 数据库的SQLSTATE[23000]异常,通过自定义异常类来提供更友好的提示信息
  • STC32G12K128-旋转编码器-软件去抖
  • QT6(35)4.8定时器QTimer 与QElapsedTimer:理论,例题的界面搭建,与功能的代码实现。
  • CSS display: none
  • 2025 年数维杯数学建模B题完整论文代码模型
  • 2025 年数维杯数学建模 C 题完整论文代码模型
  • Linux——进程信号
  • MySQL中的连接池
  • java------------反射
  • JAVA,大花猫大黑狗例题
  • 敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
  • linux中的日志分割
  • sklearn自定义pipeline的数据处理