2011-07-14 40 views
2

我再次与我无法理解的JavaScript。传递一个事件和一个变量在Firefox中的匿名函数

我有一个可拖动的图书馆,它有一个被称为像这样(的_ag只是命名空间的东西)命令:

_ag.drag(event,targetDiv); 
// targetDiv can be a string, btw - converted to an element in the function 

所以我有代码看起来像这样(通过一些数据与一个封闭 - 给我一个新的招数):

header.onmousedown=function(targetDiv){ 
    return function(){ 
     _ag.drag(event,targetDiv) 
    } 

}(aTargetDiv) 

很好用!太好了!在... IE浏览器! SF!铬!不在FIREFOX!

不,firefox找不到该事件。现在,通常这是像这样的东西很容易(形成稍有不同 - 希望它仍然有效):

header.onmousedown=function(event){ 
    alert(event.screenX) 
} 

但是如果我决定要传递一些参数,它吹走事件,我想是某种FF中的不可见参数?

//broken thing 1: 
header.onmousedown=function(event){ 
    alert(event.screenX) // somethingToPass in covers event in FF 
}(somethingToPassIn) 


// broken thing 2: 
header.onmousedown=function(event){ 
    alert(event.screenX)  
}(event,somethingToPassIn) // event is undefined 

SO FIREFOX:我如何向您发送活动?希望这是一个非常愚蠢的问题,而且这些人都有答案!在此先感谢,我会在这里将我的头撞在墙上。

+0

它找不到'event',因为你没有指定它为参数。在兼容W3C的浏览器中,'event'对象是传递给事件处理程序的第一个参数。 IE只通过'window.event'提供了另一种方式。 Chrome既可以。我建议你阅读[关于quirksmode.org上的事件处理的优秀文章](http://quirksmode.org/js/introevents.html)。 –

回答

6

Firefox可能不支持event,但会在事件触发时将其传递到您的函数中。所以,

header.onmousedown=function(targetDiv){ 
    return function(e){ 
     e = e || event; //This will give support for global event and passing the event into the function 
     _ag.drag(e, targetDiv); 
    } 
}(aTargetDiv) 

你不需要关闭,除非aTargetDiv变量变化的代码晚些时候。相反,你可以这样做:

header.onmousedown=function(e){ 
    e = e || event; 
    _ag.drag(e, aTargetDiv); 
}; 
+0

神圣的shart!有用!另外:这个东西被动态地应用到所有地方,所以“aTargetDiv”可以根据上下文而不同。 (艺术学校 - 这种事情的良好背景)谢谢! –

相关问题