Um einige grundlegende Fehlerbehandlungen hinzuzufügen, wollte ich einen Code neu schreiben, der jQuerys $ .getJSON verwendete, um einige Fotos von Flickr abzurufen. Der Grund dafür ist, dass $ .getJSON keine Fehlerbehandlung bietet oder nicht mit Zeitüberschreitungen arbeitet.
Da $ .getJSON nur ein Wrapper um $ .ajax ist, habe ich beschlossen, das Ding neu zu schreiben und Überraschung zu überraschen, es funktioniert einwandfrei.
Jetzt fängt der Spaß aber an. Wenn ich absichtlich einen 404 verursache (indem ich die URL ändere) oder das Netzwerk eine Zeitüberschreitung verursacht (indem ich nicht mit den Interwebs verbunden bin), wird das Fehlerereignis überhaupt nicht ausgelöst. Ich weiß nicht, was ich falsch mache. Hilfe wird sehr geschätzt.
Hier ist der Code:
$(document).ready(function(){
// var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404
$.ajax({
url: jsonFeed,
data: { "lang" : "en-us",
"format" : "json",
"tags" : "sunset"
},
dataType: "jsonp",
jsonp: "jsoncallback",
timeout: 5000,
success: function(data, status){
$.each(data.items, function(i,item){
$("<img>").attr("src", (item.media.m).replace("_m.","_s."))
.attr("alt", item.title)
.appendTo("ul#flickr")
.wrap("<li><a href=\"" + item.link + "\"></a></li>");
if (i == 9) return false;
});
},
error: function(XHR, textStatus, errorThrown){
alert("ERREUR: " + textStatus);
alert("ERREUR: " + errorThrown);
}
});
});
Ich möchte hinzufügen, dass diese Frage gestellt wurde, als jQuery auf Version 1.4.2 war
<script>
Tags, die dynamisch eingefügt werden. Das einzige, was Sie daher wissen können, ist, dass eine Anforderung fehlgeschlagen ist und nicht der Statuscode. Wenn Sie Statuscodes erhalten möchten, müssen Sie herkömmliche Ajax-Anforderungen oder andere domänenübergreifende Techniken verwenden.Dies ist eine bekannte Einschränkung bei der nativen jsonp-Implementierung in jQuery. Der folgende Text stammt von IBM DeveloperWorks
Allerdings gibt es eine JSONP Plug-in auf Googlecode, die Unterstützung für die Fehlerbehandlung zur Verfügung stellt. Nehmen Sie zunächst die folgenden Änderungen an Ihrem Code vor.
Sie können es entweder herunterladen oder einfach eine Skriptreferenz zum Plug-In hinzufügen.
Ändern Sie dann Ihren Ajax-Aufruf wie folgt:
quelle
Eine Lösung, wenn Sie mit jQuery 1.4 nicht weiterkommen:
quelle
.abort()
eines ausstehenden jqXHR nach einer Zeitüberschreitung ist möglicherweise besser.Dies kann eine "bekannte" Einschränkung von jQuery sein. es scheint jedoch nicht gut dokumentiert zu sein. Ich habe heute ungefähr 4 Stunden damit verbracht zu verstehen, warum meine Auszeit nicht funktioniert hat.
Ich wechselte zu jquery.jsonp und es funktionierte wie ein Zauber. Danke dir.
quelle
Scheint ab jQuery 1.5 gelöst zu sein. Ich habe den obigen Code ausprobiert und erhalte den Rückruf.
Ich sage "scheint zu sein", weil die Dokumentation des Fehlerrückrufs für jQuery.ajax () immer noch den folgenden Hinweis enthält:
quelle
Das in Jose Basilios Antwort erwähnte jQuery-Plugin jquery-jsonp ist jetzt auf GitHub zu finden .
Leider ist die Dokumentation etwas spartanisch, daher habe ich ein einfaches Beispiel gegeben:
Wichtig Fügen Sie den callbackParameter in den Aufruf $ .jsonp () ein. Andernfalls wurde festgestellt, dass die Rückruffunktion niemals in die Abfragezeichenfolge des Serviceaufrufs eingefügt wird (aktuell ab Version 2.4.0 von jquery-jsonp).
Ich weiß, dass diese Frage alt ist, aber das Problem der Fehlerbehandlung mit JSONP ist immer noch nicht gelöst. Hoffentlich hilft dieses Update anderen, da diese Frage bei Google für "jquery jsonp error handle" an erster Stelle steht.
quelle
Was ist mit dem Abhören des Fehlerereignisses des Skripts? Ich hatte dieses Problem und löste es durch Patchen der Methode von jquery, in der das Skript-Tag erstellt wurde. Hier ist der interessante Code:
Was halten Sie von dieser Lösung? Ist es wahrscheinlich, dass es Kompatibilitätsprobleme verursacht?
quelle