44 Stimmen

Deaktivieren einiger globaler Ajax-Ereignishandler von jQuery für eine Anfrage

Angenommen, ich habe einige globale Ajax-Ereignishandler definiert (ajaxStart, ajaxStop und ajaxError). Normalerweise bin ich damit zufrieden, aber für eine Anfrage möchte ich den ajaxError-Handler deaktivieren, aber trotzdem die ajaxStart- und ajaxStop-Handler wie gewohnt ausführen. Die jQuery ajax Funktion Dokumentation erwähnt den "global"-Parameter, der auf false gesetzt und an die $.ajax-Funktion übergeben werden kann, um alle globalen Ajax-Event-Handler zu deaktivieren, aber sie erwähnen keine Möglichkeit, nur einige globale Handler zu deaktivieren.

Ich kann den ajaxError-Handler verhindern, indem ich die "url"-Eigenschaft des ajaxSettings-Objekts, das an die ajaxError-Funktion übergeben wird, einem Test unterziehe, aber das scheint etwas ungeschickt. Kennt jemand hier eine Möglichkeit, die Ausführung der ajaxError-Funktion zu deaktivieren, die für jemanden, der an der Stelle, an der die Funktion $.ajax aufgerufen wird?

Ich kann ein einfaches Beispiel geben, wenn jemand es sehen möchte.

96voto

Jon Punkte 411383

Das ist möglich und nicht schwer zu bewerkstelligen.

Sie müssen nur Ihren globalen Fehler-Handler einrichten ( .ajaxError ), um einige der Parameter zu erhalten, die jQuery zur Verfügung stellen kann:

$("div.log").ajaxError(function(evt, xhr, settings) {
    if(settings.suppressErrors) {
        return;
    }

    // Normal processing
});

Danach können Sie Folgendes hinzufügen suppressErrors: true zu den Einstellungen jeder AJAX-Anfrage, die Sie stellen, und wenn sie fehlschlägt, kehrt der Error-Handler zurück, ohne das zu tun, was er normalerweise tut.

Sehen Sie es in Aktion .

15voto

topek Punkte 17981

Wenn Sie sich diese if-Anweisung aus dem jquery/ajax-Quelltext ansehen https://github.com/jquery/jquery/blob/master/src/ajax.js#L579-582 die eine von vielen der gleichen Art ist, ist es klar, dass Ihr Problem nicht allein durch einen Jquery-Parameter gelöst werden kann.

Mein Vorschlag wäre, dies zu tun:

  • global auf false setzen, wie Vaibhav Gupta sagte

  • Ihre globalen Handler im spezifischen Ajax-Aufruf auf lokale Handler abbilden und das globale Ereignis über die Methode $.event.trigger auslösen

Beispiel:

$.ajax({
    url: "test.html",
    global: false,
    beforeSend: function(){$.event.trigger('ajaxStart');},
    complete: function(){$.event.trigger('ajaxStop');},
    error: your_error_handler
});

9voto

Vaibhav Gupta Punkte 1563

Versuchen zu verwenden global: false in Ihrer Ajax-Anfrage wie:

 $.ajax({
   url: "test.html",
   global: false,
   // ...
 });

Quelle:: http://docs.jquery.com/Ajax_Events

Suchen Sie nach Global Events.

9voto

Augustus Kling Punkte 3233

Sie können einstellen $.event.global.ajaxError a false um das Aufrufen des globalen Fehler-Callbacks vorübergehend zu deaktivieren. Verwenden Sie die error y complete Rückrufe Ihrer speziellen Anfrage, um die Flaggen zu setzen:

$.ajax({
    url: 'some.domain.com/',
}).error(function(jXHR){
    // Disable global error logging
    $.event.global.ajaxError = false;
}).complete(function(){
    // Enable global error logging
    $.event.global.ajaxError = true;
});

Ein Beispiel ist verfügbar unter jsFiddle .

Nach diesen Ausführungen möchte ich hinzufügen, dass ich Jons Vorschlag immer noch vorziehen würde. Diese Technik erfordert es, das Flag an zwei Stellen zu setzen, von denen man eine vergessen könnte und so die globalen Handler versehentlich deaktiviert werden könnten. Der andere Grund ist, dass Jons Technik garantiert über alle jQuery-Versionen hinweg funktionieren sollte, bei denen das Setzen einiger interner Flags nicht zuverlässig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X