อัปเดตในปี 2018 : ฉันเพิ่งได้รับคะแนนสำหรับคำตอบเก่านี้และต้องการเพิ่มว่าทางออกที่ดีที่สุดคือการทำให้ idempotent ดำเนินการเพื่อให้การส่งซ้ำนั้นไม่เป็นอันตราย
เช่นถ้าแบบฟอร์มสร้างคำสั่งซื้อให้ใส่ ID ที่ไม่ซ้ำกันในแบบฟอร์ม ในครั้งแรกที่เซิร์ฟเวอร์เห็นคำขอสร้างคำสั่งซื้อด้วยรหัสนั้นควรสร้างและตอบสนอง "สำเร็จ" การส่งครั้งต่อไปควรตอบสนอง "ความสำเร็จ" (ในกรณีที่ลูกค้าไม่ได้รับคำตอบแรก) แต่ไม่ควรเปลี่ยนแปลงอะไร
ควรตรวจจับรายการที่ซ้ำกันผ่านการตรวจสอบที่ไม่ซ้ำกันในฐานข้อมูลเพื่อป้องกันสภาพการแข่งขัน
ฉันคิดว่าปัญหาของคุณคือบรรทัดนี้:
$('input').attr('disabled','disabled');
คุณกำลังปิดการใช้งานอินพุตทั้งหมดรวมถึงฉันเดาว่าคนที่มีข้อมูลในแบบฟอร์มควรจะส่ง
หากต้องการปิดการใช้งานเพียงปุ่มส่งคุณสามารถทำได้:
$('button[type=submit], input[type=submit]').prop('disabled',true);
อย่างไรก็ตามฉันไม่คิดว่า IE จะส่งแบบฟอร์มหากปุ่มเหล่านั้นถูกปิดใช้งาน ฉันขอแนะนำวิธีการที่แตกต่าง
ปลั๊กอิน jQuery เพื่อแก้ปัญหา
เราเพิ่งแก้ไขปัญหานี้ด้วยรหัสต่อไปนี้ เคล็ดลับที่นี่ใช้ jQuery data()
เพื่อทำเครื่องหมายแบบฟอร์มที่ส่งไปแล้วหรือไม่ ด้วยวิธีนี้เราไม่ต้องยุ่งกับปุ่มส่งซึ่งทำให้ IE หมดความกังวล
// 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;
};
ใช้แบบนี้:
$('form').preventDoubleSubmission();
หากมีรูปแบบ AJAX ที่ควรได้รับอนุญาตให้ส่งหลายครั้งต่อการโหลดหน้าเว็บคุณสามารถให้คลาสที่ระบุว่าพวกเขาแล้วแยกออกจากตัวเลือกของคุณดังนี้:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();