Возможно ли автоматизировать отображение/скрытие гигабайта загрузки ajax и одновременное отключение/включение кнопки отправки? (Когда кнопка отправки является стиль < а> не тип ввода = представить)JQuery автоматической загрузки gif и кнопки disable on submit click
В настоящее время при подаче я делаю это:
$("#save_button_id").click(function() {
if ($('#save_button_id').hasClass('ui-state-disabled')) return false;
Save();
});
function Save() {
StartAjax($("#save_button_id"));
$.ajax({
success: function (data) {
EndAjax($("#save_button_id"));
// etc...
},
error: function (xhr, status, error) {
EndAjax($("#save_button_id"));
// etc ...
}
});
}
function StartAjax(button) {
DisableButtonClick(button);
$("#ajaxLoad").show();
}
function EndAjax(button) {
EnableButtonClick(button);
$("#ajaxLoad").hide();
}
Я видел несколько мест, говорить о том, как использовать .ajaxStart(), чтобы автоматически показывать загрузочный gif, но можно ли также найти ссылку на кнопку (в стиле < a>), которая была нажата, и автоматически отключить/включить это?
Дело в том, что каждый раз не нужно вручную вводить Start/EndAjax и следить за тем, чтобы приложение было согласованным везде.
EDIT
Ни один из ответов до сих пор предлагают автоматизации - любое решение (как мой текущий выше), где вы должны вручную ввести начало/конец до и после каждого $ .ajax() не вызывает проблемы технического обслуживания : Легко забыть поставить начало/конец рядом с некоторыми вызовами $ .ajax(), и если вы хотите изменить, как это работает, вам нужно пройти через все, чтобы внести изменения.
EDIT 2 - уточнить точку повторно в .delegate() предложение
Вы сказали: «Вы можете прикрепить обработчик события любой элемент» - но я хочу, чтобы прикрепить ее к каждый кнопки элемента (DRY): так я модифицировал первую часть вашего предложения, чтобы быть:
$('div#buttons a.ui-icon').each(function(index) {
$(this).ajaxStart(function() {
$("#ajaxLoad").show();
});
});
Это решает первую задачу, которая, как показывает загрузку .gif для любой кнопки, без необходимости повторно вводить " $ ("# ajaxLoad"). show() "везде есть вызов $ .ajax().
Следующая часть - как отключить любую кнопку при нажатии (опять же без повторного кода) - вы предложили .delegate(). Но в вашем примере каждый щелчок на кнопке вызывает метод Save(). (Я изменил селектор, чтобы соответствовать мой HTML)
$('div#buttons a.ui-icon').delegate('button:not(.ui-state-disabled)', 'click', function() {
$(this).toggleClass('ui-state-disabled');
Save(); // this line needs replacing with a call to $(this).something
});
Проблема с этим состоит в том, что $ (это) не всегда кнопка сохранения (селектор возвращает все кнопки), это может быть кнопка или удалить кнопку отмены или т. д. Таким образом, вызов $ (this) .toggleClass прекрасен, но вызов Save() означает, что вы вызываете неправильную функцию. Все эти кнопки уже есть .click метод:
$("#SaveButton").click(function() {
Save();
});
$("#DeleteButton").click(function() {
Delete();
});
Так это исходная функция клик, который должен быть вызван, где он говорит, что $ (это) .something выше. На этом этапе он должен вызывать оригинальный клик - или, возможно, правильнее сказать, что он должен затем перейти к исходному .click. Файл .delegate должен быть более общим, а оригинальный .click будет обеспечивать конкретную реализацию.
Как ответ на ваше редактирование: вам нужно будет определить эти вещи в какой-то момент; это не ускользает. Одним из возможных решений было бы создать функцию перекрытия ajax самостоятельно, например 'doAjax (..., ...)', включая jQuery '$ .ajax' и действия кнопки. Но это действительно зависит от того, что (что-то другое) вы пытаетесь сделать здесь, о том, может ли эта перекрывающаяся функция оставаться простой или невероятно сложной и потерять все свои преимущества. – Alec