Terkadang saat responsnya lambat, seseorang mungkin mengklik tombol kirim beberapa kali.
Bagaimana cara mencegah hal ini terjadi?
javascript
submit
Oh Tuhan
sumber
sumber
Jawaban:
Gunakan javascript yang tidak mengganggu untuk menonaktifkan acara pengiriman di formulir setelah itu telah dikirim. Berikut ini contoh penggunaan jQuery.
EDIT: Memperbaiki masalah pengiriman formulir tanpa mengklik tombol kirim. Terima kasih, ichiban.
sumber
return true
? Saya pikir pengiriman awal harus bekerja tanpa itu.return true
tersirat jika dihilangkan.$(this).find("input[type='submit']").attr('disabled', 'disabled').val('submiting'); return true; });
Saya mencoba solusi vanstee bersama dengan validasi tidak mengganggu asp mvc 3, dan jika validasi klien gagal, kode masih dijalankan, dan pengiriman formulir dinonaktifkan untuk selamanya. Saya tidak dapat mengirim ulang setelah mengoreksi bidang. (lihat komentar bjan)
Jadi saya memodifikasi skrip vanstee seperti ini:
sumber
Kontrol pengiriman formulir sisi klien dapat dicapai dengan cukup elegan dengan meminta penangan onsubmit menyembunyikan tombol kirim dan menggantinya dengan animasi pemuatan. Dengan cara itu, pengguna mendapatkan umpan balik visual langsung di tempat yang sama di mana tindakannya (klik) terjadi. Pada saat yang sama Anda mencegah formulir dikirimkan di lain waktu.
Jika Anda mengirimkan formulir melalui XHR, perlu diingat bahwa Anda juga harus menangani kesalahan pengiriman, misalnya waktu tunggu. Anda harus menampilkan tombol kirim lagi karena pengguna perlu mengirim ulang formulir.
Di catatan lain, llimllib menampilkan poin yang sangat valid. Semua validasi formulir harus dilakukan di sisi server. Ini termasuk beberapa pemeriksaan pengiriman. Jangan pernah mempercayai klien! Ini bukan hanya kasus jika javascript dinonaktifkan. Anda harus ingat bahwa semua kode sisi klien dapat dimodifikasi. Agak sulit untuk membayangkan tetapi html / javascript yang berbicara ke server Anda belum tentu html / javascript yang Anda tulis.
Seperti yang disarankan llimllib, buat formulir dengan pengenal yang unik untuk formulir itu dan letakkan di kolom input tersembunyi. Simpan pengenal itu. Saat menerima data formulir hanya memprosesnya saat pengenal cocok. (Juga menautkan pengenal ke sesi pengguna dan mencocokkannya, juga, untuk keamanan ekstra.) Setelah pemrosesan data, hapus pengenal tersebut.
Tentu saja, sesekali, Anda perlu membersihkan pengenal yang tidak pernah mengirimkan data formulir apa pun. Tetapi kemungkinan besar situs web Anda sudah menggunakan semacam mekanisme "pengumpulan sampah".
sumber
sumber
<form onsubmit="return (typeof submitted == 'undefined') ? (submitted = true) : !submitted">
, atau menulisvar submitted = false;
pada titik yang tepat dari naskah Anda, untuk menghindari kesalahan berikut:Uncaught ReferenceError: submitted is not defined
.Berikut cara sederhana untuk melakukannya:
sumber
Nonaktifkan tombol kirim segera setelah klik. Pastikan Anda menangani validasi dengan benar. Juga pertahankan halaman perantara untuk semua pemrosesan atau operasi DB dan kemudian alihkan ke halaman berikutnya. Ini memastikan bahwa Refresh halaman kedua tidak melakukan pemrosesan lain.
sumber
form page ---submits to---> form_submission_script.php ---after saving, redirects to---> form_thankyou.html
Hash waktu saat ini, jadikan sebagai masukan tersembunyi di formulir. Di sisi server, periksa hash dari setiap pengiriman formulir; jika Anda sudah menerima hash itu maka Anda mendapat pengajuan ulang.
edit: mengandalkan javascript bukanlah ide yang baik, jadi Anda semua dapat terus meningkatkan ide-ide tersebut tetapi beberapa pengguna tidak akan mengaktifkannya. Jawaban yang benar adalah tidak mempercayai input pengguna di sisi server.
sumber
Anda juga dapat menampilkan bilah kemajuan atau pemutar untuk menunjukkan bahwa formulir sedang diproses.
sumber
Menggunakan JQuery, Anda dapat melakukan:
&
sumber
Saya tahu Anda menandai pertanyaan Anda dengan 'javascript' tetapi berikut ini solusi yang sama sekali tidak bergantung pada javascript:
Ini adalah pola aplikasi web bernama PRG , dan inilah artikel bagus yang menjelaskannya
sumber
Anda dapat mencegah banyak pengiriman hanya dengan:
sumber
Workin =true;
. Pengiriman ganda masih dimungkinkan, tetapi kemungkinannya lebih sedikit.Jawaban paling sederhana untuk pertanyaan ini seperti yang ditanyakan: "Kadang-kadang ketika responsnya lambat, seseorang mungkin mengklik tombol kirim beberapa kali. Bagaimana mencegah hal ini terjadi?"
Nonaktifkan saja tombol kirim formulir, seperti kode di bawah ini.
Ini akan menonaktifkan tombol kirim, pada klik pertama untuk mengirimkan. Juga jika Anda memiliki beberapa aturan validasi, maka itu akan berfungsi dengan baik. Semoga bisa membantu.
sumber
Di sisi klien , Anda harus menonaktifkan tombol kirim setelah formulir dikirimkan dengan kode javascript seperti metode yang disediakan oleh @vanstee dan @chaos.
Tetapi ada masalah untuk kelambatan jaringan atau situasi nonaktif javascript di mana Anda tidak boleh mengandalkan JS untuk mencegah hal ini terjadi.
Jadi, di sisi server , Anda harus memeriksa pengiriman berulang dari klien yang sama dan menghilangkan pengiriman berulang yang tampaknya merupakan upaya palsu dari pengguna.
sumber
Anda dapat mencoba plugin jquery safeform .
sumber
Solusi paling sederhana dan elegan untuk saya:
Tautan untuk lebih ...
sumber
Gunakan kode ini di formulir Anda. Itu akan menangani beberapa klik.
itu pasti akan berhasil.
sumber
Ini mengizinkan pengiriman setiap 2 detik. Dalam kasus validasi depan.
sumber
cara terbaik untuk mencegah beberapa pengiriman adalah dengan meneruskan id tombol dalam metode.
sumber
Untuk melakukan ini menggunakan javascript agak mudah. Berikut adalah kode yang akan memberikan fungsionalitas yang diinginkan:
sumber
Solusi paling sederhana adalah menonaktifkan tombol saat diklik, aktifkan setelah operasi selesai. Untuk memeriksa solusi serupa di jsfiddle:
Dan Anda dapat menemukan solusi lain untuk jawaban ini .
sumber
Ini bekerja dengan sangat baik untuk saya. Ini mengirimkan pertanian dan membuat tombol nonaktifkan dan setelah 2 detik aktifkan tombol.
Dalam ECMA6 Syntex
sumber
Hanya untuk menambah kemungkinan jawaban tanpa melewati validasi input browser
sumber
Alternatif dari apa yang telah diusulkan sebelumnya adalah:
sumber