在 Javascript 中检测按住鼠标单击

Gre*_*ory 2 javascript google-maps

这是我的代码:

var mouseDown = false;

document.body.onmousedown = function() { 
  console.log("MOUSE DOWN");
  mouseDown = true;
  increaseRad();
}
document.body.onmouseup = function() {
  console.log("MOUSE UP");
  mouseDown = false;
}

function increaseRad(){
  rad = 0;
  while(mouseDown){
    console.log("mouse is still down");
    rad++;
    console.log(rad)
  }
}
Run Code Online (Sandbox Code Playgroud)

当我按下时,increaseRad运行,但里面的 while 循环永远不会结束。

知道为什么吗?

Dan*_*nce 6

这里的问题是您的代码作为阻塞循环运行。

while(mouseDown){
  console.log("mouse is still down");
  rad++;
  console.log(rad)
}
Run Code Online (Sandbox Code Playgroud)

浏览器在单个线程中计算 Javascript,并且该循环永远不会暂停以让浏览器处理这些事件处理程序。

相反,您可以仅使用异步函数来侦听 mousedown 事件,然后启动计时器。如果计时器结束时鼠标仍然按下,那么您可以将其算作长按。

var mouseIsDown = false;

window.addEventListener('mousedown', function() {
  mouseIsDown = true;
  setTimeout(function() {
    if(mouseIsDown) {
      // mouse was held down for > 2 seconds
    }
  }, 2000);
});

window.addEventListener('mouseup', function() {
  mouseIsDown = false;
});
Run Code Online (Sandbox Code Playgroud)

这些异步操作(addEventListenersetTimeout)不会阻塞主线程。