<form>タグの外側のボタンを使用してフォームを送信する


301

私が持っていると言います:

<form method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" />

フォームの外側にある送信ボタンを使用してフォームを送信する方法を教えてください。HTML5には送信用のaction属性があると思いますが、それが完全にクロスブラウザであるかどうか、そしてそれがとにかくないかどうかはわかりませんこれを行う?


2
私はあなたがJavaScriptなしでそれを行うことができるとは思いません。ブラウザはどのようにしてそれがどのような形であるかを知るのでしょうか いくつかあるかもしれません。フォーム内に送信ボタンを配置できないのはなぜですか?
キース

1
JSを使用したくない場合、好奇心から見ると、html(<5)では不可能に見えますが、なぜコードにそのような種類の配置があるのでしょうか?
Kumar

1
私はすべてを更新するためのボタンを備えたマルチタブ設定領域を持っています。そのデザインのため、ボタンはフォームの外にあります。この質問は冗長であると思われるので、HTML5オプションまたはJSソリューションでロールバックします。
ダリル

1
@Kumar、私もそれは不可能だと思いましたが、それはstackoverflow.com/a/23456905/932473
dav

回答:


84

更新:最近のブラウザでは、form属性を使用してこれを行うことができます


私の知る限り、JavaScriptなしではこれを行うことはできません。

これが仕様書に書かれていることです

コントロールの作成に使用される要素は、通常、FORM要素内に表示されますが、ユーザーインターフェイスの構築に使用される場合、FORM要素宣言の外部に表示される場合もあります。これについては、組み込みイベントのセクションで説明します。フォーム外のコントロールは成功したコントロールにはならないことに注意してください。

それは私の大胆です

submitボタンはコントロールと考えられています。

http://www.w3.org/TR/html4/interact/forms.html#h-17.2.1

コメントから

すべてを更新するためのボタンが付いたマルチタブ設定領域があります。ボタンのデザインがフォームの外側にあるためです。

なぜinputフォームの内部に配置せずに、CSSを使用してページの別の場所に配置するのでしょうか。


19
参考までに、HTML5のサポート、まだ完全ではありませんが、実現しています:impressivewebs.com/html5-form-attribute
Shackrock

6
私はここで少し遅れていますが、入力をフォームに入れて、どこかに配置するにはどうすればよいですか?
cgf 2013

この目的のために<button>タグをhtml4に使用できます
degr

Joe the Squirrelの回答が機能するため、回答は無効になりました
Peter

提案されたJavaScriptソリューションに懸念があります。たとえば最新のChromeでは、HTML5検証(必須など)はスキップされます。私が考えることができる1つの解決策は、2つの送信ボタンを持ち、1つは非表示にすることです。非表示のボタンでクリックがトリガーされます。フォームは、適切な検証なしに送信しないでください。
勝利者n。

612

HTML5にはform属性あります。基本的に

<form id="myform" method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" form="myform" />

35
これは、IEを使用する予定のあるユーザーにとってIEでは機能しません。私はそれを使用しましたが、IEブラウザーでフォームを手動で送信する送信イベント関数コールバックを追加することにしました。
racl101 2013年

1
正確にはどのIEバージョンですか?
mwld 2014年

11
私は優雅なフォールバックとしてこれを行いました:<button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">実験が明らかにしたように、this.formは添付されたフォームDomElementですが、それ以外の場合はnullです。//編集:jQuery、しかしバニラでも可能
AdrianFöder

2
あなたがMSエッジでフォームの属性を表示したい場合は、ここで投票してください:wpdev.uservoice.com/forums/257854-microsoft-edge-developer/...を
mkurz

2
@AdrianFöderフォールバックのバニラ-JSのバージョンは次のようになります<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

私にとってはうまくいく解決策がまだここにありません。には、視覚的に隠された要素<submit>または内の<input type="submit">要素<form>、およびその<label>外側に関連付けられた要素が必要です。次のようになります。

<form method="get" action="something.php">
     <input type="text" name="name" />
     <input type="submit" id="submit-form" class="hidden" />
</form>

<label for="submit-form" tabindex="0">Submit</label>

このリンクを使用すると、<submit>要素をクリックしてフォーム要素を「クリック」できます<label>


4
jsと大きな変更を必要としない、より良いソリューションimho :)
Anton Hasan

52
IE 11でも動作します。同じ作品に「作品」と「IE」が出てくることはあまりありません。
シム2014

2
非互換性のないより良いソリューション。Twitter Bootstrapを使用している場合は、ラベルのcssクラスに「btn btn-primary」を使用するだけで問題なく動作します。
ジュアンダ

7
非常に良い解決策ですが、この方法の使用には1つの反対意見があるかもしれません。A labelはフォーカス可能な要素(AFAIK)ではないため、キーボードを使用して「ボタン」に移動し、スペースを押してそのボタンをアクティブにするだけのユーザーにとっては、直感的ではありません。(<enter>代わりに押すことができると思いますが、キーボードでフォームをナビゲートするのに慣れているのはそれだけではありません)
Auke

11
専念するにはlabel、タブボタンを使って、あなたが使用できるtabindexHTML属性を:<label for="submit-form" tabindex="0">Submit</label>ごとに、この質問
MarthyM

47

jQueryを使用できる場合、これを使用できます

<form method="get" action="something.php" id="myForm">
    <input type="text" name="name" />

    <input type="submit" style="display:none" />
</form>

<input type="button" value="Submit" id="myButton" />

<script type="text/javascript">
    $(document).ready(function() {
       $("#myButton").click(function() {
           $("#myForm").submit();
       });
    });
</script>

つまり、一番下の行は、Submitのようなボタンを作成し、実際の送信ボタンをフォームに配置し(もちろん非表示にする)、jQueryで[Fake Submit]ボタンをクリックしてフォームを送信することです。それが役に立てば幸い。


1
HTML5対応ブラウザとIEの両方で機能させるために、これが私のjQueryです$('button[form]').click(function (){ var formId = $(this).attr('form'); $('#' + formId).submit(); });
Snook

35
<form method="get" id="form1" action="something.php">

</form>

<!-- External button-->
<button type="submit" form="form1">Click me!</button>

これは、フォームのリモート送信ボタンを持つために機能しました。


おかげで、この単純な機能のために、JSコードの行を書きたくありません。PS:私のアプリはIEをサポートする必要がない
Mani

1
あなたがMSエッジのフォーム属性の機能を確認したい場合はここに投票してください:wpdev.uservoice.com/forums/257854-microsoft-edge-developer/...
mkurz

22

ここで別のソリューションに似ていますが、少し変更されています。

<form method="METHOD" id="FORMID">
   <!-- ...your inputs -->
</form>
<button type="submit" form="FORMID" value="Submit">Submit</button>

https://www.w3schools.com/tags/att_form.asp


これが最良の答えです、IMO。ボタンのフォーム属性のMDNから直接:ボタンが関連付けられているフォーム要素(フォームの所有者)。属性の値は、同じドキュメント内の<form>要素のid属性でなければなりません。この属性が指定されていない場合、<button>要素は祖先の<form>要素(存在する場合)に関連付けられます。この属性を使用すると、<form>要素の子孫としてだけでなく、<button>要素をドキュメント内の任意の場所の<form>要素に関連付けることができます。
AlexSashaRegan

注意:Internet Explorer 11では機能しません。ここで試してください:cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix

19

これを試して:

<input type="submit" onclick="document.forms[0].submit();" />

idフォームにを追加して、ではなくでアクセスすることをお勧めしdocument.forms[index]ます。


1
ええ、私はそれをjavascriptで行う方法を知っています。
ダリル2011

申し訳ありませんが、投稿からJS以外の方法を探していることがわかりませんでした(JSでタグ付けし忘れていると思いました)。
Mrchief 2011

1
これは、別のフォーム内のボタンを使用して外部フォームを送信する場合に最適な方法です。
Vahid Amiri 2017

11

いつでもjQueryを使用できます。

<form id="myForm">
  <!-- form controls -->
</form>
<input type="submit" id="myButton">

<script>
$(document).ready(function () {
  $("#myButton").click(function () {
    $("#myForm").submit();
  });
});
</script>

8

これは、これまでの最高のアイデアを組み込んだかなり確かなソリューションであり、Offerineで強調された問題に対する私のソリューションも含まれています。JavaScriptは使用されません。

IE(およびEdge 13)との下位互換性を重視する場合は、属性を使用できませんform="your-form"

display noneを指定して標準の送信入力を使用し、フォームの外側にラベルを追加します。

<form id="your-form">
  <input type="submit" id="your-form-submit" style="display: none;">
</form>

の使用に注意してくださいdisplay: none;。これは意図的なものです。ブートストラップの.hiddenクラスを使用する.show().hide()、jQueryのandと競合し、それ以降、Bootstrap 4で非推奨になりました。

次に、送信用のラベルを追加します(ブートストラップ用にスタイル設定):

<label for="your-form-submit" role="button" class="btn btn-primary" tabindex="0">
  Submit
</label>

他のソリューションとは異なり、私はtabindex( 0に設定)も使用しています。これは、キーボードのタブ移動と互換性があることを意味します。role="button"属性を追加すると、CSSスタイルになりcursor: pointerます。Et voila。(このフィドルを参照してください)。


いいね!IE11とFirefoxでうまく動作しました。ありがとう!
eaglei22

@ eaglei22はそれを聞いてうれしい:)
ジョナサン

他の場所からのすべての機能/提案をまとめることは非常に役立ちますので、ありがとうございます。しかし、ボタン/ラベルにタブで移動できるようになったとしても、キーボードから「クリック」する方法がわかりEnterません。たとえば、押しても効果がありません。したがって、それにタブで移動できることは、少し無意味なようです。JavaScriptを使用せずにこれを行う方法はありますか?
アンドリューウィレムス2017年

@AndrewWillemsそれは良い点です。残念ながら、JavaScriptを使わずにキーボードを使用してクリックイベントをトリガーする方法はわかりません。PS:投稿が役に立った場合は、賛成投票してください。それはあなたに何の費用もかかりませんが、役に立つ答えを生み出す人にとっては大きな意味があります。
ジョナサン

1
そして、私はまた<input... />、だれもが露骨にそして誤ってここで(あまりに)使用している、ずさんで無効な自己終了構文を適切なvoid no-closeタグに修正したことも愛しています!:)称賛!
Sz。

3

これは完璧に動作します!;)

これは、Ajaxを使用して、私が "フォームミラーエレメント"と呼ぶ方法で実行できます。代わりに、要素のあるフォームを外部に送信する代わりに、偽のフォームを作成できます。以前のフォームは必要ありません。

<!-- This will do the trick -->
<div >
    <input id="mirror_element" type="text" name="your_input_name">
    <input type="button" value="Send Form">
</div>

コードajaxは次のようになります:

    <script>
        ajax_form_mirror("#mirror_element", "your_file.php", "#your_element_response", "POST");

        function ajax_form_mirror(form, file, element, method) {
            $(document).ready(function() {
                // Ajax
                $(form).change(function() { // catch the forms submit event
                    $.ajax({                // create an AJAX call...
                        data: $(this).serialize(),      // get the form data
                        type: method,                   // GET or POST
                        url: file,                      // the file to call
                        success: function (response) {   // on success..
                        $(element).html(response);  // update the DIV
                        }
                    });

                    return false; // cancel original event to prevent form submitting
                });
            });
        }
   </script>

これは、親フォームを送信せずに別のフォーム内にデータを送信する場合に非常に役立ちます。

このコードはおそらく必要に応じて適応/最適化できます。それは完全に動作します!! ;)次のような選択オプションボックスが必要な場合にも機能します。

<div>
    <select id="mirror_element" name="your_input_name">
        <option id="1" value="1">A</option>
        <option id="2" value="2">B</option>
        <option id="3" value="3">C</option>
        <option id="4" value="4">D</option>
    </select>
</div>

それが私のような誰かを助けてくれたことを願っています。;)


1

多分これはうまくいくかもしれませんが、これが有効なHTMLであるかどうかはわかりません。

<form method="get" action="something.php">
    <input type="text" name="name" />
    <input id="submitButton" type="submit" class="hide-submit" />
</form>

<label for="submitButton">Submit</label>

3
この答えは、まさにこの質問自体にすでに存在しています。stackoverflow.com/a/23456905/2968465
Jayant Bhawal

0

表のセル要素からフォームを非表示にしようとしても、フォームの送信ボタンが表示されるという問題がありました。問題は、フォーム要素がまだ余分な空白スペースを占めているため、テーブルセルのフォーマットが奇妙に見えることでした。display:noneおよびvisibility:hidden属性は、送信ボタンも非表示にするため、機能しませんでした。これは、非表示にしようとしたフォーム内に含まれていたためです。簡単な答えは、CSSを使用してフォームの高さをかろうじて何も設定しないことでした。

そう、

CSS-

    #formID {height:4px;}

私のために働いた。


0

私はこの方法を使用し、親切に気に入っています。送信前にフォームを検証し、safari / googleにも対応しています。jquery nnなし

        <module-body>
            <form id="testform" method="post">
                <label>Input Title</label>
                <input name="named1" placeholder="Placeholder"  title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>
            </form>
        </module-body>
        <module-footer>
            <input type="button" onclick='if (document.querySelector("#testform").reportValidity()) { document.querySelector("#testform").submit(); }' value="Submit">
            <input type="button" value="Reset">
        </module-footer>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.