Cập nhật năm 2018 : Tôi vừa nhận được một số điểm cho câu trả lời cũ này và chỉ muốn thêm vào đó là tốt nhất giải pháp sẽ là làm cho hoạt động trở nên bình thường để các bài nộp trùng lặp là vô hại.
Ví dụ: nếu biểu mẫu tạo đơn hàng, hãy đặt ID duy nhất vào biểu mẫu. Lần đầu tiên máy chủ nhìn thấy yêu cầu tạo đơn hàng với id đó, nó sẽ tạo nó và trả lời "thành công". Những lần gửi tiếp theo cũng sẽ đáp ứng "thành công" (trong trường hợp khách hàng không nhận được phản hồi đầu tiên) nhưng không nên thay đổi bất cứ điều gì.
Các bản sao phải được phát hiện thông qua kiểm tra tính duy nhất trong cơ sở dữ liệu để ngăn chặn các điều kiện chủng tộc.
Tôi nghĩ rằng vấn đề của bạn là dòng này:
$('input').attr('disabled','disabled');
Bạn đang vô hiệu hóa TẤT CẢ các đầu vào, bao gồm, tôi đoán, những dữ liệu mà biểu mẫu có nghĩa vụ phải gửi.
Để vô hiệu hóa chỉ các nút gửi, bạn có thể làm điều này:
$('button[type=submit], input[type=submit]').prop('disabled',true);
Tuy nhiên, tôi không nghĩ IE sẽ gửi biểu mẫu nếu ngay cả những nút đó bị tắt. Tôi muốn đề xuất một cách tiếp cận khác.
Một plugin jQuery để giải quyết nó
Chúng tôi chỉ giải quyết vấn đề này với mã sau đây. Mẹo ở đây là sử dụng jQuery data()
để đánh dấu biểu mẫu là đã gửi hay chưa. Bằng cách đó, chúng ta không phải gặp rắc rối với các nút gửi, điều này làm cho IE hoảng sợ.
// 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;
};
Sử dụng nó như thế này:
$('form').preventDoubleSubmission();
Nếu có hình thức AJAX mà nên được phép gửi nhiều lần mỗi tải trang, bạn có thể cung cấp cho họ một lớp học chỉ ra rằng, sau đó loại trừ chúng từ chọn của bạn như thế này:
$('form:not(.js-allow-double-submission)').preventDoubleSubmission();