【问题标题】:JavaScript setTimeout() can't trigger itselfJavaScript setTimeout() 无法自行触发
【发布时间】:2016-01-06 14:15:35
【问题描述】:

由另一个函数触发的函数如何获取鼠标的位置?这是我的代码:

function myFunction(e){
    setTimeout(function(){
        if(isMouseDown == true){
            mouseX = e.clientX;
            mouseY = e.clientY;
            document.getElementById('myElement').innerHTML = mouseX + ' , ' + mouseY;
            myFunction(event);
        } else {}
    }, 100);
}

它的作用是在点击时显示坐标。如果isMouseDown == true,我需要它每 100 毫秒显示一次。

谢谢

【问题讨论】:

  • 你想达到什么目的?
  • 您可能想要使用 mousemove 事件处理程序,并在其中检查按钮是否也被按下......
  • 但是为什么“不能自己触发”呢?
  • setTimeout(function me(){ 然后从内部,me()
  • @SenadMeškin:匿名函数可以调用arguments.callee() 自行运行。

标签: javascript settimeout


【解决方案1】:

您想要实现的目标有点模糊,但是如果您使用setTimeout(),您将不会收到定期事件。听起来您正在寻找setInterval()。请看下面的例子:

  var mouseX = 0;
  var mouseY = 0;
  var isMouseDown = true;
  document.onmousemove = function(e){
    mouseX = e.pageX;
    mouseY = e.pageY;
  }
  setInterval("myFunction()", 100);
    
  function myFunction(){
    if(isMouseDown) { 
       document.getElementById('myElement').innerHTML = mouseX + ' , ' + mouseY;
    }
  }
<div id="myElement"></div>

【讨论】:

  • 是否要在传递给 setTimeout 时运行该函数?
  • 什么是isMouseDown
  • oP在他的帖子中提到的变量...我没有在示例中声明它。
【解决方案2】:

在 Javascript 中,随机 Javascript 函数无法获取鼠标位置。当前鼠标位置仅来自鼠标相关事件的事件对象。因此,如果您想跟踪鼠标位置,则可以为mousemove 事件和mousedownmouseup 注册一个事件处理程序来跟踪按钮状态。

如果您只想显示鼠标位置,每 100 毫秒,那么您可以设置一个计时器,使其仅显示该频率,但您需要在 mousemove 事件处理程序中跟踪当前鼠标位置。

这是一个简单的代码示例:

var lastMouseX = 0, lastMouseY = 0;
document.addEventListener("mousemove", function(e) {
    lastMouseX = e.clientX;
    lastMouseY = e.clientY;
});

var mouseTimer;
document.addEventListener("mousedown", function() {
    if (!mouseTimer) {
        mouseTimer = setInterval(function() {
            document.getElementById("x").innerHTML = lastMouseX;
            document.getElementById("y").innerHTML = lastMouseY;
        }, 100);
    }
});

document.addEventListener("mouseup", function() {
    clearInterval(mouseTimer);
    mouseTimer = null;
});
<div id="x"></div>
<div id="y"></div>

【讨论】:

  • 请删除“演示即将到来...”部分然后这个答案很好:-)
  • 这就是 cmets 的用途。在答案中这样做是不好的形式。我可能会引用你关于它的大量元帖子。
  • 您可能还需要为“拖动”事件添加监听器。请参阅有关Chrome does not fire mouse move while dragging 的已接受答案。
  • @Traktor53 - 好点,但这取决于 OP 是否希望它在拖动时触发。通常拖动是一个捕获的事件,您不希望触发其他鼠标事件。
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多