使用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函数
答案 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);
}