2012-04-25 244 views
7

如何將參數傳遞給事件處理程序?如何將參數傳遞給事件處理程序

這裏就是我試圖做的,不工作:

for (var i = 0; i < myobj.length; i++) { 
myobj[i].onmouseover = myfun(myobj[i]); 
} 

以下不工作也沒有。

myobj[i].onmouseover = myfun.call(myobj[i]); 
myobj[i].onmouseover = function() {myfun(myobj[i]);}; 
myobj[i].onmouseover = function() {myfun.call(myobj[i]);}; 

我主要感興趣的是它爲什麼不起作用,並且解決方法相同。

謝謝。

回答

9

只需使用創建者函數爲您的處理程序封裝要傳遞的參數即可。

function createHandler(param) { 
    return function() { 
    myfun(param); 
    } 
} 

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = createHandler(myobj[i]); 
} 

您的方法不起作用的原因是,因爲您不傳遞函數引用,而是傳遞函數的結果。因此,在您的第一個示例中,將評估myfun(myobj[i])並將結果作爲事件處理程序傳遞。

我認爲,你的真正意思是,如果事件被解僱,應評估功能。要做到這一點,你必須通過一些全局變量或作爲dataset property來傳遞參數。

但是,更清潔的解決方案是具有如上所示的發電機功能。

+0

非常感謝。正是我需要的。 – 2012-04-25 12:43:55

+0

PS跟進問題。我在做什麼好,有沒有一種慣用的方式來做到這一點?基本上我有一堆span.xyz元素,我希望他們都有一個鼠標懸停行爲。 (但不使用JQuery或任何其他) – 2012-04-25 12:46:04

+1

@XahLee只要你沒有使用任何庫,我認爲這就是最好的選擇。 – Sirko 2012-04-25 12:48:56

3

另一種方法是使用事件onmouseover將作爲方法(不是函數)在引發事件的DOM元素上調用。

換句話說,寫你的代碼,如果你希望別人這樣做:

obj = xahlees(); 
obj.onmouseover(); 

這裏有一個解決方案:

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = function() { myFun(this) }; 
} 

我已經上傳了more complete example

+0

有點晚,但這也是一個很好的解決方案。謝謝萊昂內爾。 – 2013-12-14 06:27:03

相關問題