$ (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.

A saída
fonte
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.

matt b
fonte
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),
});
Leigh Brenecki
fonte
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,
Nikhil Bhandari
fonte
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()
});
Mrchief
fonte
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.

Jonathan
fonte
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
    }
});
Tapeshwar
fonte
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;
}

Jithin Vijayan
fonte
0

melhor assim:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')
Eugene
fonte
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