2010-10-14 12 views
32

Ich habe ein wenig in der Dokumentation gesucht und eine Weile im Internet verbracht, aber ich kann keine Lösung finden! Ich möchte, dass die Warnung mir sagt, welche Iteration von jedem() es war, als auf .thumb geklickt wurde.Jquery jedes() Counter

ZB: Es gibt sechs .thumb's Ich klicke auf Nummer 3, der Browser erscheint 3!

Was tatsächlich passiert ist unabhängig davon, welche .thumb geklickt wird, 6 erscheint.

var counter = 1; 
$('.thumb').each(function() { 
    $(this).click(function() { 
     alert (counter); 
    }); 
    counter++; 
}); 

Jede Hilfe wird dankbar angenommen.

Antwort

59

Das ist, weil Sie das gleiche counter Variable für allclick Handler teilen, und es ist, was es am Ende der Schleife endet als. Verwenden Sie stattdessen die man in die Schleife übergeben (der Index-Parameter des .each(), die schon da ist), wie folgt aus:

$('.thumb').each(function (i) { 
    $(this).click(function() { 
     alert (i+1); //index starts with 0, so add 1 if you want 1 first 
    }); 
}); 

You can test it here.

0

Der Aufruf von function() ist eine anonyme Funktionsdeklaration. Sie müssen verstehen, wie LISP-Funktionen funktionieren (ja, ecmascript ist lisp).

Statt $ ('Daumen.') Jeweils, sollten Sie so etwas wie (ungetestet) benutzen.

var list = $('.thumb'); 
for(var i=0; i<list.length; i++) { 
    $(list[i]).click(function(){ 
     alert(i); 
    }); 
} 
+1

Dies löst das Problem nicht, es ist viel weniger effizient, aber das gleiche Problem einer gemeinsamen Variablen, sie werden alle alarmieren, was "ich" am Ende der Schleife war. –

+0

@Nick ist richtig. Dies würde das gleiche Ergebnis wie in der Frage ergeben. – user113716

+0

Ok, mein Schlechter. Ich sollte das nicht ohne Test veröffentlichen. –

0

eine Lösung zu verwenden, wie @Paulo vorgeschlagen, würden Sie so wie dies zu tun:

var list = $('.thumb'); 

for(var i=0; i<list.length; i++) { 
    (function(i_local) { 
     list.eq(i).click(function(){ 
      alert(i_local); 
     }); 
    })(i + 1); 
}​ 

... obwohl ich use @Nicks .each() solution instead würde. Viel sauberer.