Pour ajouter une gestion des erreurs de base, je voulais réécrire un morceau de code qui utilisait $ .getJSON de jQuery pour extraire des photos de Flickr. La raison de cela est que $ .getJSON ne fournit pas de gestion des erreurs ni ne fonctionne avec les délais d'expiration.
Puisque $ .getJSON n'est qu'un wrapper autour de $ .ajax, j'ai décidé de réécrire la chose et de surprendre la surprise, cela fonctionne parfaitement.
Maintenant, le plaisir commence cependant. Lorsque je provoque délibérément un 404 (en modifiant l'URL) ou que le réseau expire (en n'étant pas connecté aux interwebs), l'événement d'erreur ne se déclenche pas du tout. Je ne sais pas ce que je fais de mal. L'aide est très appréciée.
Voici le 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);
}
});
});
Je voudrais ajouter que cette question a été posée lorsque jQuery était à la version 1.4.2
<script>
balises Javascript insérées dynamiquement. La seule chose que vous pouvez donc savoir, c'est qu'une requête a échoué, pas quel était le code d'état. Si vous souhaitez obtenir des codes d'état, vous devez utiliser des requêtes Ajax traditionnelles ou d'autres techniques inter-domaines.Il s'agit d'une limitation connue de l'implémentation native de jsonp dans jQuery. Le texte ci-dessous provient d' IBM DeveloperWorks
Cependant, il existe un plug-in jsonp disponible sur GoogleCode qui prend en charge la gestion des erreurs. Pour commencer, apportez simplement les modifications suivantes à votre code.
Vous pouvez soit le télécharger, soit simplement ajouter une référence de script au plug-in.
Modifiez ensuite votre appel ajax comme indiqué ci-dessous:
la source
Une solution si vous êtes coincé avec jQuery 1.4:
la source
.abort()
un jqXHR en attente après un délai d'expiration pourrait être un meilleur moyen.Cela peut être une limitation "connue" de jQuery; cependant, il ne semble pas bien documenté. J'ai passé environ 4 heures aujourd'hui à essayer de comprendre pourquoi mon délai d'attente ne fonctionnait pas.
Je suis passé à jquery.jsonp et cela a fonctionné comme un charme. Je vous remercie.
la source
Semble être résolu à partir de jQuery 1.5. J'ai essayé le code ci-dessus et je reçois le rappel.
Je dis "semble être" parce que la documentation du rappel d'erreur pour jQuery.ajax () contient toujours la note suivante:
la source
Le plugin jquery-jsonp jQuery mentionné dans la réponse de Jose Basilio peut maintenant être trouvé sur GitHub .
Malheureusement, la documentation est quelque peu spartiate, j'ai donc fourni un exemple simple:
Important Incluez le paramètre callbackParameter dans l'appel $ .jsonp () sinon j'ai constaté que la fonction de rappel n'est jamais injectée dans la chaîne de requête de l'appel de service (en cours à partir de la version 2.4.0 de jquery-jsonp).
Je sais que cette question est ancienne, mais le problème de la gestion des erreurs à l'aide de JSONP n'est toujours pas «résolu». Espérons que cette mise à jour aidera les autres car cette question est la première de Google pour la "gestion des erreurs jquery jsonp".
la source
Qu'en est-il d'écouter l'événement onerror du script? J'ai eu ce problème et je l'ai résolu en corrigeant la méthode de jquery où la balise script a été créée. Voici le morceau de code intéressant:
Que pensez-vous de cette solution? Est-il susceptible de causer des problèmes de compatibilité?
la source