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:
$('input').attr('disabled','disabled');
Anda menonaktifkan SEMUA input, termasuk, saya kira, orang-orang yang datanya harus dikirimkan oleh formulir.
Untuk menonaktifkan hanya tombol kirim, Anda dapat melakukan ini:
$('button[type=submit], input[type=submit]').prop('disabled',true);
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.
// jQuery plugin to prevent double submission of forms
jQuery.fn.preventDoubleSubmission = function() {
$(this).on('submit',function(e){
var $form = $(this);
if ($form.data('submitted') === true) {
// Previously submitted - don't submit again
e.preventDefault();
} else {
// Mark it so that the next submit can be ignored
$form.data('submitted', true);
}
});
// Keep chainability
return this;
};
Gunakan seperti ini:
$('form').preventDoubleSubmission();
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:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();