Jika suatu formulir dikirimkan tetapi tidak dengan tombol tertentu, seperti
- dengan menekan Enter
- gunakan
HTMLFormElement.submit()
di JS
Bagaimana cara browser menentukan tombol pengiriman mana yang harus digunakan, seperti yang ditekan?
Ini signifikan pada dua tingkatan:
- memanggil
onclick
pengendali acara yang dilampirkan pada tombol kirim - data dikirim kembali ke server web
Eksperimen saya sejauh ini menunjukkan bahwa:
- saat menekan Enter, Firefox, Opera dan Safari menggunakan tombol kirim pertama dalam formulir
- saat menekan Enter, IE menggunakan tombol kirim pertama atau tidak sama sekali tergantung pada kondisi yang saya belum bisa mengetahuinya
- semua browser ini tidak menggunakan sama sekali untuk pengiriman JS
Apa yang dikatakan standar?
Jika itu akan membantu, ini kode pengujian saya (PHP hanya relevan untuk metode pengujian saya, bukan untuk pertanyaan saya sendiri)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
<h1>Get</h1>
<dl>
<?php foreach ($_GET as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<h1>Post</h1>
<dl>
<?php foreach ($_POST as $k => $v) echo "<dt>$k</dt><dd>$v</dd>"; ?>
</dl>
<form name="theForm" method="<?php echo isset($_GET['method']) ? $_GET['method'] : 'get'; ?>" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
<input type="text" name="method" />
<input type="submit" name="action" value="Button 1" onclick="alert('Button 1'); return true" />
<input type="text" name="stuff" />
<input type="submit" name="action" value="Button 2" onclick="alert('Button 2'); return true" />
<input type="button" value="submit" onclick="document.theForm.submit();" />
</form>
</body></html>
sumber
HTML 4 tidak membuatnya eksplisit. Draf kerja HTML5 saat ini menetapkan bahwa tombol kirim pertama harus default :
sumber
Andrezj sudah cukup berhasil mengatasinya ... tapi ini solusi lintas-browser yang mudah.
Ambil bentuk seperti ini:
dan refactor untuk ini:
Karena spesifikasi W3C menunjukkan beberapa tombol kirim valid, tetapi mengabaikan panduan tentang bagaimana agen pengguna harus menanganinya, produsen browser dibiarkan menerapkan sebagaimana yang mereka inginkan. Saya menemukan mereka akan mengirim tombol kirim pertama dalam formulir, atau mengirim tombol kirim berikutnya setelah bidang formulir yang saat ini memiliki fokus.
Sayangnya, cukup menambahkan gaya tampilan: tidak ada; tidak akan berfungsi karena spesifikasi W3C menunjukkan elemen tersembunyi apa pun harus dikecualikan dari interaksi pengguna. Jadi sembunyikan saja di depan mata!
Di atas adalah contoh dari solusi yang akhirnya saya produksi. Menekan tombol enter memicu pengiriman formulir default adalah perilaku seperti yang diharapkan, bahkan ketika nilai-nilai non-standar lain hadir dan mendahului tombol pengiriman default di DOM. Bonus untuk interaksi mouse / keyboard dengan input pengguna eksplisit sambil menghindari penangan javascript.
Catatan: menabrak formulir tidak akan menampilkan fokus untuk elemen visual apa pun namun masih akan menyebabkan tombol yang tidak terlihat dipilih. Untuk menghindari masalah ini, cukup atur atribut tabindex sesuai dan hilangkan atribut tabindex pada tombol kirim tak terlihat. Meskipun tampaknya tidak sesuai untuk mempromosikan gaya ini ke! Penting, mereka harus mencegah kerangka kerja atau gaya tombol yang ada dari mengganggu perbaikan ini. Juga, gaya inline itu jelas merupakan bentuk yang buruk, tapi kami membuktikan konsep di sini ... bukan menulis kode produksi.
sumber
<div style="position: fixed; left: -1000px; top: -1000px />
. Hanya satu hal lagi yang perlu diperhatikan: Hanya meminimalkan atau memindahkan tombol dari aliran halaman dengan CSS mungkin memunculkan masalah WAI, karena pembaca layar masih akan melihat tombol default.<input/>
di sana?Saya pikir posting ini akan membantu jika seseorang ingin melakukannya dengan jQuery:
http://greatwebguy.com/programming/dom/default-html-button-submit-on-enter-with-jquery/
Solusi dasarnya adalah:
dan satu lagi yang saya suka adalah:
sumber
.wich
atributnya. Juga tidak perlu kembali ke DOM.keyCode
(atau.charCode
dalam hal ini).e.preventDefault();
ke awal fungsi ini untuk menghindari eksekusi tombol default "nyata". Bekerja dengan sangat baik.Saya memiliki formulir dengan 11 tombol kirim, dan akan selalu menggunakan tombol kirim pertama saat pengguna menekan enter. Saya membaca di tempat lain bahwa itu bukan ide yang baik (praktik buruk) untuk memiliki lebih dari satu tombol kirim pada formulir, dan cara terbaik untuk melakukan ini adalah memiliki tombol yang Anda inginkan sebagai default, karena satu-satunya tombol kirim pada formulir. Tombol-tombol lain harus dibuat menjadi "TYPE = BUTTON" dan acara onClick menambahkan bahwa panggilan Anda sendiri mengirimkan rutin dalam Javascript. Sesuatu seperti ini :-
Di sini, tombol3 adalah default, dan meskipun Anda secara pemrograman mengirimkan formulir dengan tombol lain, rutinitas mjsubmit memvalidasinya. HTH.
sumber
Ini sekarang dapat diselesaikan menggunakan
flexbox
:HTML
CSS
Penjelasan
Menggunakan kotak flex, kita dapat membalik urutan unsur-unsur dalam sebuah wadah yang menggunakan
display: flex
dengan juga menggunakan aturan CSS:flex-direction: row-reverse
. Ini tidak memerlukan CSS atau elemen tersembunyi. Untuk browser lama yang tidak mendukung flexbox, mereka masih mendapatkan solusi yang bisa diterapkan tetapi elemen tidak akan terbalik.Demo
http://codepen.io/Godwin/pen/rLVKjm
sumber
Saya kesulitan dengan pertanyaan yang sama karena saya telah mengirimkan tombol di tengah dari mana pengalihan dikirim ke halaman lain, seperti:
Ketika pengguna menekan tombol enter, tombol ini diklik alih-alih tombol kirim lainnya.
Jadi saya melakukan beberapa tes primitif dengan membuat dari dengan beberapa tombol kirim dan opsi visibilitas yang berbeda dan onclick event yang memberitahukan tombol mana yang diklik: https://jsfiddle.net/aqfy51om/1/
Browser dan OS yang saya gunakan untuk pengujian:
WINDOWS
OSX
Sebagian besar browser ini mengklik tombol pertama meskipun opsi visibilitas diterapkan kecuali IE dan Safari yang mengklik tombol ketiga, yang "terlihat" di dalam wadah "tersembunyi":
Jadi saran saya, yang akan saya gunakan sendiri, adalah:
Jika formulir Anda memiliki beberapa tombol kirim dengan makna berbeda, maka sertakan tombol kirim dengan tindakan default di awal formulir, yaitu:
style="width: 0; height: 0; overflow: hidden;"
EDIT Pilihan lain mungkin untuk mengimbangi tombol (masih di awal dari)
style="position: absolute; left: -9999px; top: -9999px;"
, hanya mencobanya di IE - bekerja, tetapi saya tidak tahu apa lagi yang bisa gagal, misalnya mencetak ..sumber
Dari komentar Anda:
Saya masukkan
<input type="hidden" value="form_name" />
ke dalam setiap formulir.Jika mengirimkan dengan javascript: tambahkan ajukan acara ke formulir, jangan klik acara ke tombolnya. Pengguna Saavy tidak terlalu sering menyentuh mouse mereka.
sumber
Ketika Anda memiliki beberapa tombol kirim dalam satu formulir dan pengguna menekan tombol ENTER untuk mengirimkan formulir dari bidang teks, kode ini mengabaikan fungsi default, dengan memanggil acara kirim pada formulir dari acara tekan tombol. Ini kode itu:
sumber
Aneh bahwa tombol pertama Masukkan pergi selalu tombol pertama tanpa terlihat atau tidak, misalnya menggunakan jquery
show/hide()
. Menambahkan atribut.attr('disabled', 'disabled')
mencegah sepenuhnya menerima tombol Enter submit. Masalahnya misalnya ketika menyesuaikan visibilitas Insert / Edit + Delete button dalam dialog rekaman. Saya menemukan lebih sedikit peretasan dan penempatan Edit di depan Sisipkandan gunakan kode javascript:
sumber
resep saya:
Ini akan mengirimkan bidang tersembunyi default jika tidak ada tombol yang 'diklik'.
jika diklik, mereka memiliki preferensi dan nilainya dilewatkan.
sumber
Solusi lain yang saya gunakan adalah hanya memiliki satu tombol dalam formulir, dan memalsukan tombol lainnya.
Ini sebuah contoh:
Saya kemudian gaya elemen rentang agar terlihat seperti tombol. Seorang pendengar JS mengamati rentang dan melakukan operasi yang diinginkan setelah diklik.
Tidak selalu tepat untuk semua situasi, tetapi setidaknya itu cukup mudah dilakukan.
sumber
Dari spesifikasi HTML 4 :
Ini berarti bahwa diberikan lebih dari 1 tombol kirim dan tidak ada yang diaktifkan (diklik), tidak ada yang harus berhasil.
Dan saya berpendapat ini masuk akal: Bayangkan formulir besar dengan banyak tombol kirim. Di bagian atas, ada tombol "hapus catatan ini", lalu banyak input mengikuti dan di bagian bawah ada tombol "perbarui catatan ini". Pengguna yang menekan enter saat berada di bidang di bagian bawah formulir tidak akan pernah curiga bahwa ia secara implisit mengenai "hapus catatan ini" dari atas.
Oleh karena itu saya pikir itu bukan ide yang baik untuk menggunakan tombol pertama atau lainnya yang pengguna tidak mendefinisikan (klik) satu. Namun demikian, browser melakukannya tentu saja.
sumber
EDIT: Maaf, ketika menulis jawaban ini saya berpikir tentang mengirimkan tombol dalam pengertian umum. Jawaban di bawah ini bukan tentang beberapa
type="submit"
tombol, karena hanya menyisakan satutype="submit"
dan mengubah yang lain menjaditype="button"
. Saya meninggalkan jawabannya di sini sebagai referensi jika membantu seseorang yang dapat mengubahtype
dalam bentuk mereka:Untuk menentukan tombol apa yang ditekan saat menekan masuk, Anda dapat menandainya
type="submit"
, dan tombol lainnya menandainyatype="button"
. Sebagai contoh:sumber