Посмотрите на jQuery Global Ajax Event Обработчики .
В двух словах, вы можете установить события, которые происходят на каждый AJAX-запрос, следовательно,имя Глобальные обработчики событий .Есть несколько различных событий, я буду использовать ajaxStart()
и ajaxComplete()
в моем примере кода ниже.
Идея состоит в том, что мы показываем загрузку, отключаем форму & кнопку на событии ajaxStart()
затем снова включите форму и скройте загрузочный элемент внутри события ajaxComplete()
.
var $form = $("form");
$form.ajaxStart(function() {
// show loading
$("#loading", this).show();
// Add class of disabled to form element
$(this).addClass("disabled");
// Disable button
$("input[type=submit]", this).attr("disabled", true);
});
И событие завершения AJAX
$form.ajaxComplete(function() {
// hide loading
$("#loading", this).hide();
// Remove disabled class
$(this).removeClass("disabled");
// Re-enable button
$("input[type=submit]", this).removeAttr("disabled");
});
Возможно, вам потребуетсятакже присоединяется к событию ajaxError
в случае сбоя вызова AJAX, поскольку вам может потребоваться очистить некоторые элементы.Проверьте это и посмотрите, что произойдет с ошибочным AJAX-запросом.
PS Если вы звоните $.ajax
или аналогичным ($.getJSON
), вы все равно можете установить эти события с помощью $.ajaxStart
и $.ajaxComplete
, поскольку AJAX не привязан ни к какому элементу.Вам нужно будет немного изменить код, так как у вас не будет доступа к $(this)
.