javascript 不用定时器能否判断出单击和双击事件

2019-06-14 20:31:27 +08:00
 chord
RT
javascript 不用定时器能否判断出单击和双击事件,想了很久都需要操作到时间有关的东西
4137 次点击
所在节点    JavaScript
14 条回复
cydysm
2019-06-14 20:52:17 +08:00
你是说防抖?
xiaopc
2019-06-14 21:04:35 +08:00
ondblclick event?
chord
2019-06-14 21:07:08 +08:00
@xiaopc 是的,onclick 和 ondblclick 事件,不通过延时器单击事件和双击事件共存
chord
2019-06-14 21:08:18 +08:00
@cydysm 是的,不用到延时器
chord
2019-06-14 21:10:16 +08:00
也不能用到任何时间有关的。。。这个题目实在想不出解决方案
xiaopc
2019-06-14 21:14:38 +08:00
@chord 好像真的不行
jQuery 的文档里就提到不建议同时加这两个事件,因为不同系统的 timeout 不好控制
xiangyuecn
2019-06-14 21:21:39 +08:00
怎么会想到用定时器?不应该第一个想到:记录每次单击的时间,然后判断两次单击间的时间间隔么?

分享一下我的理解:

双击===同一位置短时间内的两次单击。记录每次单击的时间,如果这次单击距离上次单击的间隔很短,并且点击坐标在同一位置,说明是双击

这里所说的 单击===同一位置按下和弹起,并且没有发生移动行为

同理,“长按” 操作 也可以这样处理
ETiV
2019-06-14 21:48:15 +08:00
window.requestAnimationFrame

https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame

数帧数就好了……严格来说跟时间无关…
chord
2019-06-14 22:49:51 +08:00
@xiangyuecn 意思就是不记录时间呢?哈哈哈
Chingim
2019-06-14 23:36:01 +08:00
单击和双击的区别是什么?不就是时间吗?
sudoer
2019-06-15 00:28:43 +08:00
@ETiV 请问具体怎么实现? requestAnimationFrame 是将事件能跑到 60 帧去。。。想不来怎么做能判断单双击
ETiV
2019-06-15 07:27:09 +08:00
@sudoer 任何跑得起来的大系统都是个巨大循环,最外层都是 while true,用 reqAni 也是同理

然后基本就是通过全局状态,记录某一次单击的 frameId、判断再次单击时的新 frameId、对比两个 id 的差值,差得比较近的,模拟触发双击
crs0910
2019-06-15 16:36:23 +08:00
click 事件弄个 css 遮罩?
jiejiss
2019-06-15 20:06:04 +08:00
防抖都是在时间上定义的(否则何来“抖”?)
不让用时间的话,只好想办法弄来时间了
比如楼上提到的 requestAnimationFrame
或者是用没被封的 API 例如 performance.now
再或者你给某个指定的 server url 发 request,让 server sleep 1000ms 再发送应答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/574071

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX