Saya memiliki formulir yang memerlukan sedikit waktu agar server dapat memproses. Saya perlu memastikan bahwa pengguna menunggu dan tidak mencoba mengirim ulang formulir dengan mengklik tombol lagi. Saya mencoba menggunakan kode jQuery berikut:
<script type="text/javascript">
$(document).ready(function() {
$("form#my_form").submit(function() {
$('input').attr('disabled', 'disabled');
$('a').attr('disabled', 'disabled');
return true;
});
});
</script>
Ketika saya mencoba ini di Firefox semuanya dinonaktifkan tetapi formulir tidak dikirimkan dengan data POST yang seharusnya dimasukkan. Saya tidak dapat menggunakan jQuery untuk mengirimkan formulir karena saya perlu tombol untuk dikirimkan dengan formulir karena ada beberapa tombol kirim dan saya menentukan mana yang digunakan oleh mana nilai seseorang dimasukkan dalam POST. Saya perlu formulir yang dikirimkan seperti biasanya dan saya harus menonaktifkan semuanya setelah itu terjadi.
Terima kasih!
Jawaban:
Pembaruan pada tahun 2018 : Saya baru saja mendapat beberapa poin untuk jawaban lama ini, dan hanya ingin menambahkan bahwa solusi terbaik adalah membuat operasi idempoten sehingga pengiriman duplikat tidak berbahaya.
Misalnya, jika formulir membuat pesanan, masukkan ID unik di formulir. Pertama kali server melihat permintaan pembuatan pesanan dengan id itu, ia harus membuatnya dan merespons "sukses". Pengajuan selanjutnya juga harus merespons "sukses" (jika klien tidak mendapatkan tanggapan pertama) tetapi tidak boleh mengubah apa pun.
Duplikat harus dideteksi melalui pemeriksaan keunikan di database untuk mencegah kondisi balapan.
Saya pikir masalah Anda adalah baris ini:
Anda menonaktifkan SEMUA input, termasuk, saya kira, orang-orang yang datanya harus dikirimkan oleh formulir.
Untuk menonaktifkan hanya tombol kirim, Anda dapat melakukan ini:
Namun, saya tidak berpikir IE akan mengirimkan formulir jika tombol-tombol itu dinonaktifkan. Saya menyarankan pendekatan yang berbeda.
Plugin jQuery untuk menyelesaikannya
Kami baru saja menyelesaikan masalah ini dengan kode berikut. Caranya di sini adalah menggunakan jQuery's
data()
untuk menandai formulir yang sudah dikirimkan atau belum. Dengan begitu, kita tidak perlu dipusingkan dengan tombol kirim, yang membuat IE ketakutan.Gunakan seperti ini:
Jika ada formulir AJAX yang harus diizinkan untuk mengirimkan beberapa kali per halaman memuat, Anda bisa memberi mereka kelas yang menunjukkan itu, lalu mengecualikannya dari pemilih Anda seperti ini:
sumber
$(this)
kevar that = $(this)
?$form
- 'form' karena lebih deskriptif, dan yang utama$
karena menurut konvensi saya, itu berarti objek jQuery.Pendekatan pengaturan waktu salah - bagaimana Anda tahu berapa lama tindakan akan dilakukan pada browser klien?
Bagaimana cara melakukannya
Ketika formulir dikirimkan, ini akan menonaktifkan semua tombol kirim di dalam.
Ingat, di Firefox saat Anda menonaktifkan tombol, status ini akan diingat ketika Anda kembali ke riwayat. Untuk mencegahnya, Anda harus mengaktifkan tombol pada pemuatan halaman, misalnya.
sumber
Saya pikir jawaban Nathan Long adalah cara untuk pergi. Bagi saya, saya menggunakan validasi sisi klien, jadi saya hanya menambahkan syarat bahwa formulir tersebut valid.
EDIT : Jika ini tidak ditambahkan, pengguna tidak akan pernah bisa mengirimkan formulir jika validasi sisi klien menemukan kesalahan.
sumber
event.timeStamp
tidak berfungsi di Firefox. Mengembalikan salah adalah tidak standar, Anda harus meneleponevent.preventDefault()
. Dan sementara kita melakukannya, selalu gunakan kawat gigi dengan konstruk kontrol .Untuk meringkas semua jawaban sebelumnya, berikut adalah plugin yang berfungsi dan bekerja lintas browser.
Untuk mengatasi Kern3l, metode pewaktuan bekerja untuk saya hanya karena kami mencoba menghentikan klik dua kali tombol kirim. Jika Anda memiliki waktu respons yang sangat lama untuk pengiriman, saya sarankan mengganti tombol kirim atau formulir dengan pemintal.
Benar-benar memblokir pengiriman formulir berikutnya, seperti yang dilakukan sebagian besar contoh di atas, memiliki satu efek samping yang buruk: jika ada kegagalan jaringan dan mereka ingin mencoba mengirim ulang, mereka tidak akan dapat melakukannya dan akan kehilangan perubahan yang mereka lakukan. terbuat. Ini pasti akan membuat pengguna marah.
sumber
Silakan, periksa plugin jquery-safeform .
Contoh penggunaan:
sumber
Benar. Nama / nilai elemen bentuk yang dinonaktifkan tidak akan dikirim ke server. Anda harus mengaturnya sebagai elemen hanya baca .
Juga, jangkar tidak dapat dinonaktifkan seperti itu. Anda harus menghapus HREF mereka (tidak disarankan) atau mencegah perilaku default mereka (cara yang lebih baik), misalnya:
sumber
$('input[type=submit]').attr("disabled", "disabled");
tetapi cara favorit saya adalah dengan memasukkanonclick="this.disabled = 'disabled'"
klik kirim.Ada kemungkinan untuk meningkatkan pendekatan Nathan Long . Anda dapat mengganti logika untuk mendeteksi formulir yang sudah dikirimkan dengan yang ini:
sumber
Kode Nathan tetapi untuk plugin Validasi jQuery
Jika Anda menggunakan plugin jQuery Validate, mereka sudah mengirimkan handler diimplementasikan, dan dalam hal ini tidak ada alasan untuk mengimplementasikan lebih dari satu. Kode:
Anda dapat dengan mudah memperluasnya di dalam
} else {
-blok untuk menonaktifkan input dan / atau tombol kirim.Bersulang
sumber
Saya akhirnya menggunakan ide dari posting ini untuk menghasilkan solusi yang sangat mirip dengan versi AtZako.
Gunakan seperti ini:
Saya menemukan bahwa solusi yang tidak menyertakan semacam batas waktu tetapi hanya menonaktifkan pengiriman atau elemen formulir yang dinonaktifkan menyebabkan masalah karena setelah penguncian dipicu, Anda tidak dapat mengirim lagi hingga Anda menyegarkan halaman. Itu menyebabkan beberapa masalah bagi saya ketika melakukan hal-hal ajax.
Ini mungkin bisa dipoles sedikit karena tidak semewah itu.
sumber
Jika menggunakan AJAX untuk mengirim formulir, set
async: false
harus mencegah pengiriman tambahan sebelum formulir dihapus:sumber
Solusi Nathan yang dimodifikasi sedikit untuk Bootstrap 3. Ini akan mengatur pemuatan teks ke tombol kirim. Selain itu akan habis setelah 30 detik dan memungkinkan formulir untuk dikirim kembali.
sumber
Gunakan dua tombol kirim.
Dan jQuery:
sumber
Gunakan penghitung sederhana saat kirim.
Dan
monitor()
fungsi panggilan pada mengirimkan formulir.sumber
Saya mengalami masalah yang serupa dan solusi saya adalah sebagai berikut.
Jika Anda tidak memiliki validasi sisi klien maka Anda cukup menggunakan metode jquery one () seperti yang didokumentasikan di sini.
http://api.jquery.com/one/
Ini menonaktifkan pawang setelah dipanggil.
Jika Anda melakukan validasi sisi klien seperti yang saya lakukan maka itu sedikit lebih rumit. Contoh di atas tidak akan membiarkan Anda mengirim lagi setelah validasi gagal. Coba pendekatan ini sebagai gantinya
sumber
Anda dapat menghentikan pengiriman kedua dengan ini
sumber
Solusi saya:
sumber
Dalam kasus saya, pengiriman form memiliki beberapa kode validasi, jadi saya menambah jawaban Nathan Long termasuk pos pemeriksaan onsubmit
sumber
Ubah tombol kirim:
Dengan tombol normal:
Kemudian gunakan fungsi klik:
Dan ingat tombol aktifkan kembali ketika diperlukan:
sumber
Saya tidak percaya trik css kuno yang baik dari pointer-events: belum ada yang disebutkan. Saya memiliki masalah yang sama dengan menambahkan atribut yang dinonaktifkan tetapi ini tidak memposting kembali. Coba yang di bawah ini dan ganti #SubmitButton dengan ID tombol kirim Anda.
sumber
Enter
kunci.Mengapa tidak hanya ini - ini akan mengirimkan formulir tetapi juga menonaktifkan tombol pengiriman,
Juga, jika Anda menggunakan jQuery Validate, Anda dapat meletakkan kedua baris ini di bawah
if ($('#myForm').valid())
.sumber
kode ini akan menampilkan pemuatan pada label tombol, dan mengatur tombol ke
nonaktifkan keadaan, lalu setelah pemrosesan, aktifkan kembali dan kembalikan teks tombol asli **
sumber
Saya memecahkan masalah yang sangat mirip menggunakan:
sumber