フォーム全体をjQuery Ajax関数のデータとして渡す


155

jQuery ajax関数があり、フォーム全体を投稿データとして送信したいと考えています。私たちは常にフォームを更新しているため、リクエストで送信されるフォーム入力を常に更新するのは面倒になります。


MohはFormData()と画像については正しいです。しかし、さらに明確にするために。これは、serialiseが文字列でのみ機能することです(バイナリデータでは機能しません)。FormData()関数は、エンコーディングタイプが「multipart / form-data」に設定されているフォームで機能します。詳細はこちら:developer.mozilla.org/en-US/docs/Web/API/FormData
james kenny 2017年

回答:


283

これを正確に行う関数があります:

http://api.jquery.com/serialize/

var data = $('form').serialize();
$.post('url', data);

3
$ .postは、成功時に関数を呼び出すこともできます。$ .post( 'url'、data、function(){....});
slm 2012

22
注:フォームフィールドにはname属性が設定されている必要があります。IDのみを使用しても、ドキュメントに記載されているとおりに機能しません。
ランスクリーブランド

同じ名前の入力が必要ですか?つまり、それらを列に並べるようなものですか?配列などで送信するにはどうすればよいですか?
フランシスココラレスモラレス

2
@FranciscoCorralesMoralesは、この方法のように、あなたの入力に名前を付ける:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ahmehri

@ahmehri、これは有効なHTML <input name="person[1].lastName">ですか?
フランシスココラレスモラレス

58

postメソッドでフォームを送信する場合、serialize()はお勧めできません。たとえば、ajax経由でファイルを渡したい場合は機能しません。

このID「myform」のフォームがあるとします。

より良い解決策は、FormDataを作成して送信することです。

    var myform = document.getElementById("myform");
    var fd = new FormData(myform );
    $.ajax({
        url: "example.php",
        data: fd,
        cache: false,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (dataofconfirm) {
            // do something with the result
        }
    });

1
はい、更新されたブラウザでサポートされていますが、シリアライズを使用する場合、文字列のみを渡すことができます。
Moh Arjmandi、2015

4
多分あなたはあなたの答えでそれを言及するべきです
toesslab '19

var2016年は、両方に感謝します。
Sylar 2016年

1
あなたの美しさ!チャーム(フォームデータ+ファイルのアップロード)のように機能
saibbyweb

2
これを十分に強調することはできません!試しましたform.serialize()が、ファイルのアップロードでは機能しませんでした。new FormData(this)うまく
いきました

26

一般にserialize()フォーム要素で使用します。

複数の<select>オプションが同じキーの下でシリアル化されることに注意してください。

<select id="foo" name="foo" multiple="multiple">
    <option value="1">one</option>
    <option value="2">two</option>
    <option value="3">three</option>
</select>

同じクエリパラメータの複数の出現を含むクエリ文字列になります。

[path]?foo=1&foo=2&foo=3&someotherparams...

これは、バックエンドで必要なものではない可能性があります。

私はこのJSコードを使用して、複数のパラメーターをコンマ区切りの単一キーに減らします(John Resigの場所にあるスレッドでのコメント投稿者の応答から恥知らずにコピーされます):

function compress(data) {
    data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3");
    return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data;
}

上記を次のように変換します。

[path]?foo=1,2,3&someotherparams...

JSコードでは、次のように呼び出します。

var inputs = compress($("#your-form").serialize());

お役に立てば幸いです。


PHPを使用している場合、parse_url関数を使用してクエリ文字列を解析するのは簡単です:us3.php.net/manual/en/function.parse-url.php
Lobos

私はこれが古いことを知っていますが、この方法を使用して選択されたオプションをどのようにして知ることができますか?
yardpenalty.com 2016


4

これを行うのに適したjQueryオプションはFormDataを使用することです。この方法は、フォームを介してファイルを送信する場合にも適しています。

<form id='test' method='post' enctype='multipart/form-data'>
   <input type='text' name='testinput' id='testinput'>
   <button type='submit'>submit</button>
</form>

jQueryの送信関数は次のようになります。

$( 'form#test' ).submit( function(){
   var data = new FormData( $( 'form#test' )[ 0 ] );

   $.ajax( {
      processData: false,
      contentType: false,

      data: data,
      dataType: 'json',
      type: $( this ).attr( 'method' );
      url: 'yourapi.php',
      success: function( feedback ){
         console.log( "the feedback from your API: " + feedback );
      }
});

フォームにデータを追加するには、フォームで非表示の入力を使用するか、その場で追加することができます。

var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );

2
フォームの使用の「アクション」属性からURLを抽出するにはurl: $(this).attr('action'),代わりに
rubo77

1

データを投稿するだけです。およびjquery ajax関数セットパラメーターの使用。例を示します。

<script>
        $(function () {

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

                e.preventDefault();

                $.ajax({
                    type: 'post',
                    url: 'your_complete url',
                    data: $('form').serialize(),
                    success: function (response) {
                        //$('form')[0].reset();
                       // $("#feedback").text(response);
                        if(response=="True") {
                            $('form')[0].reset();
                            $("#feedback").text("Your information has been stored.");
                        }
                        else
                            $("#feedback").text(" Some Error has occured Errror !!! ID duplicate");
                    }
                });

            });

        });
    </script>

0

他の解決策は私にとってはうまくいきませんでした。たぶん、私が取り組んでいるプロジェクトの古いDOCTYPEがHTML5オプションを妨げています。

私の解決策:

<form id="form_1" action="result.php" method="post"
 onsubmit="sendForm(this.id);return false">
    <input type="hidden" name="something" value="1">
</form>

js:

function sendForm(form_id){
    var form = $('#'+form_id);
    $.ajax({
        type: 'POST',
        url: $(form).attr('action'),
        data: $(form).serialize(),
        success: function(result) {
            console.log(result)
        }
    });
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.