存在双击事件,如何正确响应单击事件?拿来即用

305 阅读1分钟

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

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

分析

首先,点击事件 mouseevent中,有个属性detail,记录了当前点击量。

UIEvent.detail 是只读属性,当值为非空的时候,提供当前点击数 (和环境有关) 。

  • click 或者 dblclick 事件,UIEvent.detail 是当前点击数量。
  • mousedown 或者 mouseup 事件,UIEvent.detail 是 1 加上当前点击数。
  • 对所有的其他UIEvent 对象,UIEvent.detail 总是零。

detail在很短的时间之后会自动重置

  • 所以,detail为1,且无后续点击时,为单击事件,detail>1,为双击事件
  • 所以,可以判断,短时间内只有一次点击,为单击事件,有多次点击,则为双击事件

到这儿,是不是觉得眼熟,有点像防抖的功能。

没错,我们可以使用防抖函数,来实现这个功能。

import { debounce } from "lodash-es";
export function signalClick<T extends []>(fn: (e: MouseEvent, ...args: T) => void, delay = 300) {
  return debounce((e: MouseEvent, ...args: T) => {
    if (e.detail == 1) {
      fn(e, ...(args as T));
    }
  }, delay);
}

// 使用
const foo = signalClick((_e,type)=>{console.log(type)})

参考资料

UIEvent.detail - Web API | MDN