2010-09-02 28 views
6

Tengo un formulario que se crea dinámicamente utilizando ajax (ya que los datos de los elementos del formulario provienen de una base de datos) y quiero serializar los elementos del formulario para enviar por ajax Actualmente estoy haciendo una prueba mi teoría utilizando el código de la página web de jQuery sólo para ver si puedo recoger los elementos de forma y aquí es donde radica el problema:jQuery serializeArray no selecciona elementos de formulario creados dinámicamente

$(document).ready(function() { 
    $('#btnCustomSearch').live('click', function() { 
      $('#results').html(''); 
      alert($('#customSearchTable :input').serializeArray()); 
      // get all the inputs into an array. 
      var fields = $('#customSearchTable :input').serializeArray(); 
      jQuery.each(fields, function(i, field) { 
       $("#results").append(field.name + " = " + field.value + ", "); 
      }); 

      // now we'll reformat the data as we need 

      // here we'll send the data via ajax 

    }); 
}); 

que tenga que hacer algunos cambios en los datos anteriores a la presentación y este código aún no está escrito, pero lo que estoy descubriendo es que cualquier elemento de entrada en la página que existía en el momento de cargar la página se selecciona correctamente, cualquier elemento que se rellena con Javascript se selecciona correctamente, pero cualquier creado usando ajax son ignorados.

Sé que esto se resuelve normalmente utilizando "en vivo", pero estoy claro en cuanto a cómo resolver esto con serializeArray(). Usando Ajax se agregan elementos de formulario adicionales al #customSearchTable y estos son los que no se recogen.

Cualquier ayuda muy apreciada.

Gracias

+1

A este método no le importa cuando los elementos se agregaron, parece que no se están agregando correctamente como elementos de formulario, ¿se puede publicar ese código? Por ejemplo, ¿tienen un atributo 'name' en ellos? –

+0

Nick, muchas gracias, tienes razón, a los elementos de formulario generados dinámicamente les faltaba el atributo de nombre ... DOH !!! ¡¡Muchas gracias!! – Cydaps

Respuesta

7

Voy a exponer sobre el comentario un poco más aquí:

Cuando se llama a .serializeArray() se bucle a través de una presentación al igual que lo haría <form> o lo más cerca posible de todos modos, para obtener los elementos para ser presentadas. La parte clave is here:

.filter(function() { 
    return this.name && !this.disabled && 
     (this.checked || rselectTextarea.test(this.nodeName) || 
     rinput.test(this.type)); 
}) 

Así como un <form> presentar no incluiría elementos sin name attribute, la .filter() llamada utilizando this.name filtrará aquellos elementos fuera de los que se va a serializar.

+0

Gracias Nick, espero que lo aclare para cualquier otra persona que tenga el mismo problema. – Cydaps

+0

tiene una solución para los elementos '