Javascript 在setTimeout回调函数中持久化event.clientX值

Javascript 在setTimeout回调函数中持久化event.clientX值,javascript,events,closures,dom-events,Javascript,Events,Closures,Dom Events,我有一个叫做某个元素的onmouseover的例程。我希望有一点延迟-即在效果发生之前,给用户时间进行mouseout。效果使用event.clientX值。然而,在500毫秒后调用回调时,事件对象似乎不再存在。如何巧妙地保持event.clientX的状态 function showTip(sDivID){ SHOW_TIP_TIMEOUT_ID = setTimeout(function(){ var div = $('#'+sDivID).show()[0];

我有一个叫做某个元素的
onmouseover
的例程。我希望有一点延迟-即在效果发生之前,给用户时间进行
mouseout
。效果使用
event.clientX
值。然而,在500毫秒后调用回调时,
事件
对象似乎不再存在。如何巧妙地保持
event.clientX的状态

function showTip(sDivID){
    SHOW_TIP_TIMEOUT_ID = setTimeout(function(){
        var div = $('#'+sDivID).show()[0];
        div.style.left = event.clientX;
    } ,500)
}

事件对象在IE中是全局的。对于所有浏览器来说,这是一个潜在的快速解析-如果您只是使用clientX整数而不是完整的事件对象,那么只存储整数。比如:

function showTip(sDivID, savedClientX){
    SHOW_TIP_TIMEOUT_ID = setTimeout(function(){
        var div = $('#'+sDivID).show()[0];
        div.style.left = savedClientX;
    } ,500)
}

如果您仅在Internet Explorer中使用此选项,则可以在设置超时之前保存该值:

function showTip(sDivID) {
  var x = event.clientX;
  SHOW_TIP_TIMEOUT_ID = setTimeout(function() {
    var div = $('#' + sDivId).show()[0];
    div.style.left = x;
  }, 500);
}

如果你想让它在其他浏览器上运行,你必须在事件处理程序中抓取事件,或者传递它,或者将它保存在全局(ick)中。由于您使用的是jQuery,它已经为您完成了所有浏览器规范化工作,因此您应该充分利用这一点。

我没有看到代码中定义的事件,它的范围是什么,它来自哪里?@Robert我相信它是DOM的一部分,尽管不同的浏览器有所不同。我主要为InternetExplorer8开发。不,它不是DOM的一部分;它是IE浏览器中的一个
窗口
属性,但不是任何其他浏览器。事件对象仅在Internet Explorer中是全局的,而不是在其他浏览器中。我希望我可以在不更改
showTip()
…@Pointy()的调用签名的情况下完成此操作。感谢IE的使用@El Ronnoco:我会让其他人在不更改sig的情况下创建一个关于如何做到这一点的答案,并将我的答案留给后代。看到web开发以单一浏览器为目标,而创建更通用的软件并不困难,这让人感到悲哀。我知道,令人难过的是——但我在一家只有IE(直到几个月前才有IE6)的公司工作——我们的机器上安装其他浏览器被阻止了。你在干什么?是的,我知道你的意思。然而,总的来说,这是一种悲哀。我个人不怪你:-)