Обновление в 2018 : я только что получил несколько баллов за этот старый ответ и просто хотел добавить, что решение best состоит в том, чтобы сделать операцию идемпотентной, чтобы дублированные представления безвредны.
Например, если форма создает заказ, введите в форму уникальный идентификатор. Когда сервер впервые видит запрос на создание заказа с таким идентификатором, он должен создать его и ответить «успех». Последующие представления также должны отвечать «успех» (в случае, если клиент не получил первый ответ), но не должны ничего менять.
Дубликаты должны быть обнаружены с помощью проверки уникальности в базе данных, чтобы предотвратить состояние гонки.
Я думаю, что ваша проблема в этой строке:
$('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();