Saya memiliki survei di situs web, dan tampaknya ada beberapa masalah dengan pengguna yang menekan enter (saya tidak tahu mengapa) dan secara tidak sengaja mengirimkan survei (formulir) tanpa mengklik tombol kirim. Apakah ada cara untuk mencegah hal ini?
Saya menggunakan HTML, PHP 5.2.9, dan jQuery di survei.
jquery
html
forms
form-submit
DForck42
sumber
sumber
Jawaban:
Anda dapat menggunakan metode seperti
Dalam membaca komentar di posting asli, untuk membuatnya lebih bermanfaat dan memungkinkan orang untuk menekan Enterjika mereka telah menyelesaikan semua bidang:
sumber
keydown
-document
alihwindow
agar ini berfungsi.&& !$(document.activeElement).is('textarea')
kondisi, atau baris baru di dalam textarea diblokir (setidaknya di IE).Larang masukkan kunci di mana saja
Jika Anda tidak memiliki
<textarea>
di formulir Anda, maka tambahkan saja yang berikut ke Anda<form>
:Atau dengan jQuery:
Ini akan menyebabkan setiap tombol yang ditekan di dalam formulir akan diperiksa pada
key
. Jika tidakEnter
, maka ia akan kembalitrue
dan apa pun terus seperti biasa. Jika yaEnter
, maka akan kembalifalse
dan segala sesuatu akan segera berhenti, sehingga formulir tidak akan dikirimkan.The
keydown
event lebih disukaikeyup
sebagaikeyup
terlambat untuk bentuk blok kirimkan. Secara historis ada jugakeypress
, tetapi ini sudah usang, seperti halnyaKeyboardEvent.keyCode
. Anda harus menggunakanKeyboardEvent.key
yang mengembalikan nama tombol yang ditekan. KetikaEnter
dicentang, maka ini akan memeriksa 13 (normal masuk) serta 108 (numpad masuk).Perhatikan bahwa
$(window)
seperti yang disarankan dalam beberapa jawaban lain, bukannya$(document)
tidak bekerja untukkeydown
/keyup
di IE <= 8, jadi itu bukan pilihan yang baik jika Anda ingin mencakup pengguna yang buruk juga.Izinkan tombol enter hanya di teks saja
Jika Anda memiliki
<textarea>
dalam formulir Anda (yang tentu saja harus menerima tombol Enter), kemudian tambahkan pengendali keydown ke setiap elemen input individu yang bukan a<textarea>
.Untuk mengurangi boilerplate, ini lebih baik dilakukan dengan jQuery:
Jika Anda memiliki fungsi event handler lain yang dilampirkan pada elemen input tersebut, yang Anda juga ingin memohon pada tombol enter karena beberapa alasan, maka hanya mencegah perilaku default acara daripada mengembalikan false, sehingga dapat dengan benar menyebar ke penangan lain.
Izinkan tombol enter di textareas dan kirimkan tombol saja
Jika Anda ingin mengizinkan tombol enter pada tombol kirim
<input|button type="submit">
juga, maka Anda selalu dapat memperbaiki pemilih seperti di bawah ini.Perhatikan bahwa
input[type=text]
seperti yang disarankan dalam beberapa jawaban lain tidak mencakup input non-teks HTML5 itu, jadi itu bukan pemilih yang baik.sumber
":input:not(textarea):not([type=submit]):not(button)"
jika Anda menggunakan<button>
bukannya<input type=submit>
input
?Bagian 4.10.22.2 Pengajuan implisit dari spesifikasi W3C HTML5 mengatakan:
Oleh karena itu, cara yang memenuhi standar untuk menonaktifkan pengiriman formulir secara implisit adalah dengan menempatkan tombol kirim yang dinonaktifkan sebagai tombol kirim pertama dalam bentuk:
Salah satu fitur bagus dari pendekatan ini adalah ia berfungsi tanpa JavaScript ; apakah JavaScript diaktifkan atau tidak, browser web yang memenuhi standar diperlukan untuk mencegah pengiriman formulir secara implisit.
sumber
<input type="submit" disabled style="display: none" aria-hidden="true" />
dan Anda dapat mengurangi ukuran halaman Anda dengan beberapa karakter. :-PSaya harus menangkap ketiga acara terkait dengan menekan tombol untuk mencegah agar formulir tidak dikirim:
Anda dapat menggabungkan semua hal di atas menjadi versi ringkas yang bagus:
sumber
$("#search").bind('keypress keyup keydown',preventSubmit)
;<form>
tag, tombol enter akan mengirimkan formulir ... Solusi ini menonaktifkan kunci enter dan memperbaiki masalahnya, terima kasih @Dave! Lalu saya mengaktifkan tombol enter untuk bidang tertentu olehid
.console.log
, saya memperbarui jawaban saya.keypress keyup keydown
Anda memicu kode apa pun dalam kondisi if dua kali .Jika Anda menggunakan skrip untuk melakukan pengiriman yang sebenarnya, maka Anda dapat menambahkan baris "return false" ke penangan onsubmit seperti ini:
Kirim panggil () pada formulir dari JavaScript tidak akan memicu acara.
sumber
Menggunakan:
Solusi ini berfungsi pada semua formulir di situs web (juga pada formulir yang disisipkan dengan Ajax), mencegah hanya Enterdalam teks input. Tempatkan dalam fungsi siap dokumen, dan lupakan masalah ini seumur hidup.
sumber
e.which
baik-baik saja; tidak perlu mengubahnya kee.keyCode
. Keduanya mengembalikan nilai 13 untuk tombol enter. Lihat stackoverflow.com/a/4471635/292060 dan stackoverflow.com/a/18184976/292060Alih-alih mencegah pengguna menekan Enter, yang mungkin tampak tidak wajar, Anda dapat meninggalkan formulir apa adanya dan menambahkan beberapa validasi sisi klien: Ketika survei tidak selesai hasilnya tidak dikirim ke server dan pengguna mendapat pesan yang bagus dengan mengatakan apa yang harus diselesaikan untuk mengisi formulir. Jika Anda menggunakan jQuery, coba plugin Validasi:
http://docs.jquery.com/Plugins/Validation
Ini akan membutuhkan lebih banyak pekerjaan daripada menangkap Entertombol, tetapi tentunya itu akan memberikan pengalaman pengguna yang lebih kaya.
sumber
Solusi jQuery kecil sederhana yang bagus:
sumber
var key = event.keyCode || event.which; if (key == 13) return false;
Saya belum bisa berkomentar, jadi saya akan memposting jawaban baru
Jawaban yang diterima ok-ish, tapi itu tidak berhenti mengirimkan pada numpad enter. Setidaknya dalam versi Chrome saat ini. Saya harus mengubah kondisi kode kunci ke ini, kemudian berfungsi.
sumber
Ini solusi saya untuk mencapai tujuan, bersih dan efektif.
sumber
Pendekatan yang sangat berbeda:
<button type="submit">
dalam bentuk akan diaktifkan saat menekan Enter.style="display:none;
false
, yang membatalkan proses pengiriman.<button type=submit>
untuk mengirimkan formulir. Cukup kembalitrue
untuk mengirimkan kiriman.<textarea>
atau kontrol bentuk lainnya akan berperilaku seperti biasa.<input>
akan memicu yang pertama<button type=submit>
, yang kembalifalse
, dan dengan demikian tidak ada yang terjadi.Jadi:
sumber
<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Memberi bentuk tindakan 'javascript: void (0);' sepertinya melakukan trik
sumber
Tidak menempatkan tombol kirim bisa dilakukan. Cukup masukkan skrip ke input (ketik = tombol) atau tambahkan eventListener jika Anda ingin mengirimkan data dalam formulir.
Lebih baik gunakan ini
daripada menggunakan ini
sumber
sumber
Saya perlu mencegah hanya masukan spesifik dari pengiriman, jadi saya menggunakan pemilih kelas, untuk membiarkan ini menjadi fitur "global" di mana pun saya membutuhkannya.
Dan kode jQuery ini:
Atau, jika keydown tidak cukup:
Beberapa catatan:
Memodifikasi berbagai jawaban yang baik di sini, Enterkuncinya tampaknya berfungsi untuk
keydown
semua browser. Sebagai alternatif, saya memperbaruibind()
keon()
metode.Saya penggemar berat pemilih kelas, menimbang semua pro dan kontra dan diskusi kinerja. Konvensi penamaan saya adalah 'idSomething' untuk menunjukkan bahwa jQuery menggunakannya sebagai id, untuk memisahkannya dari style CSS.
sumber
Anda bisa membuat metode JavaScript untuk memeriksa untuk melihat apakah Enterkunci itu dipukul, dan jika ya, untuk menghentikan pengiriman.
Sebut saja pada metode kirim.
sumber
HANYA MENGIRIM KIRIM tetapi tidak lain, fungsi penting dari tombol enter, seperti membuat paragraf baru di
<textarea>
:sumber
function(e)
seharusnyafunction(event)
. Kalau tidak, itu bekerja untuk saya. Terima kasih.on("keydown", function(event) { enterPressed = true; }
dan kemudian di ajukan acara, lakukanon("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}
ini akan memastikan bahwa itu berfungsi tidak masalah penundaan.Ini adalah cara yang sempurna, Anda tidak akan diarahkan dari halaman Anda
sumber
Saya punya masalah serupa, di mana saya punya kotak dengan "ajax textfields" (Yii CGridView) dan hanya satu tombol kirim. Setiap kali saya melakukan pencarian di bidang teks dan tekan enter formulir yang dikirimkan. Saya harus melakukan sesuatu dengan tombol karena itu adalah satu-satunya tombol yang umum di antara tampilan (pola MVC). Yang harus saya lakukan adalah menghapus
type="submit"
dan meletakkanonclick="document.forms[0].submit()
sumber
Saya pikir itu tercakup dengan baik dengan semua jawaban, tetapi jika Anda menggunakan tombol dengan beberapa kode validasi JavaScript, Anda bisa mengatur onkeypress form untuk Enter untuk memanggil pengiriman Anda seperti yang diharapkan:
JS onkeypress bisa berupa apa saja yang perlu Anda lakukan. Tidak perlu untuk perubahan global yang lebih besar. Ini terutama benar jika Anda bukan orang yang mengkode aplikasi dari awal, dan Anda telah memperbaiki situs web orang lain tanpa merobeknya dan mengujinya kembali.
sumber
Ada banyak jawaban bagus di sini, saya hanya ingin berkontribusi sesuatu dari perspektif UX. Kontrol keyboard dalam bentuk sangat penting.
Pertanyaannya adalah bagaimana cara menonaktifkan dari pengiriman saat tombol ditekan
Enter
. Tidak bagaimana mengabaikanEnter
di seluruh aplikasi. Jadi pertimbangkan melampirkan pawang ke elemen bentuk, bukan jendela.Menonaktifkan
Enter
pengiriman formulir harus tetap memungkinkan hal berikut:Enter
saat tombol kirim terfokus.Enter
.Ini hanya boilerplate tetapi mengikuti ketiga kondisi.
sumber
Sesuatu yang belum saya lihat dijawab di sini: ketika Anda menabrak elemen-elemen pada halaman, menekan Enterketika Anda sampai ke tombol kirim akan memicu pengendali onsubmit pada formulir, tetapi itu akan merekam acara tersebut sebagai MouseEvent. Inilah solusi singkat saya untuk mencakup sebagian besar pangkalan:
Ini bukan jawaban terkait jQuery
HTML
JavaScript
Untuk menemukan contoh yang berfungsi: https://jsfiddle.net/nemesarial/6rhogva2/
sumber
Dalam kasus khusus saya, saya harus berhenti ENTER mengirimkan formulir dan juga mensimulasikan mengklik tombol kirim. Ini karena tombol kirim memiliki klik penangan di atasnya karena kami berada dalam jendela modal (kode lama yang diwarisi). Bagaimanapun, inilah solusi kombo saya untuk kasus ini.
Kasus penggunaan ini secara khusus berguna untuk orang yang bekerja dengan IE8.
sumber
Ini bekerja untuk saya
sumber
Saya ingin menambahkan sedikit kode CoffeeScript (tidak diuji lapangan):
(Saya harap Anda menyukai trik yang bagus dalam klausa kecuali.)
sumber
Menggunakan Javascript (tanpa memeriksa bidang input apa pun):
Jika seseorang ingin menerapkan ini pada bidang tertentu, misalnya teks jenis input:
Ini bekerja dengan baik dalam kasus saya.
sumber
Pergilah ke css Anda dan tambahkan itu ke sana maka secara otomatis akan memblokir pengiriman formular Anda selama Anda telah mengirimkan input jika Anda tidak lagi menginginkannya, Anda dapat menghapusnya atau mengetik
activate
dandeactivate
sebagai gantinyasumber
Anda juga dapat menggunakan
javascript:void(0)
untuk mencegah pengiriman formulir.sumber
method="post"
formulir Anda. Misalnya saya ingin formulir dikirimkan oleh tombol, tetapi tidak ketika menekan enter sambil fokus pada input.method="post"
dalam bentuk dan karya-karyanya, periksa lagi.Ini telah bekerja untuk saya di semua browser setelah banyak frustrasi dengan solusi lain. Fungsi luar name_space hanya untuk menjauh dari menyatakan global, sesuatu yang juga saya rekomendasikan.
Penggunaan sampel:
sumber
Menggunakan:
sumber