2012-12-05 88 views
0

我想要完成的任務: 我有各有一個DOM節點的引用對象的數組,我跟.getNode()打電話。我正在嘗試爲數組中的每個對象分配一個事件處理程序,以便單擊時,alert()將爲數組中的給定對象調用.name四處逛逛關閉在Array(JavaScript)的事件分配給對象時

我試過的東西: 我有一個循環分配事件,但我遇到了麻煩閉幕。我現在所擁有的方式是,所有對象共享相同的事件(循環中的最後一個),並且單擊時,所有對象都會提供相同的消息。

EventUtil獨立添加事件處理程序瀏覽器。它不應該包含任何錯誤。

for (var i = 0; i < arrayWithObjects.length; i++) { 
    EventUtil.addHandler(arrayWithObjects[i].getNode(), "contextmenu", function(event){ 
     event = EventUtil.getEvent(event); 
     event.preventDefault(); 
     alert('right click on '+arrayWithObjects[i].name); 
     event.stopPropagation(); 
    }); 
} 
+1

但是,爲什麼你分配的事件大概是通過你的處理函數傳入的呢? –

+0

你有一個好點。謝謝! – DudeOnRock

回答

1

這應該做的伎倆:

for (var i = 0; i < arrayWithObjects.length; i++) { 
    (function(obj) { // new function scope 
     EventUtil.addHandler(obj.getNode(), "contextmenu", function(event) { 
      event = EventUtil.getEvent(event); 
      event.preventDefault(); 
      alert('right click on ' + obj.name); 
      event.stopPropagation(); 
     }); 
    })(arrayWithObjects[i]); // pass in current object 
}​ 
+0

太快了!謝謝,它工作,這是有道理的。 – DudeOnRock

+1

詛咒。再次被AT&T挫敗。 –

2
for (var i = 0; i < arrayWithObjects.length; i++) { 
    (function(i){ 

    EventUtil.addHandler(arrayWithObjects[i].getNode(), "contextmenu", function(event){ 
     event = EventUtil.getEvent(event); 
     event.preventDefault(); 
     alert('right click on '+arrayWithObjects[i].name); 
     event.stopPropagation(); 
    }); 

    })(i) 
} 

我是按值傳遞,併爲這個定義上飛功能,每次創建一個新的倒閉,使地方。