シリアル化と追加データを含むjQuery post()


147

serialize()フォームの外にあるその他のデータを投稿できるかどうかを確認しようとしています。

これが私がうまくいくと思ったものですが、送信するだけで'wordlist'フォームデータは送信しません。

$.post("page.php",( $('#myForm').serialize(), { 'wordlist': wordlist }));

誰かアイデアはありますか?

回答:


329

serializeArray [docs]を使用して、追加のデータを追加できます。

var data = $('#myForm').serializeArray();
data.push({name: 'wordlist', value: wordlist});

$.post("page.php", data);

11
うーん。私はこれが私の解決策よりも好きだと思います:)私は将来これを始めるかもしれません。
Michael Mior

@Gudradain:jsfiddle.net/fnjncqhvで問題なく動作します。うまくいかない場合は、別の問題に直面しています。
Felix Kling

いいえ、ありません。jsfiddle.net/fnjncqhv/1 serializeArray()は、オブジェクトの配列を生成します。各オブジェクトには単一のプロパティが含まれます。データオブジェクトに複数のプロパティが含まれている場合(例のように)、無効なオブジェクトが生成され、バインドされませんサーバー側。回答を編集して問題を修正してください。
Gudradain 2014年

2
@Gudradain:あなたの答えについての私のコメントを見てください。あなたは間違っている。serializeArrayあなたが思っているような構造は作りません。デモで何を表示しようとしているのかわかりません。配列の長さを警告しているだけです。私のデモで納得できない場合は、ドキュメントをご覧ください。
Felix Kling 2014年

1
@FelixKlingその失敗の瞬間に申し訳ありませんが、説明をありがとうございました。追加するすべてのパラメーターについて、{name: 'your-paramater-name'、value: 'your-parameter-value'}の形式が本当に必要であることに気づかなかった。
Gudradain 2014年


9

ajaxファイルのアップロードでこれを行う必要がある場合の代替ソリューション:

var data = new FormData( $('#form')[0] ).append( 'name' , value );

またはさらに簡単です。

$('form').on('submit',function(e){

    e.preventDefault();
    var data = new FormData( this ).append('name', value );

    // ... your ajax code here ...

    return false;

});

5

JavaScriptオブジェクトをフォームデータに追加する場合は、次のコードを使用できます。

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeArray();
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        postData.push({name:key, value:data[key]});
    }
}
$.post(url, postData, function(){});

または、メソッドserializeObject()を追加すると、次のことができます

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});

1
これは基本的にのような配列を生成します[{name: 'wordlist'}, {value: wordlist}]。これはjQueryが理解できる形式ではないので、これが実際に機能するとは思えません。
Felix Kling、2014年

@FelixKling serializeArray()は[{name1: 'value1'}、{name2: 'value2'}]を生成します。オブジェクトデータ{name3: 'value3'、name4: 'value4'}があり、それをserializeArray()から配列にプッシュすると、[{name1: 'value1'}、{name2: 'value2'}、{ name3: 'value3'、name4: 'value4'}]。配列の最後のオブジェクトは無効であり、結果は得られません。
Gudradain 2014年

serializeArray()生産[{name1: 'value1'}, {name2: 'value2'}]いいえ、それはしません:jsfiddle.net/akyz1Lcy
Felix Kling

4

jqueryの新しいバージョンでは、次の手順で実行できます。

  • 経由でパラメータ配列を取得 serializeArray()
  • push()配列に追加のパラメーターを追加するための呼び出しまたは同様のメソッド、
  • $.param(arr)jquery ajaxのdataパラメーターとして使用できるシリアル化された文字列を取得するための呼び出し。

コード例:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}

3
$.ajax({    
    type: 'POST',  
    url: 'test.php',  
    data:$("#Test-form").serialize(),  
    dataType:'json',
     beforeSend:function(xhr, settings){
     settings.data += '&moreinfo=MoreData';
     },
    success:function(data){
            //  json response  
    },
    error: function(data) { 
        // if error occured
    }
    });

2

AJAX要求を対応する値に送信する直前に設定する非表示フィールドとして追加のデータをフォームに含めることができます。

別の可能性は、この小さな宝石を使用してフォームを(文字列ではなく)JavaScriptオブジェクトにシリアル化し、不足しているデータを追加することです。

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);

という名前の既存の関数はありませんserializeObject。どこでそれを手に入れたのですか?
Jeremeが2017年

1

これを使えます

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);

0

私はオブジェクトをオブジェクトとして保持し、クレイジーな型シフトを行わないようにしています。これが私のやり方です

var post_vars = $('#my-form').serializeArray();
$.ajax({
  url: '//site.com/script.php',
  method: 'POST',
  data: post_vars,
  complete: function() {
    $.ajax({
      url: '//site.com/script2.php',
      method: 'POST',
      data: post_vars.concat({
        name: 'EXTRA_VAR',
        value: 'WOW THIS WORKS!'
      })
    });
  }
});

上から見えない場合は、.concat関数を使用して、post変数を「name」、値を「value」としてオブジェクトに渡しました!

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.