フォームを動的に作成して送信する


81

jQueryにフォームをその場で作成して送信する方法はありますか?

以下のようなもの。

<html>
    <head>
    <title> Title Text Goes Here </title>
    <script src="http://code.jquery.com/jquery-1.7.js"></script>
    <script>
        $(document).ready(function(){alert('hi')});
        $('<form/>').attr('action','form2.html').submit();
    </script>
    </head>
    <body>

        Content Area

    </body>
    </html>

これは機能するはずですか、それともこれを行う別の方法がありますか?


APIを読んだことがありますか?
geoffreak 2011年

また、ここでは受け入れ答えを見てみましょう:stackoverflow.com/questions/14836557/...を
thdoan

回答:


108

コードに2つの問題がありました。1つ目は$(document).ready();、要素を作成しているjQueryオブジェクトを含めたが、ラップしなかったことです。

2番目はあなたが使っていた方法でした。jQueryは、セレクター(または通常セレクターを配置する場所)が作成する要素に置き換えられると、任意の要素を作成します。次に、それを本文に追加して送信します。

$(document).ready(function(){
    $('<form action="form2.html"></form>').appendTo('body').submit();
});

これが実際のコードです。この例では、フォーム要素を追加することを証明するためだけに、自動送信は行いません。

ここだ自動でコードを提出します。それはうまくいきます。明らかに、「form2.html」がサーバーに存在しないため、Jsfiddleは404ページに移動します。


あなたが言及した最初の問題は問題ではありません:)
Santosh Gokak 2011年

2
@ user42540:必ずしもそうとは限りませんが、ページの読み込みが完了したときにJSコードを起動することをお勧めします。これにより、不要なエラーを防ぐことができます。
プラッグ2011年

3
一部のブラウザーでは機能する可能性がありますが、ほとんどのDOM操作コードを$(document).ready()ブロック内に含めるのには十分な理由があります。これにより、ブラウザーがDOMに安全に変更を加えることができるようになります。それ以外の場合、ページ全体が読み込まれる前に何かを変更しようとすると、IE6 / 7のようなうるさいブラウザがダミーを吐き出します。
gregL 2011年

99

はい、可能です。解決策の1つを以下に示します(証拠としてのjsfiddle)。

HTML:

<a id="fire" href="#" title="submit form">Submit form</a>

(上記のフォームはありませんを参照してください)

JavaScript:

jQuery('#fire').click(function(event){
    event.preventDefault();
    var newForm = jQuery('<form>', {
        'action': 'http://www.google.com/search',
        'target': '_top'
    }).append(jQuery('<input>', {
        'name': 'q',
        'value': 'stack overflow',
        'type': 'hidden'
    }));
    newForm.submit();
});

上記の例は、フォームの作成方法、入力の追加方法、および送信方法を示しています。結果の表示がによって禁止されているX-Frame-Options場合があるため、メインウィンドウのコンテンツを置き換えるに設定targetしました_top。または、を設定すると_blank、新しいウィンドウ/タブ内に表示されます。


良い解決策(少し長いですが)ですが、入力が表示されませんでした。
プラッグ2011年

@Purmou:実際の解決策は、フォームを作成してからsubmit()呼び出すことです。フォームとその要素を作成する方法を示すために、意図的に長いフォーム作成コードを提供しました。これは大丈夫だと思います。
タデック2011年

22
.appendTo( 'body')は、Firefox(23.0.1)で機能するために必要です。それ以外の場合は、フォームオブジェクトを返すだけで、送信しません。
Curtis Yallop 2013

5
newForm.hide()。appendTo( "body")。submit(); //フィールドを表示せず、FFで動作します
laffuste 2013年

4
これはGETを実行し、クエリ文字列をターゲットURIに追加するのと似ています。多くの人がフォームを使用してPOSTしたいと思っていると思います。明らかでない場合は、それ'method': postを達成するために使用します。
ficuscr 2015

35

jQueryを含まないMyバージョンでは、シンプルな関数をオンザフライで使用できます

関数:

function post_to_url(path, params, method) {
    method = method || "post";

    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }

    document.body.appendChild(form);
    form.submit();
}

使用法:

post_to_url('fullurlpath', {
    field1:'value1',
    field2:'value2'
}, 'post');

13

Purmouと同様ですが、送信時にフォームを削除します。

$(function() {
   $('<form action="form2.html"></form>').appendTo('body').submit().remove();
});

9

Josepmraの例は、私が必要とするものに対してうまく機能します。しかし、私は行を追加する必要がありました

 form.appendTo( document.body )

それが機能するために。

var form = $(document.createElement('form'));
$(form).attr("action", "reserves.php");
$(form).attr("method", "POST");

var input = $("<input>")
    .attr("type", "hidden")
    .attr("name", "mydata")
    .val("bla" );


$(form).append($(input));

form.appendTo( document.body )

$(form).submit();

8

はい、引用符を忘れただけです...

$('<form/>').attr('action','form2.html').submit();

javascriptエラーとは何ですか?それを準備完了機能に入れてみてください
Nicolas Thery 2011年

これは、HTML DOMにアタッチされないため、古いIEでは機能しません。<body>動作を開始する前に追加する必要があります。
ラプター

4

このコードで試してください-
これは完全に動的なソリューションです:

    var form = $(document.createElement('form'));
    $(form).attr("action", "reserves.php");
    $(form).attr("method", "POST");

    var input = $("<input>").attr("type", "hidden").attr("name", "mydata").val("bla");
    $(form).append($(input));
    $(form).submit();

2

なぜあなたはしないのです$.postか、それとも$.get直接ですか?

GET リクエスト:

$.get(url, data, callback);

POST リクエスト:

$.post(url, data, callback);

その場合、フォームは必要ありません。データオブジェクトでデータを送信するだけです。

$.post("form2.html", {myField: "some value"}, function(){
  alert("done!");
});

1
サーバーからのダウンロードをトリガーする必要があり、post / getを使用すると機能しません。
a20 2016年

また、これであなたはページを離れません。
robsch 2017年

@ a20不足しているのは、Content-Disposition: Attachment;ダウンロードを強制するためのサーバー側ヘッダーです。
SparK 2017年

@SparKうーん..あなたのコメントは私に不思議に思います、ブラウザがダウンロードを解釈できる(または解釈して強制しない)サーバー側にmimeタイプはありませんか。たとえば、zipファイル。ユーザーのダウンロード要求に応答していることを指定することはできませんので、ダウンロードをトリガーしてください...
a20

@ a20はい、Content-Type: application/octet-stream;。ありますdownloadアンカー内の属性は...クライアント側のもの(davidwalsh.name/download-attribute
SPARK

0

いくつかのパラメーターを使用してフォームを作成し、POST呼び出しを行う場合

var param1 = 10;

$('<form action="./your_target.html" method="POST">' +
'<input type="hidden" name="param" value="' + param + '" />' +
'</form>').appendTo('body').submit();

必要に応じて、すべてを1行で実行することもできます:-)


0

Jqueryの使用

$('<form/>', { action: url, method: 'POST' }).append(
    $('<input>', {type: 'hidden', id: 'id_field_1', name: 'name_field_1', value: val_field_1}),
    $('<input>', {type: 'hidden', id: 'id_field_2', name: 'name_field_2', value: val_field_2}),
).appendTo('body').submit();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.