$(this).serialize()—値を追加する方法は?


104

現在私は以下を持っています:

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

これは正常に動作しますが、データに値を追加したいので、試してみました

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

しかし、それは正しく投稿されませんでした。シリアル化文字列にアイテムを追加する方法に関するアイデアはありますか?これは、フォーム固有ではないグローバルページ変数です。


「正しく投稿されなかった」とはどういう意味ですか?どうした?サーバーは何を受け取りましたか?
matt b

6
そうじゃないの'&NonFormValue=' + NonFormValue
Wesley Murch、2011年

回答:


103

の代わりに

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

あなたはおそらく欲しい

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

NonFormValue特殊文字が含まれている可能性がある場合は、の値をURLエンコードするように注意する必要があります。


1
に特殊文字が含まencodeURIComponentれてNonFormValueいないことを確認するために使用します
Yahya Uddin '29

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

5
これは、弦を演奏するのではなく、それを行うための最良の方法です
Brett Gregson

これは受け入れられる答えになるはずです。クリーンで正しい方法
マイクアロン

7

最初にすべきではない

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

なる

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

第二にあなたは使うことができます

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

または、アクションにすでにパラメータが含まれている場合

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

2番目の答えは、質問が要求したものと同じ効果を持ちません。NonFormValuePOSTされたデータではなく、URLパラメータとして送信されます。これは、a)サーバー側で実行されているものがPOSTされることを期待している場合(たとえば、Djangoのrequest.POST代わりに使用するrequest.REQUEST場合)、またはb)NonFormValueセキュリティ上の理由または理由によりURLバーまたは履歴に表示されるべきではない場合、理想的ではない可能性があります。これは一時的な値です。
Leigh Brenecki 2013

6

最初にアイテムを追加してからシリアル化します。

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

1
私にとってもうまくいきませんでした。オブジェクトを拡張しますが、期待どおりに動作しませんでしたが。
punitcse 2018

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('&')

これがより良いアプローチである理由について、より詳細な説明を追加してください。
マーク

1行のコードで、より多くのパラメーターにjsonオブジェクトを使用できます。
ユージーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.