Kirim formulir menggunakan tombol di luar tag <form>

301

Katakan saya punya:

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

<input type="submit" />

Bagaimana cara mengirim formulir itu dengan tombol kirim di luar formulir, saya pikir dalam HTML5 ada atribut tindakan untuk pengiriman, tetapi saya tidak yakin apakah itu sepenuhnya lintas-browser dan jika tidak ada juga untuk melakukan hal ini?

daryl
sumber
2
Saya tidak berpikir Anda bisa melakukannya tanpa javascript. Bagaimana peramban tahu bentuk apa itu? Mungkin ada beberapa. Mengapa Anda tidak bisa memasukkan tombol kirim di dalam formulir?
Keith
1
jika Anda tidak ingin menggunakan JS maka bagi saya itu terlihat mustahil di dalam html (<5), hanya karena penasaran, mengapa Anda memiliki semacam pengaturan dalam kode?
Kumar
1
Saya memiliki area pengaturan multi-tab dengan tombol untuk memperbarui semua, karena desainnya tombolnya akan berada di luar formulir. Saya hanya akan bergulir dengan opsi HTML5 atau solusi JS karena pertanyaan ini tampaknya berlebihan.
daryl
1
@ Kumar, saya juga berpikir itu tidak mungkin, tetapi sepertinya itu bukan stackoverflow.com/a/23456905/932473
dav
2
saat ini jawabannya adalah developer.mozilla.org/en-US/docs/Web/HTML/Element/…
caub

Jawaban:

84

Pembaruan: Di browser modern, Anda dapat menggunakan formatribut untuk melakukan ini .


Sejauh yang saya tahu, Anda tidak dapat melakukan ini tanpa javascript.

Inilah yang dikatakan oleh spec

Elemen yang digunakan untuk membuat kontrol umumnya muncul di dalam elemen FORMULIR, tetapi juga bisa muncul di luar deklarasi elemen FORMULIR ketika mereka digunakan untuk membangun antarmuka pengguna. Ini dibahas pada bagian tentang peristiwa intrinsik. Perhatikan bahwa kontrol di luar formulir tidak dapat menjadi kontrol yang berhasil.

Itu berani saya

Sebuah submittombol dianggap sebagai kontrol.

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

Dari komentar

Saya memiliki area pengaturan multi-tab dengan tombol untuk memperbarui semua, karena desainnya tombolnya akan berada di luar formulir.

Mengapa tidak menempatkan bagian inputdalam formulir, tetapi gunakan CSS untuk menempatkannya di tempat lain di halaman?

Jason Gennaro
sumber
19
FYI, dukungan HTML5, belum sempurna tetapi sudah sampai di sana: impressivewebs.com/html5-form-attribute
Shackrock
6
Saya agak terlambat di sini, tetapi bagaimana Anda bisa memasukkan input dalam formulir, tetapi posisikan di tempat lain?
cgf
Anda dapat menggunakan tag <button> untuk keperluan ini untuk html4
degr
Jawabannya tidak lagi valid, karena jawaban Joe the Squirrel bekerja - pada 2016.
Peter
ada kekhawatiran dengan solusi JavaScript yang diajukan. misalnya di Chrome terbaru, validasi HTML5 (wajib, dll.) dilewati. satu solusi yang dapat saya pikirkan adalah memiliki dua tombol kirim, satu tersembunyi. klik harus dipicu pada tombol tersembunyi. formulir tidak boleh diserahkan tanpa validasi yang tepat.
pemenang n.
612

Di HTML5, ada atribut form . Pada dasarnya

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

<input type="submit" form="myform" />
Lie Ryan
sumber
35
Ini tidak berfungsi pada IE untuk siapa pun yang berencana untuk menggunakannya. Saya menggunakannya tetapi kemudian memutuskan untuk menambahkan ajukan fungsi acara callback untuk secara manual mengirimkan formulir pada browser IE.
racl101
1
Versi IE mana tepatnya?
mwld
11
Saya melakukan ini sebagai fallback yang anggun: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">Seperti yang diungkapkan oleh eksperimen, form..form ini adalah formulir terlampir DomElement, sedangkan nol sebaliknya. // edit: jQuery, tetapi mungkin dengan vanilla, juga ofc
Adrian Föder
2
Jika Anda ingin melihat atribut formulir di MS Edge, silakan pilih di sini: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
2
Versi vanilla-JS dari @ AdrianFöder fallback adalah:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon
318

Solusi yang berfungsi bagus untuk saya, masih belum ada di sini. Hal ini membutuhkan memiliki visual yang tersembunyi <submit>atau <input type="submit">elemen isi setiap modul yang <form>, dan terkait <label>di luar unsur itu. Akan terlihat seperti ini:

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

Sekarang tautan ini memungkinkan Anda untuk 'mengklik' <submit>elemen formulir dengan mengklik <label>elemen tersebut.

Offereins
sumber
4
solusi imho yang lebih baik tanpa memerlukan js dan perubahan besar :)
Anton Hasan
52
Bekerja di IE 11 juga. Saya tahu, Anda tidak sering melihat "berhasil" dan "IE" dalam kalimat yang sama.
shim
2
Solusi yang lebih baik tanpa ketidaksesuaian. Jika menggunakan Twitter Bootstrap, Anda cukup menggunakan "btn btn-primary" untuk kelas label css dan berfungsi dengan sempurna.
Juanda
7
Solusi yang sangat bagus, namun mungkin ada satu keberatan untuk menggunakan metode ini. A labelbukan elemen fokus (AFAIK) sehingga tidak intuitif untuk pengguna yang hanya menggunakan keyboard untuk bernavigasi ke 'tombol' dan kemudian tekan spasi untuk mengaktifkan tombol itu misalnya. (Saya sadar Anda bisa menekan <enter>saja, tapi itu bukan satu-satunya cara orang terbiasa menavigasi formulir dengan keyboard)
Auke
11
Untuk memfokuskan labeltombol tab via, Anda dapat menggunakan tabindexatribut HTML: <label for="submit-form" tabindex="0">Submit</label>sesuai pertanyaan ini
MarthyM
47

jika Anda dapat menggunakan jQuery, Anda dapat menggunakan ini

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

Jadi, intinya adalah membuat tombol seperti Kirim, dan letakkan tombol kirim yang sebenarnya dalam bentuk (tentu saja menyembunyikannya), dan kirim formulir dengan jquery melalui mengklik tombol 'Kirim Palsu'. Semoga ini bisa membantu.

dav
sumber
1
Untuk membuatnya bekerja di kedua browser siap HTML5 dan IE, di sini adalah jQuery saya$('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>

Ini berhasil bagi saya, untuk memiliki tombol kirim jauh untuk formulir.

Joe si Tupai
sumber
Terima kasih kawan, untuk fitur sederhana ini saya tidak ingin menulis baris kode JS. PS: aplikasi saya tidak perlu mendukung IE
Mani
1
Harap beri
mkurz
22

Mirip dengan solusi lain di sini, dengan sedikit modifikasi:

<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

mster
sumber
Ini jawaban terbaik, IMO. Langsung dari MDN pada atribut formulir tombol: Elemen formulir yang terkait dengan tombol (pemilik formulirnya). Nilai atribut harus berupa atribut id dari elemen <form> dalam dokumen yang sama. Jika atribut ini tidak ditentukan, elemen <button> akan dikaitkan dengan elemen <form> leluhur, jika ada. Atribut ini memungkinkan Anda untuk mengaitkan elemen <button> dengan elemen <form> di mana saja di dalam dokumen, bukan hanya sebagai turunan dari elemen <form>.
AlexSasha Mulai
Ketahuilah: Itu tidak berfungsi di Internet Explorer 11. Coba di sini: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix
19

Coba ini:

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

Meskipun saya akan menyarankan menambahkan idke formulir dan mengakses dengan itu alih-alih document.forms[index].

Tuan
sumber
1
Ya saya tahu bagaimana melakukannya dengan javascript, jika Anda melihat saya tidak menandainya sebagai javascript.
daryl
Maaf, tidak jelas dari pos Anda bahwa Anda sedang mencari cara non JS (saya pikir Anda melewatkan penandaan di bawah JS).
Mrchief
1
Ini adalah cara terbaik untuk melakukannya jika Anda ingin mengirimkan formulir eksternal menggunakan tombol di dalam formulir lain.
Vahid Amiri
11

Anda selalu dapat menggunakan jQuery:

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

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

Berikut ini adalah solusi yang cukup solid yang menggabungkan ide-ide terbaik sejauh ini serta memasukkan solusi saya untuk masalah yang disorot dengan Offerein's. Tidak ada javascript yang digunakan.

Jika Anda peduli tentang kompatibilitas mundur dengan IE (dan bahkan Edge 13), Anda tidak dapat menggunakan form="your-form" atribut .

Gunakan input kirim standar tanpa tampilan dan tambahkan label di luar formulir:

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

Perhatikan penggunaan display: none;. Ini disengaja. Menggunakan .hiddenkonflik kelas bootstrap dengan jQuery .show()dan .hide(), dan sejak itu telah ditinggalkan dalam Bootstrap 4.

Sekarang cukup tambahkan label untuk kiriman Anda, (gaya untuk bootstrap):

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

Tidak seperti solusi lain, saya juga menggunakan tabindex - set ke 0 - yang berarti bahwa kita sekarang kompatibel dengan tab keyboard. Menambahkan role="button"atribut memberinya gaya CSS cursor: pointer. Et voila. ( Lihat biola ini ).

Jonathan
sumber
Bagus! Bekerja hebat dengan IE11 dan firefox. Terima kasih!
eaglei22
@ eaglei22 senang mendengarnya :)
Jonathan
Ini sangat membantu bagi Anda untuk mengumpulkan semua fitur / saran dari tempat lain, jadi terima kasih. Namun, meskipun sekarang Anda dapat menabrak tombol / label, saya tidak dapat melihat cara "mengklik" dari keyboard, misalnya menekan Entertidak memiliki efek. Dengan demikian, bisa tab tampaknya tidak ada gunanya. Apakah ada cara untuk melakukan ini tanpa menggunakan JavaScript?
Andrew Willems
@AndrewWillem itu poin yang bagus. Sayangnya saya tidak melihat jalan keluar menggunakan keyboard Anda untuk memicu acara klik tanpa javascript. NB: jika postingan itu membantu Anda, harap unduhkan Tidak ada biaya apa pun bagi Anda, tetapi sangat berarti bagi siapa pun yang menghasilkan jawaban yang bermanfaat.
Jonathan
1
Dan saya juga menyukai Anda karena memperbaiki <input... />sintaks penutupan diri yang ceroboh dan tidak valid , yang hampir semua orang secara terang-terangan dan tidak benar menggunakan di sini (juga), dengan tag tanpa-tutup yang benar! :) Kudos!
Sz.
3

Ini bekerja dengan sempurna! ;)

Ini dapat dilakukan dengan menggunakan Ajax dan dengan apa yang saya sebut: "elemen bentuk cermin". Alih-alih mengirim formulir dengan elemen di luar, Anda bisa membuat formulir palsu. Formulir sebelumnya tidak diperlukan.

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

Kode ajax akan seperti:

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

Ini sangat berguna jika Anda ingin mengirim beberapa data di dalam formulir lain tanpa mengirimkan formulir induk.

Kode ini mungkin dapat diadaptasi / dioptimalkan sesuai dengan kebutuhan. Ini bekerja dengan sempurna !! ;) Juga berfungsi jika Anda menginginkan kotak pilihan seperti ini:

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

Saya harap ini membantu seseorang seperti itu membantu saya. ;)

Frank
sumber
1

Mungkin ini bisa berhasil, tapi saya tidak tahu apakah ini HTML yang valid.

<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>
Emmanuel Lozoya
sumber
3
Jawaban ini sudah ada untuk pertanyaan ini sendiri. stackoverflow.com/a/23456905/2968465
Jayant Bhawal
0

Saya punya masalah di mana saya mencoba untuk menyembunyikan formulir dari elemen sel tabel, tetapi masih menunjukkan tombol kirim formulir. Masalahnya adalah bahwa elemen form masih mengambil ruang kosong tambahan, membuat format sel tabel saya terlihat aneh. Layar: tidak ada dan visibilitas: atribut tersembunyi tidak berfungsi karena itu akan menyembunyikan tombol kirim juga, karena itu terkandung dalam formulir yang saya coba sembunyikan. Jawaban sederhananya adalah mengatur tinggi form menjadi hampir tidak menggunakan CSS

Begitu,

CSS -

    #formID {height:4px;}

bekerja untukku.

Game Shawn
sumber
0

Saya menggunakan cara ini, dan menyukainya, itu memvalidasi formulir sebelum mengirimkan juga kompatibel dengan safari / google. tidak ada 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>
SotoArmando
sumber