2013-01-02 14 views
30

Zastanawiam się, jaki byłby najlepszy sposób przechodzenia przez wszystkie elementy podrzędne formularza? Mój formularz zawiera zarówno elementy wejściowe, jak i wybrane.Jak przechodzić przez wszystkie elementy formularza jQuery

W tej chwili mam:

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); 
         } 
        }); 
       }); 
      } 

To tylko pętle za pośrednictwem elementów wejściowych formularza chociaż i chcę to select elementy też:

Próbowałem:

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

ale to nie działa. Czy ktoś wie, dlaczego tak się dzieje? Dzięki!

+0

działa dobrze dla mnie: http://jsfiddle.net/ G8tjU/Powinieneś pokazać kod HTML formularza. – JJJ

+1

Potrzebujemy zobaczyć kod HTML. – scoota269

Odpowiedz

57

Od strony jQuery o selektora :input:

Ponieważ: wejście jest rozszerzeniem jQuery i nie jest częścią specyfikacji CSS, kwerendy przy użyciu: wejście nie może skorzystać z wzrost wydajności dostarczone przez natywny DOM Metoda querySelectorAll(). Aby uzyskać najlepszą wydajność podczas używania: wejście do wybierania elementów, najpierw wybierz elementy za pomocą czystego selektora CSS, a następnie użyj .filter (": input").

To najlepszy wybór.

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

Logika jest dobra, ale początkowy selektor jest nieprawidłowy. Filtrujesz element formularza. Aby użyć funkcji filtru, musisz zrobić coś w stylu '#new_user_form *', aby następnie filtrować tylko elementy wejściowe. – scoota269

+1

@ scoota269 Ups, zapomniałem o gwiazdce. Mój błąd! – Ohgodwhy

+0

To działa dobrze. Dzięki! – devoncrazylegs

1

$('#new_user_form :input') powinien być na swój sposób. Zwróć uwagę na pominięcie selektora >. Prawidłowy formularz HTML nie pozwala na wprowadzenie znacznika wejściowego będącego bezpośrednim potomkiem znacznika formularza.

1

Co się stanie, jeśli nie w ten sposób: -

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

Patrz LIVE DEMO

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

To faktycznie działa. Jeśli chcesz uzyskać zaznaczenia i pola tekstowe: $ ('# new_user_form') find ('input, textarea, select'). Each (function() { // twój kod tutaj }); – mpemburn

16

czystym JavaScript nie jest trudne:

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

Uwaga: ponieważ forma .elements jest obiektem dla pętli-in nie działa zgodnie z oczekiwaniami.

Odpowiedź znaleziona here (by Chris Pietschmann), udokumentowana here (W3S).

7

Jako wzięty z #jquery Freenode kanał IRC:

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

Dzięki @Cork na kanale.

+0

Jest to idealne rozwiązanie, jeśli masz słuchacza dla wszystkich formularzy. To jest mój przypadek: '$ ('body'). On ('submit', 'form', function (e) {e.preventDefault(); $ .each ($ (this) .serializeArray(), function (counter , object) {console.log (object)});}); 'Thanks! – Albert

+1

Pierwszym parametrem wywołania zwrotnego jest indeks, więc powinien to być: '$ .each ($ (formularz) .serializeArray(), funkcja (indeks, pole) {});' Ciągle przebudowujący :) –

3

Używam:

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

się wydaje brzydkie, ale dla mnie to jest jeszcze lepszy sposób, aby uzyskać wszystkie elementy z jQuery.

2

Znalazłem ten prosty jquery fragment, być przydatne do wyboru tylko rodzaj selektorów Chcę pracować:


$("select, input").each(function(){ 
    // do some stuff with the element 
}); 
Powiązane problemy