2010-11-30 66 views
9

使用setTimeout时拉入事件对象的最佳方法是什么?我使用jQuery来处理所有浏览器中的事件模型规范化,但我不知道如何让'e'对象进入checkPos函数。带事件参数的Javascript setTimeout函数调用?

我当前的代码:

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); 
} 

目前因为函数被调用鼠标按下事件代码工作一次,但随着用户移动鼠标永远不会更新电子对象。 FF的JavaScript错误控制台也声明它是'一个无用的setTimeout调用(缺少引号围绕参数?)',但随后的建议导致它完全失败。

如何从setTimeout调用中引入'e'事件参数?

编辑:添加在重新运行checkPos功能每500ms

+1

你的代码,你实际上调用`checkPos`打电话时`setTimeout`(由于函数调用操作符`()`)和它的返回值传递给` setTimeout`;该值可能不是对函数的引用,所以`setTimeout`失败。 – 2010-11-30 13:48:29

回答

7

首先,你为什么使用两个超时?它看起来对我来说的setInterval()会更好

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

其次请你澄清这一点:“......但随着用户移动鼠标永远不会更新电子对象。”为什么当用户移动鼠标时会更新事件对象?您只分配了一个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); 
10

尝试代码:

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

EDIT由于OP评论...

要访问更新后的事件每次checkPos被触发:

var myNamespace = {}; 

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

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

timerID = setInterval(checkPos, 500); 
+0

对不起这个答案,但当我重新运行这个代码把checkPos(e);在每次超时后,它都未能引入更新的e事件。 – 2010-11-30 14:26:17

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) 

,所以你可以这样做:由于咖喱返回一个函数与它的绑定到E的第一个参数

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

,你可以直接将它传递到setTimeout的。

1

至于我可以看到,IE不会允许通过的“事件”对象周围像你所需要的。

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

例如: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); 
}