2013-07-31 23 views
8

Mam tablicę obiektów (w szczególności easelJS obrazy) - coś takiego:Jak dodać detektory zdarzeń do tablicy obiektów

Co chcę zrobić, to mieć detektor zdarzeń zamiast:

gShape.addEventListener("click", function() {alert"stuff"}); 

Chcę program wiedzieć konkretnie jakim regionie kliknięciu tak, że mogę wysłać okno alertu w następujący sposób:

imageArray[index].addEventListener("click", function(){ 
    alert " you clicked region number " + index} 
+0

Czym się różnisz od tego, co masz? –

+0

Powinno działać. Czy próbowałeś? – putvande

+0

@Jeffman Wygląda na to, że jest w pętli, gdzie 'index' nie byłby poprawny w wywołaniu zwrotnym – Ian

Odpowiedz

7

Coś jak to powinno działać:

for (var i = 0 ; i < imageArray.length ; ++i) { 
    function(index) { 
     imageArray[index].addEventListener("click", function() { 
      alert ("You clicked region number: " + index"); 
     }); 
    } (i); 
} 

Powodem działa dlatego, że tworzy zamknięcie, która posiada wartość index który zostanie pokazany w komunikacie ostrzeżenia. Za każdym razem, gdy pętla tworzy kolejne zamknięcie, ma inną wartość: index.

+0

Ktoś wie, dlaczego zostałem odrzucony? Zastanawiam się. –

+1

Ktoś prawdopodobnie nie sprawdził znacznika czasu i pomyślał, że skopiowałeś powyższą odpowiedź. –

8

Pewnie. Możesz użyć zamknięcia, aby zapisać indeks tej iteracji. W przeciwnym razie są one dzielone przez ten sam zakres funkcji i dają wartość tej samej iteracji. Utworzenie oddzielnej funkcji dla każdej z nich spowoduje zapisanie stanu tej funkcji wewnątrz funkcji.

var imageArray = new Array; 
gShape = new createjs.Shape(); 
// shape is something 
imageArray.push(gShape); // Dumped all the objects 

for(var i=0; i< immageArray.length; i++) { 
    (function(index) { 
     imageArray[index].addEventListener("click", function() { 
      console.log("you clicked region number " + index); 
     }) 
    })(i); 
} 

lub lepiej

for(var i=0; i< immageArray.length; i++) { 
     imageArray[i].addEventListener("click", bindClick(i)); 
} 

function bindClick(i) { 
    return function(){ 
      console.log("you clicked region number " + i); 
      }; 
} 
+1

Możesz robić cokolwiek, ale po prostu usunę pierwszy przykład. Nie tylko jest to, co mają inne odpowiedzi, nie sądzę, że powinno to kiedykolwiek zostać użyte, kiedy możesz użyć czegoś czystszego i bardziej wydajnego, jak twój drugi przykład – Ian

+4

@Ian .. Zgadzam się z tobą .. Ale mogą być przypadki kiedy użytkownik może nie zrozumieć, jak to działa, chyba że pojawi się pełny przykład. To jest powód, dla którego pominąłem pierwszy przykład, aby mogli porównać sposób, w jaki pierwszy przykład może być napisany w czystszy sposób –

+0

Dzięki @ Sushanth- - Kończę te "podnoszenie lambda" i zwykle mogę wypracować lepszy sposób, ale dobrze jest widzieć dwie obok siebie. – phatskat

1

Jasne, zamknięcie jest rozwiązanie, ale skoro on ma Ext załadowana mógłby równie dobrze używać go i trochę bardzo czytelny kod. Indeks jest przekazywany jako drugi argument do Ext.Array.each (alias do Ext.each).

Ext.each(imageArray, function(gShape, index) { 
    gShape.addEventListener("click", function() { 
     alert("You clicked region number " + index); 
    }); 
}); 
0

To co używam do div identyfikatorów:

var array = ['all', 'what', 'you', 'want']; 

function fName() { 
    for (var i = 0; i < array.length; i++) 
    document.getElementById(array[i]).addEventListener('click', eventFunction); 
}; 

Powodzenia!