2011-07-14 60 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」可以根據上下文而不同。 (藝術學校 - 這種事情的良好背景)謝謝! –

相關問題