Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测Javascript中的按住鼠标单击_Javascript_Google Maps - Fatal编程技术网

检测Javascript中的按住鼠标单击

检测Javascript中的按住鼠标单击,javascript,google-maps,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 increaseR

这是我的密码:

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)
  }
}
当我按下时,increaseRad运行,但内部的while循环从未结束


知道为什么吗?

这里的问题是,您的代码以阻塞循环的形式运行

while(mouseDown){
  console.log("mouse is still down");
  rad++;
  console.log(rad)
}
浏览器在单个线程中计算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;
});

这些异步操作addEventListener、setTimeout不会阻止主线程。

如果连续多次单击,则会得到错误的单击并保持。更好的解决办法是

var mouseIsDown = false;
var idTimeout;

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

window.addEventListener('mouseup', function() {
  clearTimeout(idTimeout);
  mouseIsDown = false;
});

我相信你这里的问题是,你正在增加和减少mousedown的值,而不是简单地将其设置为true/false,然后检查这是否有帮助。不,这没有什么区别。我认为onmousedown异步运行函数,因此该值被设置为true,if语句被运行。但这似乎没有什么问题这里的问题是,你的检查,看看鼠标是否真的下降似乎被调用了一次,这应该是在自己的功能跟踪你何时进入鼠标和何时离开它。然后需要在onmousedown中调用此函数。这完全有道理!!见我的编辑。。它进入了一个无限的while循环现在要打破这个循环,你要做的就是像以前一样将mouseDown声明为一个全局范围变量。然后,当您的onmouseup被触发时,它应该将该全局变量设置为false并中断循环。另外,制作一个额外的函数并将while循环放入其中,以避免由于您当前仍在另一个事件中而无法调用另一个事件。在本例中,它只能在mouseup的最末端发现mousedown hold。使用mousedown函数中带有setTimeout的回调函数,它可以更早地发现它,并在此基础上执行一些操作。不需要更改代码,只是想指出,如果OP希望在暂停时通知用户。请看,我想要的是整数递增,比如每10毫秒递增一次。我按住鼠标的时间越长,整数就越大。在setTimeout的回调中不应该有一个整数的限制增量,如果鼠标按下,再次递归启动超时。哇。这是最简单的方法吗。我要试一试!哦,那很容易!!谢谢你的帮助!