$(this).serialize()—如何添加值?


104

目前我有以下内容:

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

效果很好,但是我想为数据添加一个值,所以我尝试了

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

但这没有正确发布。关于如何将项目添加到序列化字符串的任何想法?这是一个全局页面变量,不是特定于表单的。


您能否澄清“未正确发布”的含义?发生了什么?服务器收到了什么?
马特b

6
那不是'&NonFormValue=' + NonFormValue吗?
Wesley Murch

Answers:


103

代替

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

你可能想要

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

NonFormValue如果值可能包含任何特殊字符,则应谨慎使用URL编码。


1
用于encodeURIComponent确保NonFormValue没有任何特殊字符
Yahya Uddin

196

尽管matt b的答案会起作用,但是您也可以.serializeArray()用来从表单数据中获取数组,对其进行修改,然后用于jQuery.param()将其转换为url编码的表单。这样,jQuery为您处理了额外数据的序列化。

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

14
这绝对是最好的选择-将序列化完全留给jQuery,同时仍然能够向从表单中检索的值添加新值。
jcsanyi

5
这是最好的方法,不要玩弦琴
Brett Gregson

这应该是公认的答案。清洁和正确的方法
Mike Aron

7

首先不应该

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

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

其次,您可以使用

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

或者该动作已经包含任何参数

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

您的第二个答案与问题所要求的效果不同。NonFormValue将作为URL参数发送,而不是在POSTed数据中发送。如果a)服务器端运行的任何程序都希望将其发布(例如request.POSTrequest.REQUEST在Django中使用而不是),或者b)NonFormValue出于安全原因或出于安全原因不应该出现在URL栏或历史记录中,则这可能不是理想的选择这是一个瞬时值。
Leigh Brenecki

6

首先添加项目,然后序列化:

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

1
也没有为我工作。虽然它扩展了对象,但没有按预期工作。
punitcse

5

不要忘记,您可以随时这样做:

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

以您的实际形式显示,这可能对您的代码更好,具体取决于大小写。


2

我们可以这样做:

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

例如:

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

您可以编写一个额外的函数来处理表单数据,并且应将非表单数据添加为表单中的数据值。请参见示例:

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

然后添加此jQuery进行表单处理

<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

这个更好:

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

请添加关于为什么这是一种更好方法的更详细的说明。
标记

一行代码,您就可以将json对象用于更多参数。
尤金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.