javascript - 如何在 Javascript 中管理异步鼠标事件
问题描述
我有 JavaScript 代码,其中:
- 当用户按下鼠标左键时,会触发一个
mousedown
事件,从而触发对 function 的调用OnMouseDown
。 - 当用户释放鼠标左键时,会触发一个
mouseup
事件,该事件会触发对 function 的调用OnMouseUp
。
这两个事件是异步触发的。
例如,mouseup
事件可以在mousedown
事件触发后(短鼠标单击),在OnMouseDown
结束之前立即触发。(图1)
我想按顺序处理事件,其中函数OnMouseUp
只会在结束后OnMouseDown
开始。
我可以通过防止mouseup
事件在结束后触发(通过在开始时OnMouseDown
调用)来实现这一点( )removeEventListener('mouseup', OnMouseUp)
OnMouseDown
Figure2
但是我可能会mouseup
完全失去一个事件(Figure3
)
图3 -mouseup
事件丢失
我正在寻找一种方法来确保
- 一个
mouseup
事件后一个mousedown
事件没有丢失,并且 - 该
OnMouseUp
功能在结束后OnMouseDown
开始。
以下代码示例演示了该问题:
function sleep1 () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("Finished sleeping");
}, 2000);
});
}
// The mousedown event is fired when a pointing device button (usually a mouse button) is pressed on an element.
document.addEventListener('mousedown', async function(e) {
console.log('BEG OnMouseDown');
let retval = await sleep1();
console.log('retval: ', retval);
console.log('END OnMouseDown');
});
// The mouseup event is fired when a pointing device button (usually a mouse button) is released over an element.
document.addEventListener('mouseup', function(e) {
console.log('BEG OnMouseUp');
console.log('END OnMouseUp');
});
单击鼠标左键并松开,打印输出如下,显示函数 OnMouseUp 在函数 OnMouseDown 结束之前结束,与图 1 吻合。
BEG OnMouseDown
BEG OnMouseUp
END OnMouseUp
Inside OnMouseDown: Finished sleeping
END OnMouseDown
解决方案
您可以尝试异步等待,定义一个异步函数然后在 mouswdown 事件上使用 await 关键字,它不会触发下一个事件,直到异步函数完成
推荐阅读
- sql - Django过滤表的结果与来自另一个表的匹配ID
- c# - 在 c# .net 中为 SKAdnetwork 生成签名广告
- javascript - 如何在 alpine js 中的 x-for 中设置 x-model 和 Input 字段的名称?
- ios - iOS 14 中的 WKWebView 崩溃
- laravel - 如何停止从 laravel 观察者执行控制器中的方法
- python - 通过 kubernetes python API 获取就绪探测状态
- istio - 如何从 istio 入口网关中删除或修改标头
- php - Elasticsearch 如何设置 top_hits 聚合结果的大小?
- ios - 与 WiFi 相比,为什么 Angular HTTP 请求在移动数据上的排队时间要长得多?
- apache-spark - 为什么单个 Broker 设置在单个主题分区而不是多个分区下表现更好