Prototyp fügen Sie Ereignis-listener
Aus irgendeinem Grund, wenn ich versuche, die Zuweisung einer actionlisetner zu der Liste der Elemente den Wert nicht-stick. Hier ist, was ich meine:
Event.observe(window, 'load', function() {
for(i = 1; i <= $$('ul#review_list li').length; i++) {
$('cover_' + i).observe('click', function(event) {
alert(i);
});
}
});
So gibt es 7 Listen-Elemente in #review_list und aus irgendeinem Grund, wenn alle von der li-Elemente klicken Sie auf, bekomme ich ein alert mit dem Wert 8 für jedes element geklickt. Ich möchte jeden warnen, die Ihre jeweiligen ich-Wert. Was mache ich hier falsch?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
Den Grund, warum die erste Methode nicht funktioniert, ist, weil
alert(i)
; erstellt einen Verschluss in der Schleife variablei
, die wird inkrementiert, für jedes Ereignis-Zuordnung. Zur Zeit des ersten event ausgelöst wird, wird der Wert voni
, die Häufig für alle Veranstaltungen ist 8, das ist, warum Sie bekommen 8 keine Rolle, wo Sie klicken.In der zweiten Methode, die ich gepostet,
alert(i)
erstellt einen Verschluss um das argumenti
, die nicht geteilt werden mit anderen Ereignis-listener.Solltest du sowieso Lesen dieser Artikel über JavaScript-Verschlüsse um besser zu verstehen.
var
Schlüsselwort " loop sowieso, sonst kann er sich in andere Themen.Als Ionut G. Stan sagt, das Problem ist der Verschluss über 'ich'. RaYell ist richtig über Ihre wollen, zu erklären, dass die var (aber nicht etwa, dass die Lösung des Problems).
Schleife auch immer wieder zu re-führt die
$$
nennen, was nicht wirklich ideal und vollkommen unnötig Anrufe$
zu look-up-Elemente haben Sie bereits nachgeschaut (via$$
).FWIW:
$$
sucht die Elemente,Enumerable#jeder
iteriert dann über das Ergebnis den Aufruf der Funktion mit dem element Verweis und seine null-basierten index in das array. Der event-handler ist dann eine Schliessung über mehrere Dinge, einschließlich derindex
parameter übergeben in der#each
iterator.Edit: tut mir Leid, ich merkte, ich machte eine massive Annahme, unten: Dass die cover_x Elemente sind, in der Tat, die Liste der Elemente unter review_list. Wenn Sie nicht sind, ignorieren Sie die unten und meine Entschuldigung! - T. J.
So, das funktioniert, aber es ist auch unnötig Komplex. Ereignis-delegation könnte dein Freund hier: Suchen Sie für Klicks auf die Liste, sondern als Liste Elemente:
Versuchen Sie, ein
var
keyword der for-Schleife. Ohnevar
Sie bei der Zuordnung einer globalen variable i, die dann erhöht auf jeder loop-iteration. Also nach der Schleife noch den Wert 8 und Ihrealert
bezieht sich auf diesen Wert.