You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中如何区分@click与@keydown.enter事件,避免回调重复触发

解决方案

问题本质

HTML原生<button>元素在获得焦点时按下回车键,会默认触发click事件,这是浏览器的标准行为,所以你绑定的两个事件回调会先后执行,导致状态被两次取反。

最优解决方法:阻止键盘事件的默认行为

直接给@keydown.enter添加.prevent修饰符,拦截浏览器默认触发的click事件,从根源避免重复触发,无需修改现有回调逻辑:

<button @click="toggleModal" @keydown.enter.prevent="toggleModalWithFocusTrap">

方案二:在回调中判断事件触发来源

如果你确实需要保留默认行为,区分鼠标点击和键盘触发的事件,可以通过事件对象的属性判断:

过滤键盘触发的click事件

键盘触发的click事件的event.detail属性值固定为0,鼠标点击的event.detail对应点击次数(单次点击为1,双击为2),可以在toggleModal里加过滤逻辑:

toggleModal(event) {
  // 过滤掉键盘触发的click事件,只处理鼠标点击
  if (event.detail === 0) return
  this.showModal = !this.showModal
}

通用触发源判断逻辑

也可以直接通过事件类型和参数判断触发来源:

function getTriggerSource(event) {
  if (event.type === 'keydown' && event.key === 'Enter') {
    return 'keyboard_enter'
  }
  if (event.type === 'click') {
    return event.detail > 0 ? 'mouse_click' : 'keyboard_click'
  }
}

内容的提问来源于stack exchange,提问作者Michael Andorfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:54:05