$ (this) .serialize () - ¿Cómo agregar un valor?

105

actualmente tengo lo siguiente:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize(),
});

Esto funciona bien, sin embargo, me gustaría agregar un valor a los datos, así que intenté

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize() + '&=NonFormValue' + NonFormValue,
});

Pero eso no se publicó correctamente. ¿Alguna idea sobre cómo puede agregar un elemento a la cadena de serialización? Esta es una variable de página global que no es específica de un formulario.

La salida
fuente
¿Puede aclarar qué significa "que no se publicó correctamente"? ¿Que pasó? ¿Qué recibió el servidor?
Matt b
6
¿No debería ser así '&NonFormValue=' + NonFormValue?
Wesley Murch

Respuestas:

103

En vez de

 data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

probablemente quieras

 data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

Debe tener cuidado de codificar en URL el valor de NonFormValuesi puede contener caracteres especiales.

mate b
fuente
1
Úselo encodeURIComponentpara asegurarse de que NonFormValueno tenga ningún carácter especial
Yahya Uddin
197

Si bien la respuesta de Matt b funcionará, también puede usarla .serializeArray()para obtener una matriz de los datos del formulario, modificarla y usarla jQuery.param()para convertirla en un formulario codificado en URL. De esta manera, jQuery maneja la serialización de sus datos adicionales por usted.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});
Leigh Brenecki
fuente
14
Esta es definitivamente la mejor opción: dejar la serialización por completo en jQuery, sin dejar de tener la capacidad de agregar nuevos valores a los recuperados del formulario.
jcsanyi
5
Esta es la mejor manera de hacerlo, sin jugar con cuerdas
Brett Gregson
Esta debería ser la respuesta aceptada. Limpio y de la manera correcta
Mike Aron
7

en primer lugar, no debería

data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

ser

data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

y en segundo lugar puedes usar

url: this.action + '?NonFormValue=' + NonFormValue,

o si la acción ya contiene algún parámetro

url: this.action + '&NonFormValue=' + NonFormValue,
Nikhil Bhandari
fuente
Su segunda respuesta no tendría el mismo efecto que la pregunta solicitada; NonFormValuese enviaría como un parámetro de URL, no en los datos POST. Esto podría no ser ideal si a) lo que se esté ejecutando en el lado del servidor espera que se publique (por ejemplo, usando en request.POSTlugar de request.REQUESTen Django), ob) NonFormValuees algo que no debería aparecer en la barra de URL o en el historial, ya sea por razones de seguridad o porque es un valor transitorio.
Leigh Brenecki
6

Agregue el artículo primero y luego serialice:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});
Mrchief
fuente
1
No funcionó para mí también. Aunque extiende el objeto, pero no funcionó como se esperaba.
punitcse
5

No olvides que siempre puedes hacer:

<input type="hidden" name="NonFormName" value="NonFormValue" />

en su forma real, que puede ser mejor para su código según el caso.

Jonathan
fuente
2

Podemos hacer como:

data = $form.serialize() + "&foo=bar";

Por ejemplo:

var userData = localStorage.getItem("userFormSerializeData");
var userId = localStorage.getItem("userId");

$.ajax({
    type: "POST",
    url: postUrl,
    data: $(form).serialize() + "&" + userData + "&userId=" + userId,
    dataType: 'json',
    success: function (response) {
        //do something
    }
});
Tapeshwar
fuente
0

Puede escribir una función adicional para procesar datos de formulario y debe agregar sus datos no formularios como el valor de datos en el formulario. Vea el ejemplo:

<form method="POST" id="add-form">
    <div class="form-group required ">
        <label for="key">Enter key</label>
        <input type="text" name="key" id="key"  data-nonformdata="hai"/>
    </div>
    <div class="form-group required ">
        <label for="name">Ente Name</label>
        <input type="text" name="name" id="name"  data-nonformdata="hello"/>
    </div>
    <input type="submit" id="add-formdata-btn" value="submit">
</form>

Luego agregue este jquery para el procesamiento de formularios

<script>
$(document).onready(function(){
    $('#add-form').submit(function(event){
        event.preventDefault();
        var formData = $("form").serializeArray();
        formData = processFormData(formData);
        // write further code here---->
    });
});
processFormData(formData)
{
    var data = formData;
    data.forEach(function(object){
        $('#add-form input').each(function(){
            if(this.name == object.name){
                var nonformData = $(this).data("nonformdata");
                formData.push({name:this.name,value:nonformData});
            }
        });
    });
    return formData;
}

Jithin Vijayan
fuente
0

esto mejor:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')
Eugenio
fuente
Agregue una descripción más detallada de por qué este es un mejor enfoque.
Mark
un código de línea y puede usar el objeto json para más parámetros.
Eugene