2012-03-27 7 views
2

Ich versuche, eine Möglichkeit zu finden, meine normalen Erfolg Handler zu verhindern, wenn eine Aussage wahr ist, z.Verhindern Sie den zugewiesenen Erfolgshandler abhängig von dem Inhalt der geladenen Datei

$.ajax({ 
    url: ... 
    success: function(response) { 
     if (response.success) { 
      // do success 
     } else { 
      // do fail, maybe login timeout 
     } 
    } 
}); 

Dies ist der einfache Weg. Sehr einfach nur ein Objekt mit success = true/false.

Aber gibt es eine Möglichkeit, zu verhindern, dass mein Erfolgshandler ausgelöst wird, wenn eine Aussage wahr ist, z.

$.ajax({ 
    url: ... 
    success: function(response) { 
     // do success 
    } 
}); 
$.ajaxFireBeforeAllOtherSuccessHandler(function(response) { 
    return response.success; 
}); 

und dann dieser mit $.ajaxFireBeforeAllOtherSuccessHandler (Pseudonamen) vor alle anderen Erfolg Handler und bestimmt auszulösen, wenn die andere ausgelöst.

Ich weiß, dass ich die statusCode des Antrags vielleicht durch 401 einstellen und habe dann einen Steuer Master mit $.ajaxSetup:

$.ajaxSetup({ 
    statusCode: { 
     401: function() { 
      // this do fail 
     } 
    } 
}); 

Aber es ist nicht möglich für mich im Moment!

Ein anderer war, ist ein Kontrollverfahren haben, wo Sie Ihre Rückruf wickeln in:

$.ajax({ 
    url: ... 
    success: function() { checkAjax(arguments, function() { 
     // do success 
    }); } 
}); 
function checkAjax(a, c) { 
    return a[0].success && c.apply($, a); 
} 

Gibt es eine Möglichkeit, den zugewiesenen Erfolg Handler je nach Inhalt der geladenen Datei zu verhindern?

Antwort

3

Ich fand jQuery.ajaxPrefilter

Hexe können Sie alle Ajax-Aufrufe erfassen, bevor der ursprüngliche Erfolg Handler ausgelöst wird. Dann können Sie den Handler überschreiben und machen Test, um zu sehen, wenn Sie die Original abzufeuern wollen:

jQuery.ajaxPrefilter(function(opts) { 
    var _success = opts.success; // Copy original 
    opts.success = function(r) { // Overwrite original 

     var args = [].slice.call(arguments), // Convert arguments to a native array 
      isTrue = !(r.success === false); // Do my testing here 

     if (isTrue) { 
      _success.apply(this, args); // Fire original with the right context and arguments 
     } else { 
      // Do my alert thing in here 
     } 
    }; 
}); 

Danke für Ihre Hilfe @jfriend00

2

Wenn Sie sich für eine globale Art und Weise suchen, um zu entscheiden, ob die normalen Erfolg Handler aufrufe, dann denke ich, Sie so etwas tun könnten:

einen globalen ajaxSuccess Handler as described here einrichten. Erstellen Sie dann Ihre eigene Eigenschaft auf dem Ajax-Einstellungsobjekt mit dem Namen mySuccess: fn, und setzen Sie Ihren Erfolgshandler dort anstelle des normalen success: fn, damit jQuery es nicht automatisch für Sie aufruft. Im ajaxSuccess-Handler können Sie dann das xhr-Objekt abfragen und entscheiden, ob Sie weiterhin Ihre Erfolgsfunktion aufrufen wollen. Wenn Sie das tun, können Sie im Einstellungsobjekt nach dem mySuccess-Handler suchen und ihn aufrufen.

In einer etwas weniger komplizierten Methode könnten Sie einfach eine Dienstprogrammfunktion definieren, die Sie für den normalen Success-Handler festlegen würden. In diesem Erfolgs-Handler würden Sie den Wert der Antwort überprüfen, und wenn es das war, wonach Sie gesucht haben, können Sie die mySuccess-Funktion für das Einstellungsobjekt aufrufen.