2011-11-28 16 views
12

Desidero ripetere un modulo, aggiungendo ogni elemento a un'area. Il problema è che alcuni di questi elementi sono select, input e textbox. So che posso usare :input per risolvere il problema qui (anche se non ne ho davvero bisogno). Il problema è che ho difficoltà a determinare come posso vedere se l'elemento è un'area di testo, input, select, ecc. Ho bisogno di farlo correttamente perché, per quanto ne so, jQuery("input#someinput").val() funziona alla grande per gli input, ma per una textarea potrebbe essere necessario jQuery("textarea#sometexarea").text(). Non sono sicuro se questo esiste ...determinazione dell'input vs textarea in jQuery

Comunque, ecco la mia funzione finora:

function getAllFormElements(id) { 

    var elements = new Array(); 

    jQuery(id).children().map(function(){ 

     for (var index = 0; index < children.length; index++) { 

      elements[i] = jQuery(children[i]).val(); 

     } 

    }) 

     return elements; 
} 

risposta

46

val() funziona altrettanto bene con <input>, <select> e <textarea> elementi.

Se si desidera continuare a determinare il tipo effettivo di elementi abbinati dal selettore :input, è possibile utilizzare is() con element selectors:

$(":input").each(function() { 
    var $this = $(this); 
    if ($this.is("input")) { 
     // <input> element. 
    } else if ($this.is("select")) { 
     // <select> element. 
    } else if ($this.is("textarea")) { 
     // <textarea> element. 
    } 
}); 
+0

Perfetto. Proprio quello di cui avevo bisogno. Grazie. – zeboidlund

+0

+1, bella soluzione 'Frédéric', l'ho trovata oggi e ha funzionato anche per me. @aboutblank: dovresti contrassegnare questa risposta come accettata in quanto sembra aver risolto anche il tuo problema. – Nope

+0

Ho appena fatto, grazie per la notifica. :) – zeboidlund

0

$.val() lavori per entrambi gli ingressi e le aree di testo. Hai solo bisogno di $.text() per cose come le div che non hanno un "valore" di per sé.

3

Dovresti essere in grado di utilizzare la funzione .is() di jQuery: basta passare un selettore a .is() e restituirà true se l'elemento corrisponde al selettore. Così, per vedere se si ha una textarea, si sarebbe solo controllare:

if($(this).is("textarea")) { doStuff(); } 

http://api.jquery.com/is/

0

Sei forse cercando il $(children[i]).attr("tagName");, che restituisce il tag dell'elemento , essere selezionato, inserito o textarea?

3

Guarda la proprietà nodeName.

jQuery(id).children().map(function(){ 
    console.log(children[i].nodeName.toLowerCase()); 
}); 

È possibile, ma non c'è bisogno di utilizzare il metodo is da jQuery (overhead qui).

+0

L'uso di' nodeName' va bene, ma attenzione al caso.A seconda del tipo di documento (HTML o XML) il caso del valore restituito non sarà lo stesso (rispettivamente maiuscolo o asimmetrico). –

+1

hai ragione, ho aggiornato lo snippet di codice :) – pomeh

0

Guardando la documentazione per jQuery, si può facilmente ottenere tutti gli ingressi modulo utilizzando $(:input): http://api.jquery.com/input-selector/

Descrizione: Seleziona tutti gli elementi di input, textarea, selezionare e pulsante. Il: selettore di input seleziona fondamentalmente tutti i controlli di modulo.

.val() funziona anche con aree di testo, ma c'è un avvertimento ... vedere la documentazione di riferimento: http://api.jquery.com/val/

Frederic ha postato la sua risposta mentre stavo scrivendo questo, e la sua soluzione di utilizzare is() certamente prova.