2008-10-04 15 views
27

Quiero recorrer los elementos de un formulario HTML y almacenar los valores de los campos < de entrada > en un objeto. El código siguiente no funciona, sin embargo:Bucle sobre elementos en jQuery

function config() { 
    $("#frmMain").children().map(function() { 
     var child = $("this"); 
     if (child.is(":checkbox")) 
      this[child.attr("name")] = child.attr("checked"); 
     if (child.is(":radio, checked")) 
      this[child.attr("name")] = child.val(); 
     if (child.is(":text")) 
      this[child.attr("name")] = child.val(); 
     return null; 
    }); 

Ni hace lo siguiente (inspirado por la respuesta de jobscry):

function config() { 
    $("#frmMain").children().each(function() { 
     var child = $("this"); 
     alert(child.length); 
     if (child.is(":checkbox")) { 
      this[child.attr("name")] = child.attr("checked"); 
     } 
     if (child.is(":radio, checked")) 
      this[child.attr("name")] = child.val(); 
     if (child.is(":text")) 
      this[child.attr("name")] = child.val(); 
    }); 
} 

La alerta se referirá child.length == 0. La selección manual de los elementos de obra:

  
>>> $("#frmMain").children() 
Object length=42 
>>> $("#frmMain").children().filter(":checkbox") 
Object length=3 

¿Alguna pista sobre cómo hacerlo en la horquilla?

+0

Su hilo simplemente me salvó 20 minutos de la línea de campos de entrada de línea para múltiples formas -_- ;. +1. – zeboidlund

Respuesta

40

no creo que se necesita citas en esto:

var child = $("this"); 

intento:

var child = $(this); 
+2

¡Qué buena captura! No noté que – Hugoware

+0

¡Gracias! Me está funcionando ahora. –

28

jQuery tiene una función excelente para recorrer a través de un conjunto de elementos: .each()

$('#formId').children().each(
    function(){ 
     //access to form element via $(this) 
    } 
); 
+0

No funciona, vea mi edición de la pregunta. ¿Más ideas? –

+0

El formulario probablemente tendrá un párrafo o algo similar a su hijo. Debe asegurarse de seleccionar solo los elementos de entrada. – SpoonMeiser

+0

"children()" obtiene todos los hijos DOM dentro del formulario, no los elementos. – mpemburn

13

Dependiendo de para qué necesita a cada niño (si está buscando publicarlo en algún lugar a través de AJA) X) puede hacer ...

$("#formID").serialize() 

Crea una cadena para usted con todos los valores automáticamente.

En cuanto al bucle de objetos, también puede hacerlo.

$.each($("input, select, textarea"), function(i,v) { 
    var theTag = v.tagName; 
    var theElement = $(v); 
    var theValue = theElement.val(); 
}); 
3

He utilizado el siguiente antes:

var my_form = $('#form-id'); 
var data = {}; 

$('input:not([type=checkbox]), input[type=checkbox]:selected, select, textarea', my_form).each(
    function() { 
     var name = $(this).attr('name'); 
     var val = $(this).val(); 

     if (!data.hasOwnProperty(name)) { 
      data[name] = new Array; 
     } 

     data[name].push(val); 
    } 
); 

Esto se acaba de escribir de la memoria, por lo que podría contener errores, pero esto debería hacer que un objeto llamado data que contiene los valores de todas las entradas.

Tenga en cuenta que tiene que ocuparse de las casillas de verificación de una manera especial, para evitar obtener los valores de las casillas de verificación no marcadas. Lo mismo es probablemente cierto de las entradas de radio.

También tenga en cuenta el uso de matrices para almacenar los valores, como para un nombre de entrada, puede tener valores de varias entradas (casillas de verificación en particular).

+0

¿Por qué estás escribiendo $ (esto) dos veces ... por qué no almacenar en caché la búsqueda – redsquare

+3

¿Me votaste por eso? $ (esto) no es una búsqueda, está envolviendo un objeto existente con un objeto jQuery. Puede ser ligeramente más eficiente hacer esto solo una vez, pero la diferencia será marginal. – SpoonMeiser

+0

De todas las muchas sugerencias que he visto, esta es la más fácil de implementar. ¡Gracias! – mpemburn

0

si desea utilizar la función de cada uno, que debería tener este aspecto:

$('#formId').children().each( 
    function(){ 
    //access to form element via $(this) 
    } 
); 

Sólo tiene que activar la llave de cierre para un cierre paren. Gracias por señalarlo, Jobscry, me salvaste un tiempo.

+0

¿Por qué publicaste esto como respuesta cuando dices que solo respondes a 'jobscry'? Es el mismo código que publicó. Para eso son los comentarios. –

0

para mí todo esto no funcionó. Lo que funcionó para mí fue algo muy simple:

$("#formID input[type=text]").each(function() { 
alert($(this).val()); 
}); 
-1

Ésta es la forma más sencilla de bucle a través de una forma única para acceder a los elementos del formulario. Dentro de cada función puedes verificar y construir lo que quieras. Al construir objetos, tenga en cuenta que querrá declararlo fuera de cada función.

EDITAR JSFIDDLE

La continuación trabajará

$('form[name=formName]').find('input, textarea, select').each(function() { 
    alert($(this).attr('name')); 
}); 
+0

'$ ('# formId input, select, textarea')' devolverá todos los elementos de 'entrada' en el formulario, junto con * cada cuadro de selección y área de texto en la página *. – cHao

+0

En realidad, no se comporta de esa manera ... Usar ese formato exacto en JSFiddle en realidad dio como resultado solo la selección y el eco del área de texto. Agregar una coma frente a 'entrada' da como resultado lo que dices. – Scottzozer

+0

¿De verdad? Porque http://jsfiddle.net/UDD7E/3/ muestra exactamente de lo que estaba hablando. Ambos cuadros de selección y ambos textareas son rojos, aunque uno de cada uno está fuera del formulario. – cHao

Cuestiones relacionadas