使用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调用(围绕参数缺少引号),但是遵循该建议会导致它完全失败.
解决方法
首先你为什么要用两次超时?它看起来像我的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);