2010-12-15 21 views
1

Ich habe mich gefragt, was ich hier falsch gemacht habe. Die erste Funktion läuft gut, wenn die Reset-Taste aufgerufen wird, aber aus irgendeinem Grund tut die zweite Funktion nichts. Das Formular wird zwar zurückgesetzt, aber die zweite Warnung wird nie angezeigt und die Warn-Klasse wird nie entfernt. Danke für Ihre Hilfe!jQuery .each Funktion Hilfe

$('#registration :reset').click(function() { 
    alert("reset was clicked"); 
    $('#registration :text').each(function() { 
     if ($(this).hasclass('warn')) { 
      $(this).removeClass('warn'); 
     } 

     if (!$(this).hasclass('texta')) { 
      $(this).addClass('texta'); 
     } 

     alert("value"); 
    }); 
}); 
+3

Dies löst das Problem wahrscheinlich nicht, aber Sie können das auf '$ ('# registration: text') verkürzen. RemoveClass ('warn'). AddClass ('texta');'. – deceze

+0

Sie sagen, der Gesamtcode funktioniert nur beim ersten Mal, oder die .each() -Methode funktioniert nie? – yoda

+0

Da es tatsächlich * das * Problem lösen kann, habe ich das als Antwort hinzugefügt ... :) – deceze

Antwort

5

Die Javascript Sprache case-sensitive ist. Die hasclass() Methode existiert nicht, aber hasClass() tut. Sie sollten schreiben:

$('#registration :text').each(function() { 
    if ($(this).hasClass('warn')) { 
     $(this).removeClass('warn'); 
    } 

    if (!$(this).hasClass('texta')) { 
     $(this).addClass('texta'); 
    } 

    alert("value"); 
}); 

Das heißt, Sie müssen in der Regel nicht hasClass() vor addClass() oder removeClass() nennen, weil addClass() nicht ein Duplikat hinzufügen, wenn das Element bereits die Klasse hat Sie angeben, und removeClass() won‘ t entferne eine Klasse, die das Element nicht hat. So können Sie einfach schreiben:

$('#registration :text').each(function() { 
    $(this).removeClass('warn'); 
    $(this).addClass('texta'); 
    alert("value"); 
}); 

Oder-Methode verketten wie @deceze tut:

$('#registration :text').each(function() { 
    $(this).removeClass('warn').addClass('texta'); 
    alert("value"); 
}); 
+0

+1 für das Erkennen des Problems. – deceze

1

Versuchen Live zu verwenden, wie sie hinzugefügt und entfernt werden immer,

ich denke, wenn Sie entfernen sie un binded bekommen ..

$('#registration :reset').live('click', function() { 
    alert("reset was clicked"); 
    $('#registration :text').each(function() { 
     if ($(this).hasClass('warn')) { 
      $(this).removeClass('warn'); 
     } 

     if (!$(this).hasClass('texta')) { 
      $(this).addClass('texta'); 
     } 

     alert("value"); 
    }); 
}); 
+0

Ich änderte meinen Code basierend auf Hamidi Vorschlag /// – kobe

4

Versuchen Sie stattdessen:

$('#registration :text').removeClass('warn').addClass('texta'); 

Siehe ze Magik von jQuery!

So ziemlich jede jQuery-Methode funktioniert auf jedes Element, das von der $-Funktion zurückgegeben wird. Es müssen also nicht alle Ergebnisse durchlaufen werden. removeClass und addClass werden auf alle Elemente angewendet, die vom Selektor #registration :text gefunden werden. Darüber hinaus müssen Sie vor dem Entfernen oder Hinzufügen von Klassen keine Prüfungen durchführen. Wenn Sie die Klasse hinzufügen und das Element bereits über die Klasse verfügt, passiert nichts. Umgekehrt zum Entfernen einer Klasse.

Versuchen Sie zu lesen a tutorial, das macht jQuery so mächtig!

+0

hat die Frage zufällig beantwortet :) – yoda

+0

Können Sie bitte erklären, wie das funktioniert? Ich liebe, wie einfach es ist, ich will es einfach wissen. – Samuel

+0

@samuel das heißt Jquery Chaining, das ist gut mit der Leistung auch // – kobe