用事件参数调用Javascript setTimeout函数?

时间:2010-11-30 13:23:35

标签: javascript jquery settimeout

使用setTimeout时拉入事件对象的最佳方法是什么?我正在使用jQuery来处理所有浏览器中事件模型的规范化,但我不确定如何将'e'对象放入checkPos函数中。

我目前的代码:

function MouseDownEvent(e) {
    *snip*
    timeoutID = setTimeout(checkPos(e), 500);
}
function checkPos(e) {
    //function uses e on a timeout of 500ms
    timeoutID = setTimeout( checkPos(e) }, 500);
}

目前该代码只运行一次因为在mousedown事件中调用该函数,但在用户移动鼠标时从不更新e对象。 FF javascript错误控制台还声明它是'一个无用的setTimeout调用(在参数周围缺少引号?)',但是遵循该建议会导致它完全失败。

如何从setTimeout调用中提取'e'事件参数?

编辑:在代码中添加每500ms重新运行checkPos函数

4 个答案:

答案 0 :(得分:10)

尝试:

function MouseDownEvent(e) {
    *snip*
    timeoutID = setTimeout(function(){checkPos(e);}, 500);
}
function checkPos(e) {
    //function uses e on a timeout of 500ms
}

由OP评论编辑..

每次触发checkPos时都可以访问更新的事件:

var myNamespace = {};

$('body').mousemove(function(e) {
    myNamespace.mouseEvent = e; 
});

function checkPos() {
    doSomethingWith(myNamespace.mouseEvent);
}

timerID = setInterval(checkPos, 500);

答案 1 :(得分:7)

首先你为什么要使用两次超时?在我看来,setInterval()会更好

function MouseDownEvent(e) {
 *snip*
 clearInterval(intervalID);
 intervalID = setInterval(function(){checkPos(e);}, 500);
}

其次,请你澄清一下:“......但是当用户移动鼠标时,永远不会更新e对象。”为什么用户移动鼠标时会更新事件对象?您只分配了一个mouseDown处理程序。如果你想在每次鼠标移动时做一些事情,那么你应该使用mouseMove事件,在这种情况下,无论如何都不需要超时/间隔。

function MouseMoveEvent(e) {
 //called every time the mouse is moved, event object will contain position
}

与JavaScript一样,您应首先寻找事件驱动的解决方案,并且只在必要时才使用定时处理程序。

*编辑 - 解决在评论中提出的问题*

var handler = {
    i : 0,
    function : mouseMoveEvent(e) {
      handler.i++;
      if (handler.i % 100 == 0) {
        //Do expensive operations
      }
    }
}

$(myElement).bind("mousemove", handler.mouseMoveEvent);

答案 2 :(得分:1)

您可以使用咖喱功能,jQuery here有一个。

一般来说,你会这样:

function foo(a, b)
{
    alert(a + b);
}

var bar = curry(foo, 1);

bar(2); // alerts 3, as if you had called foo(1, 2)

所以你可以这样做:

setTimeout(curry(checkPos, e), 500);

由于curry返回一个函数,它的第一个参数绑定到e,你可以直接将它传递给setTimeout。

答案 3 :(得分:1)

据我所知,IE不允许像你需要的那样传递“event”对象。

我能想到的唯一解决方法是预先存储您需要的任何值作为全局变量,然后在延迟函数中检查该变量。

例如:http://jsfiddle.net/YvYtn/1/

这将显示最后的X位置,您可以存储事件对象所需的任何内容。

JS代码:

var _lastPosX= null;
function MouseDownEvent(evt) {
    if (typeof evt == "undefined" || !evt)
        evt = window.event;
    _lastPosX = (evt.clientX || evt.pageX);
    timeoutID = window.setTimeout("checkPos();", 500);
}
function checkPos() {
    alert(_lastPosX);
}