2013-01-02 10 views
30

Ich habe mich gerade gefragt, was der beste Weg wäre, alle Kindelemente eines Formulars durchzulaufen? Mein Formular enthält sowohl Eingabe- als auch Auswahlelemente.Wie man alle Elemente eines Formulars durchläuft jQuery

Im Moment habe ich:

success: function(data) { 
       $.each(data.details, function(datakey, datavalue) { 
        $('#new_user_form > input').each(function(key, value) { 
         if($(this).attr('id') == datakey) { 
          $(this).val(datavalue); 
         } 
        }); 
       }); 
      } 

Diese nur Schleifen durch die Eingabeelemente des Formulars obwohl und ich möchte auch die ausgewählten Elemente enthalten:

Ich habe versucht:

$('#new_user_form > input, #new_user_form > select').each(function(key, value) { 

aber das funktioniert nicht. Weiß jemand, warum das passieren würde? Danke!

+0

funktioniert gut für mich: http://jsfiddle.net/ G8tjU/Sie sollten das HTML des Formulars anzeigen. – JJJ

+1

Wir müssen das HTML sehen. – scoota269

Antwort

57

Von der jQuery Seite über den :input Selektor:

Denn: Eingang ist eine Erweiterung jQuery und nicht der CSS-Spezifikation Teil, Abfragen mit: Eingabe nicht von dem nativen DOM bereitgestellt Vorteil der Leistungssteigerung nehmen Methode querySelectorAll(). Um die beste Leistung zu erzielen, wenn Sie: input zum Selektieren von Elementen verwenden, wählen Sie zuerst die Elemente mit einem reinen CSS-Selektor aus und verwenden dann .filter (": input").

Dies ist die beste Wahl.

$('#new_user_form *').filter(':input').each(function(){ 
    //your code here 
}); 
+1

Die Logik ist gut, aber der anfängliche Selektor ist falsch. Sie filtern das Formularelement. Um die Filterfunktion zu verwenden, müssen Sie etwas wie '#new_user_form *' machen, um dann nur die Eingabeelemente zu filtern. – scoota269

+1

@ scoeta269 Ups, ich habe den Stern vergessen. Mein Fehler! – Ohgodwhy

+0

Das funktioniert gut. Vielen Dank! – devoncrazylegs

1

$('#new_user_form :input') sollte Ihr Weg nach vorne sein. Beachten Sie die Auslassung des > Selektors. Ein gültiges HTML-Formular würde nicht zulassen, dass ein Eingabe-Tag ein direktes Kind eines Formular-Tags ist.

1

Was passiert, wenn Sie auf diese Weise tun: -

$('#new_user_form input, #new_user_form select').each(function(key, value) { 

Siehe LIVE DEMO

8
$('#new_user_form').find('input').each(function(){ 
    //your code here 
}); 
+8

Dies funktioniert tatsächlich. Wenn du auch selects und textareas bekommen willst: $ ('# new_user_form') find ('input, textarea, select') jeder (function() { // Dein Code hier }); – mpemburn

16

reine JavaScript ist nicht so schwierig:

for(var i=0; i < form.elements.length; i++){ 
    var e = form.elements[i]; 
    console.log(e.name+"="+e.value); 
} 

Hinweis: weil Form .elements ist eine Objekt-for-in-Schleife funktioniert nicht wie erwartet.

Antwort gefunden here (by Chris Pietschmann), dokumentiert here (W3S).

7

Wie aus dem #jquery Freenode IRC Kanal genommen:

$.each($(form).serializeArray(), function(_, field) { /* use field.name, field.value */ }); 

Dank auf dem Kanal @Cork.

+0

Dies ist eine perfekte Lösung, wenn Sie einen Listener für alle Formulare haben. Das ist mein Fall: '$ ('body'). On ('submit', 'form', Funktion (e) {e.preventDefault(); $ .each ($ (this) .serializeArray(), Funktion (counter , Objekt) {console.log (Objekt)});}); 'Danke! – Albert

+1

Der erste Parameter des Callback ist der Index, also sollte es sein: '$ .each ($ (form) .serializeArray(), Funktion (Index, Feld) {});' Noch Upvoting :) –

3

Ich verwende:

$($('form').prop('elements')).each(function(){ 
    console.info(this) 
}); 

Es scheint hässlich, aber für mich ist es immer noch der bessere Weg, um alle Elemente mit jQuery zu bekommen.

2

ich diese einfache Jquery Snippet gefunden haben, für die Wahl praktisch, nur die Art der Wähler mit Ich will arbeiten:


$("select, input").each(function(){ 
    // do some stuff with the element 
}); 
Verwandte Themen