¿Es posible automatizar la presentación/ocultación de un gif de carga de AJAX, y la desactivación/habilitación del botón de enviar al mismo tiempo? (Cuando el botón de envío es un estilo < a> no es un input type = submit)Jquery GIF de carga automática y botón desactivar al enviar clic
Actualmente el momento de presentar hago esto:
$("#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();
}
que he visto en algunos lugares se habla de cómo utilizar .ajaxStart() para mostrar automáticamente el gif de carga, pero ¿es posible encontrar también una referencia al botón (una etiqueta de estilo < a>) en la que se hizo clic, y también desactivarlo/habilitarlo automáticamente?
El objetivo de esto es no tener que escribir manualmente Start/EndAjax cada vez y asegurarse de que la aplicación sea coherente en todas partes.
EDITAR
Ninguna de las respuestas hasta el momento la oferta de automatización - Cualquier solución (como mi actual) por encima de donde se tiene que escribir manualmente inicio/final, antes y después de cada $ .ajax sola() produce un problema de mantenimiento : Es fácil olvidarse de ubicar el inicio/fin al lado de algunas llamadas $ .ajax(), y si desea cambiar la forma en que funciona más adelante, debe revisar cada una de ellas para realizar el cambio.
EDIT 2 - para aclarar el punto re el .delegate() sugerencia
Dijiste "Puede conectar el controlador de eventos para cualquier elemento " - pero quiero adjuntar a cada elemento botón (DRY): por lo que he modificado la primera parte de su sugerencia sea:
$('div#buttons a.ui-icon').each(function(index) {
$(this).ajaxStart(function() {
$("#ajaxLoad").show();
});
});
Esto resuelve el primer problema, que es la forma de mostrar la .gif de carga para cualquier botón, sin tener que escribir de forma repetitiva " $ ("# ajaxLoad"). show() "en todas partes hay una llamada $ .ajax().
La siguiente parte es cómo desactivar cualquier botón cuando se hace clic (de nuevo sin ningún código repetitivo): sugirió .delegate(). Pero en su ejemplo, cada clic de botón llamará al método Save(). (He cambiado el selector para que coincida con mi 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
});
El problema con esto es que $ (esto) no siempre es el botón de guardar (el selector devuelve todos los botones), que podría ser el botón de borrar o el botón de cancelar o etc. Así que llamar a $ (this) .toggleClass está bien, pero al llamar a Save() significa que está llamando a la función incorrecta. Todos estos botones tienen ya un método .click:
$("#SaveButton").click(function() {
Save();
});
$("#DeleteButton").click(function() {
Delete();
});
Así que esta es la función de metrónomo original que necesita ser llamada donde dice $ (this) .something anteriormente. En este punto, debería estar llamando al clic original, o tal vez sea más correcto decir que debería burbujear hasta el clic original. El .delegate debe ser más genérico y el .click original proporcionará la implementación específica.
Como responsable de su edición: tendrá que definir estas cosas en un punto u otro; no hay escapatoria. Una posible solución sería crear una función de ajax superpuesta, digamos 'doAjax (..., ...)', incluyendo '$ .ajax' de jQuery y las acciones de los botones. Pero realmente depende de qué (tipo de cosas diferentes) intente hacer aquí, de si esta función de superposición puede ser simple o hacerse increíblemente compleja y perder todas sus ventajas. – Alec