Übergeben von Parametern für Ereignis-Listener mit Schleifen

8

Nur eine kurze Frage, kann mir jemand sagen, warum das nicht funktioniert und wie man es repariert? Im Wesentlichen nimmt man eine Gruppe von Tabellenzeilen in HTML und fügt ihnen dynamisch Klickereignisse hinzu.

%Vor%

Das Problem mit diesem Code ist, dass die an DropDownManager.onItemClick übergebenen Werte immer die letzten Elemente in der Schleife sind. Dies ist nicht das, was ich im nachher wollte, da ich wollte, dass sie der aktuelle Wert in dieser Stufe der Schleife waren. Ich merke, dass ich etwas ganz einfaches verpasse, aber für das Leben von mir kann es nicht arbeiten!

    
Ian Harrigan 06.08.2011, 16:28
quelle

4 Antworten

14

JavaScript hat keinen Blockbereich, also z. Schleifen erstellen keinen neuen Bereich. Sie können einen mit einer Funktion erstellen:

%Vor%

Je nachdem, was rows und tr sind, benötigen Sie möglicherweise nicht einmal den Schleifenindex. Vielleicht können Sie den Elementindex innerhalb des Ereignishandlers auf andere Weise abrufen. Z.B. Wenn tr ein HTMLTableRowElement [MDN] , dann können Sie seine Position unter den anderen Zeilen über this.rowIndex erhalten.

Übrigens. Warum binden Sie denselben Ereignishandler zweimal?

    
Felix Kling 06.08.2011, 16:35
quelle
4

Neben dem Speichern der Attribute für das DOM-Objekt in der Schleife können Sie auch Funktionsverschlüsse verwenden, um eine Kopie der Variablen in der Schleife für einen bestimmten Funktionsaufruf "einzufrieren". Du kannst es so machen:

%Vor%

Was dies tut, ist, tr.onclick die Ergebnisse der Ausführung eines anonymen Funktionsaufrufs zuzuweisen, der zwei Variablen als Parameter (namens tr und a) akzeptiert und die aktuellen Werte von tr und a als Parameter (diese Übergabe der Aktuelle Werte "frieren" die aktuellen Werte dieser Variablen innerhalb dieses Funktionsabschlusses ein.

Das Ergebnis der Ausführung dieses Funktionsaufrufs ist selbst eine weitere anonyme Funktion. Da diese interne anonyme Funktion nun tr.onclick zugewiesen ist, erstellt sie eine Funktionsschließung, die den gesamten Zustand, der sich gerade in dieser Schließung befindet, am Leben erhält. Dieser Zustand enthält die "eingefrorenen" Werte von tr und a, aber sie bleiben intern nur für diese Funktion geschlossen, so dass jedes Mal durch die Schleife eine neue Funktionsschließung mit einem neuen "eingefrorenen" und "gespeicherten" Wert von tr und a erzeugt wird.

    
jfriend00 06.08.2011 16:59
quelle
0

Teilweise weil ich pedantisch bin und teilweise weil es möglich ist, hier ist das Gleiche einfach erledigt.

%Vor%

Beachten Sie, dass die Tabelle, die enthalten ist, für Ereignisse benötigt wird, um sie zu erreichen. Sie wird durch ihre ID identifiziert, aber Sie können das Element auch direkt übergeben.

    
clockworkgeek 06.08.2011 17:13
quelle
-1
%Vor%

versuchen Sie es auf diese Weise.

Es wird tr übergeben, weil die Variable tr als letzte Zeile gesetzt ist.

    
Senad Meškin 06.08.2011 16:31
quelle