2010-01-07 14 views
110

Tengo una función jQuery ajax y me gustaría obtener un formulario completo como datos de la publicación. Estamos constantemente actualizando el formulario, por lo que resulta tedioso actualizar constantemente las entradas del formulario que se deben enviar en la consulta.Pase el formulario completo como datos en la función jQuery Ajax

+0

Moh es correcto sobre FormData() y las imágenes. Pero para aclarar más. Es que la serialización solo funciona en cadenas (no en datos binarios). la función FormData() funciona con formularios que tienen el tipo de codificación establecido en "multipart/form-data". Detalles aquí: https://developer.mozilla.org/en-US/docs/Web/API/FormData –

Respuesta

229

Hay una función que hace exactamente esto:

http://api.jquery.com/serialize/

var data = $('form').serialize(); 
$.post('url', data); 
+3

$ .post también puede llamar a una función en caso de éxito. $ .post ('url', data, function() {....}); – slm

+16

nota: los campos de formulario deben tener el atributo de nombre establecido, usar solo ID no funciona como se documentó y como descubrí de primera mano. –

+2

Genio, gracias !! –

14

Uso

serialize()

var str = $("form").serialize(); 

Serializar un formato a una cadena de consulta, que podría ser enviada a un servidor en una petición Ajax.

23

En el uso general serialize() en el elemento de formulario.

Tenga en cuenta que las <opciones> selectas se serializan con la misma clave, p. Ej.

<select id="foo" name="foo" multiple="multiple"> 
    <option value="1">one</option> 
    <option value="2">two</option> 
    <option value="3">three</option> 
</select> 

resultará en una cadena de consulta que incluye múltiples ocurrencias de la misma parámetro de consulta:

[path]?foo=1&foo=2&foo=3&someotherparams... 

que puede no ser lo que quiere en el back-end.

utilizo este JS código para reducir múltiples parámetros a una tecla separada por comas sola (sin vergüenza copiado de la respuesta de un comentarista en un hilo sobre en casa de John Resig):

function compress(data) { 
    data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3"); 
    return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data; 
} 

que convierte a la anterior en:

[path]?foo=1,2,3&someotherparams... 

En su código JS que se dice así:

var inputs = compress($("#your-form").serialize()); 

Espero que ayude.

+1

Eso es genial. Sí, debería estar separado por comas. –

+0

Si está utilizando PHP, es trivial analizar una cadena de consulta mediante la función parse_url: http://us3.php.net/manual/en/function.parse-url.php – Lobos

+0

Sé que esto es antiguo, pero ¿cómo sabe qué la (s) opción (es) se seleccionaron usando este método? – yardpenalty

23

serialize() no es una buena idea si desea enviar un formulario con el método de publicación. Por ejemplo, si quieres pasar un archivo a través de ajax, no va a funcionar.

la mejor solución es hacer una FormData y enviarlo:

var myform = document.getElementById("myform"); 
    var fd = new FormData(myform); 
    $.ajax({ 
     url: "example.php", 
     data: fd, 
     cache: false, 
     processData: false, 
     contentType: false, 
     type: 'POST', 
     success: function (dataofconfirm) { 
      // do something with the result 
     } 
    }); 
+0

¿No funciona solo con HTML5? –

+1

Sí, es compatible con navegadores actualizados, pero al usar serialización solo puede pasar cadenas. –

+1

Tal vez deberías mencionar eso en tu respuesta –

0

Una buena opción jQuery para hacer esto es a través de FormData. ¡Este método también es adecuado para enviar archivos a través de un formulario!

<form id='test' method='post' enctype='multipart/form-data'> 
    <input type='text' name='testinput' id='testinput'> 
    <button type='submit'>submit</button> 
</form> 

Su función de envío de jQuery se vería así:

$('form#test').submit(function(){ 
    var data = new FormData($('form#test')[ 0 ]); 

    $.ajax({ 
     processData: false, 
     contentType: false, 

     data: data, 
     dataType: 'json', 
     type: $(this).attr('method'); 
     url: 'yourapi.php', 
     success: function(feedback){ 
     console.log("the feedback from your API: " + feedback); 
     } 
}); 

para añadir datos a su forma se puede utilizar una entrada oculta en su forma, o lo añade al vuelo:

var data = new FormData($('form#test')[ 0 ]); 
data.append('command', 'value_for_command'); 
-1
<form id="add-item-form"> 
    . . . 
</form> 

<script> 
    $('#add-item-form').submit(function (event) { 
     event.preventDefault(); 
     var data = $('#add-item-form').serialize(); 
     $.post("/Item/AddItem", data, function (response) { 
      . . . 
     }); 
    }); 
</script> 
0

sólo hay que publicar los datos. y el uso de la función jquery ajax establece los parámetros. Aquí hay un ejemplo.

<script> 
     $(function() { 

      $('form').on('submit', function (e) { 

       e.preventDefault(); 

       $.ajax({ 
        type: 'post', 
        url: 'your_complete url', 
        data: $('form').serialize(), 
        success: function (response) { 
         //$('form')[0].reset(); 
         // $("#feedback").text(response); 
         if(response=="True") { 
          $('form')[0].reset(); 
          $("#feedback").text("Your information has been stored."); 
         } 
         else 
          $("#feedback").text(" Some Error has occured Errror !!! ID duplicate"); 
        } 
       }); 

      }); 

     }); 
    </script> 
Cuestiones relacionadas