2013-01-02 10 views
30

Mi stavo chiedendo quale sarebbe il modo migliore di eseguire il ciclo di tutti gli elementi figlio di un modulo? Il mio modulo contiene sia elementi di input che select.Come eseguire il ciclo di tutti gli elementi di un modulo jQuery

Al momento ho:

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

Questo solo loop attraverso gli elementi di input della forma e anche se voglio includere gli elementi selezionati anche:

ho provato:

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

ma questo non funziona. Qualcuno sa perché questo sarebbe successo? Grazie!

+0

funziona bene per me: http://jsfiddle.net/ G8tjU/Dovresti mostrare il codice HTML del modulo. – JJJ

+1

Abbiamo bisogno di vedere l'HTML. – scoota269

risposta

57

Dalla pagina jQuery circa il selettore :input:

causa: ingresso è un'estensione jQuery e non fa parte della specifica CSS, query utilizzando: ingresso non può sfruttare la spinta di prestazioni fornite dal DOM nativo metodo querySelectorAll(). Per ottenere le migliori prestazioni quando si utilizza: input per selezionare elementi, prima selezionare gli elementi usando un puro selettore CSS, quindi utilizzare .filter (": input").

Questa è la scelta migliore.

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

La logica è buona, ma il selettore iniziale è sbagliato. Stai filtrando l'elemento del modulo. Per utilizzare la funzione filtro è necessario eseguire qualcosa come "#new_user_form *" per filtrare solo gli elementi di input. – scoota269

+1

@ scoota269 Oops, ho dimenticato l'asterisco. Colpa mia! – Ohgodwhy

+0

Funziona bene. Grazie! – devoncrazylegs

1

$('#new_user_form :input') dovrebbe essere la via da seguire. Annoti l'omissione del selettore >. Un form HTML valido non consentirebbe un tag di input come figlio diretto di un tag form.

1

Cosa succede, se si fa in questo modo: -

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

consultare LIVE DEMO

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

Questo funziona davvero. Se si desidera ottenere anche selezioni e aree di testo: $ ('# new_user_form'). Find ('input, textarea, select'). Each (function() { // your code here }); – mpemburn

16

puro JavaScript non è poi così difficile:

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

Nota: perché la forma .elementi è un ciclo for-in dell'oggetto che non funziona come previsto.

Risposta trovata here (by Chris Pietschmann), documentata here (W3S).

7

Mentre preso dal #jquery Freenode canale IRC:

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

Grazie alla @Cork sul canale.

+0

Questa è una soluzione perfetta se si dispone di un listener per tutti i moduli. Questo è il mio caso: '$ ('body'). On ('submit', 'form', function (e) {e.preventDefault(); $ .each ($ (this) .serializeArray(), function (counter , oggetto) {console.log (oggetto)});}); 'Grazie! – Albert

+1

Il primo parametro del callback è l'indice, quindi dovrebbe essere: '$ .each ($ (form) .serializeArray(), function (index, field) {});' Still Upvoting :) –

3

sto usando:

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

It Seems brutto, ma per me è ancora il modo migliore per ottenere tutti gli elementi con jQuery.

2

Ho trovato questo semplice frammento di codice jQuery, per essere a portata di mano per la scelta solo il tipo di selettori voglio lavorare con:


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