$ (this) .serialize () - Como adicionar um valor?


105

atualmente eu tenho o seguinte:

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

Isso funciona bem, mas eu gostaria de adicionar um valor aos dados, então tentei

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

Mas isso não foi postado corretamente. Alguma idéia de como você pode adicionar um item à string serializada? Esta é uma variável de página global que não é específica do formulário.


Você pode esclarecer o que significa "isso não postou corretamente"? O que aconteceu? O que foi recebido pelo servidor?
matt em

6
Não deveria ser assim '&NonFormValue=' + NonFormValue?
Wesley Murch

Respostas:


103

Ao invés de

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

você provavelmente quer

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

Você deve ter cuidado ao codificar por URL o valor de NonFormValuese ele pode conter qualquer caractere especial.


1
use encodeURIComponentpara garantir que NonFormValuenão tenha nenhum caractere especial
Yahya Uddin

197

Embora a resposta de matt b funcione, você também pode usar .serializeArray()para obter um array dos dados do formulário, modificá-lo e usá jQuery.param()-lo para convertê-lo em um formulário codificado por url. Dessa forma, o jQuery lida com a serialização de seus dados extras para você.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});

14
Esta é definitivamente a melhor opção - deixar a serialização inteiramente para o jQuery, embora ainda tenha a capacidade de adicionar novos valores aos recuperados do formulário.
jcsanyi

5
Esta é a melhor maneira de fazer isso, sem tocar cordas
Brett Gregson

Esta deve ser a resposta aceita. Limpo e da maneira certa
Mike Aron

7

em primeiro lugar não deveria

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

estar

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

e em segundo lugar você pode usar

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

ou se a ação já contém algum parâmetro

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

Sua segunda resposta não teria o mesmo efeito que a pergunta feita; NonFormValueseria enviado como um parâmetro de URL, não nos dados POSTADOS. Isso pode não ser ideal se a) o que quer que esteja sendo executado no lado do servidor espera que seja POSTADO (por exemplo, usando em request.POSTvez de request.REQUESTno Django), ou b) NonFormValueé algo que não deve aparecer na barra de URL ou no histórico por motivos de segurança ou porque é um valor transitório.
Leigh Brenecki

6

Adicione o item primeiro e depois serialize:

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

1
Não funcionou para mim também. Embora estenda o objeto, mas não funcione como esperado.
punitcse

5

Não se esqueça que você sempre pode fazer:

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

na sua forma real, que pode ser melhor para o seu código, dependendo do caso.


2

Podemos fazer como:

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

Por exemplo:

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
    }
});

0

Você pode escrever uma função extra para processar dados de formulário e deve adicionar seus dados não formados como o valor dos dados no formulário. Veja o exemplo:

<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>

Em seguida, adicione este jquery para processamento de formulário

<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;
}


0

melhor assim:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')

Adicione uma descrição mais detalhada de por que essa é uma abordagem melhor.
Marcos

um código de linha e você pode usar o objeto json para mais parâmetros.
Eugene
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.