Ist es möglich, das Anzeigen/Verbergen eines Ajax-Lade-GIFs zu automatisieren, und gleichzeitig das Senden/Aktivieren des Senden-Buttons zu aktivieren? (Wenn die Submit-Button ist ein Stil < a> keine input type = abschicken)Jquery automatisches Laden Gif und Button deaktivieren beim Senden klicken
Zeit bei der Einreichung ich dies tun:
$("#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();
}
ich ein paar Plätze gesehen habe darüber sprechen, wie .ajaxStart zu verwenden() um das Lade-GIF automatisch anzuzeigen, aber ist es auch möglich, einen Verweis auf die Schaltfläche (ein gestyltes <a> -Tag), auf das geklickt wurde, zu finden und diese auch automatisch zu aktivieren/deaktivieren?
Der Punkt ist, dass nicht jedes Mal Start/EndAjax manuell eingegeben werden muss, und um sicherzustellen, dass die App überall konsistent ist.
EDIT
Keine der Antworten bisher bieten Automatisierung - jede Lösung (wie mein aktuellen oben), wo Sie müssen manuell Start/Ende vor und nach jedem einzelnen $ Schnipsel() verursacht ein Wartungsproblem geben : Es ist leicht zu vergessen, den Start/das Ende neben einigen $ .ajax() -Aufrufen zu platzieren, und wenn Sie später ändern möchten, wie Sie es später machen, müssen Sie jeden einzelnen durchlaufen, um die Änderung vorzunehmen.
EDIT 2 - Punkt re der .delegate() Vorschlag zur Klärung
Sie sagten, „Sie können Ihre Ereignishandler jede Element anhängen“ - aber ich will es jeder Taste Element befestigen (DRY): so habe ich den ersten Teil Ihres Vorschlag geändert werden:
$('div#buttons a.ui-icon').each(function(index) {
$(this).ajaxStart(function() {
$("#ajaxLoad").show();
});
});
Dies löst das erste Problem, das ist, wie der Laden .gif für jede Taste zeigen, ohne wiederholt mit "eingeben $ ("# ajaxLoad"). show() "überall dort ist ein $ .ajax() Aufruf.
Der nächste Teil ist, wie man eine Schaltfläche deaktiviert, wenn es geklickt wird (wieder ohne sich wiederholenden Code) - Sie vorgeschlagen .delegate(). Aber in Ihrem Beispiel ruft jeder Knopfklick die Save() Methode auf. (Änderte ich die Wähler meine html übereinstimmen)
$('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
});
Das Problem dabei ist, dass $ (this) nicht immer die Taste save (der Wähler gibt alle Tasten), könnte es die Löschtaste oder die sein Cancel-Taste oder usw. Das Aufrufen von $ (this) .toggleClass ist in Ordnung, aber das Aufrufen von Save() bedeutet, dass Sie die falsche Funktion aufrufen. Alle diese Tasten haben bereits eine .click Methode:
$("#SaveButton").click(function() {
Save();
});
$("#DeleteButton").click(function() {
Delete();
});
Das ist also die ursprüngliche Klick-Funktion, die aufgerufen werden muss, wo es heißt $ (this) .something oben. An dieser Stelle sollte es den ursprünglichen Klick aufrufen - oder vielleicht ist es korrekter zu sagen, dass es dann zum ursprünglichen .click sprudeln sollte. Das .delegate muss generischer sein, und das ursprüngliche .click wird die spezifische Implementierung bereitstellen.
Als Antwort auf Ihre Bearbeitung: Sie müssen diese Dinge an einem oder anderen Punkt definieren; da gibt es kein Entkommen. Eine mögliche Lösung wäre, eine überlappende Ajax-Funktion selbst zu erstellen, sagen wir 'doAjax (..., ...)', einschließlich jQuerys '$ .ajax' und den Tastenaktionen. Aber es hängt wirklich davon ab, was (verschiedene Dinge) du hier machen willst, ob diese überlappende Funktion einfach bleibt oder unglaublich komplex wird und alle ihre Vorteile verliert. – Alec