jQuery post () con serialización y datos adicionales


147

Estoy tratando de averiguar si es posible publicar serialize()y otros datos que están fuera del formulario.

Esto es lo que pensé que funcionaría, pero solo envía 'wordlist'y no los datos del formulario.

$.post("page.php",( $('#myForm').serialize(), { 'wordlist': wordlist }));

¿Alguien tiene alguna idea?

Respuestas:


329

Puede usar serializeArray [docs] y agregar los datos adicionales:

var data = $('#myForm').serializeArray();
data.push({name: 'wordlist', value: wordlist});

$.post("page.php", data);

11
Hmm Creo que me gusta más que mi solución :) Puedo comenzar a hacer esto en el futuro.
Michael Mior

@Gudradain: Funciona bien: jsfiddle.net/fnjncqhv . Si no funciona para usted, se enfrenta a un problema diferente.
Felix Kling

No, no lo hace. jsfiddle.net/fnjncqhv/1 serializeArray () produce una matriz de objetos, cada objeto contiene una sola propiedad, si su objeto de datos contiene más de 1 propiedad (como en su ejemplo), produce un objeto no válido y no se vinculará del lado del servidor Edite su respuesta para solucionar el problema.
Gudradain

2
@Gudradain: Vea mi comentario sobre su respuesta. Está usted equivocado. serializeArrayno produce la estructura que crees que tiene. No estoy seguro de lo que estás tratando de mostrar con tu demo. Solo está alertando la longitud de la matriz. Si mi demo no te convence, echa un vistazo a la documentación .
Felix Kling

1
@FelixKling Lo siento por ese momento fallido y gracias por la explicación. No me di cuenta de que realmente necesita el formato {nombre: 'su-nombre-de-parámetro', valor: 'su-valor-parámetro'}, para cada parámetro que desee agregar.
Gudradain


9

Una solución alternativa, en caso de que necesite hacer esto al cargar un archivo ajax:

var data = new FormData( $('#form')[0] ).append( 'name' , value );

O incluso más simple.

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

    e.preventDefault();
    var data = new FormData( this ).append('name', value );

    // ... your ajax code here ...

    return false;

});

5

Cuando desee agregar un objeto javascript a los datos del formulario, puede usar el siguiente código

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeArray();
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        postData.push({name:key, value:data[key]});
    }
}
$.post(url, postData, function(){});

O si agrega el método serializeObject () , puede hacer lo siguiente

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});

1
Básicamente, esto generará una matriz similar [{name: 'wordlist'}, {value: wordlist}]. Eso no está en un formato que jQuery entienda, así que dudo que esto realmente funcione.
Felix Kling

@FelixKling serializeArray () produce [{name1: 'value1'}, {name2: 'value2'}]. Si tiene un objeto de datos {name3: 'value3', name4: 'value4'} y lo inserta en la matriz de serializeArray (), obtiene [{name1: 'value1'}, {name2: 'value2'}, { nombre3: 'valor3', nombre4: 'valor4'}]. El último objeto en la matriz no es válido y no obtendrá resultados.
Gudradain

" serializeArray()producir [{name1: 'value1'}, {name2: 'value2'}]". No, no es así: jsfiddle.net/akyz1Lcy
Felix Kling

4

En la nueva versión de jquery, podría hacerlo a través de los siguientes pasos:

  • obtener param array a través de serializeArray()
  • llamar push()o métodos similares para agregar parámetros adicionales a la matriz,
  • llame $.param(arr)para obtener una cadena serializada, que podría usarse como parámetro de jquery ajax data.

Código de ejemplo:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}

3
$.ajax({    
    type: 'POST',  
    url: 'test.php',  
    data:$("#Test-form").serialize(),  
    dataType:'json',
     beforeSend:function(xhr, settings){
     settings.data += '&moreinfo=MoreData';
     },
    success:function(data){
            //  json response  
    },
    error: function(data) { 
        // if error occured
    }
    });

2

Puede hacer que el formulario contenga los datos adicionales como campos ocultos que establecería justo antes de enviar la solicitud AJAX a los valores correspondientes.

Otra posibilidad consiste en usar esta pequeña joya para serializar su formulario en un objeto javascript (en lugar de una cadena) y agregar los datos que faltan:

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);

No hay una función existente nombrada serializeObject. ¿De dónde sacaste eso?
Jereme causando el

1

Puedes usar esto

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);

0

Me gusta mantener los objetos como objetos y no hacer ningún tipo de cambio loco. Aquí esta mi camino

var post_vars = $('#my-form').serializeArray();
$.ajax({
  url: '//site.com/script.php',
  method: 'POST',
  data: post_vars,
  complete: function() {
    $.ajax({
      url: '//site.com/script2.php',
      method: 'POST',
      data: post_vars.concat({
        name: 'EXTRA_VAR',
        value: 'WOW THIS WORKS!'
      })
    });
  }
});

¡Si no puede ver desde arriba, utilicé la función .concat y pasé un objeto con la variable de publicación como 'nombre' y el valor como 'valor'!

Espero que esto ayude.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.