Comment vérifier les erreurs 403 et 404 lors de la modification de l'URL d'une ressource?

Je fais un script utilisateur pour l'extension TamperMonkey Chrome (c'est la même chose que de créer un script utilisateur pour GreaseMonkey).

Dans mon script, je fais itérer sur certaines ressources externes de document (img, css, liens, scripts) via document.getElementsByTagName() et je modifie leurs attributs src ou href vers une autre URL.

Pour la plupart des cas, la nouvelle URL se charge correctement, mais dans certains cas, elle se termine par une erreur 404 ou 403 de mon proxy.

Pourriez-vous me donner des indications sur la façon de gérer (si possible) correctement la "ressource ne peut pas être chargée avec la nouvelle URL"? En outre, dans le cas où la ressource demandée aboutit à une URL redirigée, est-ce possible de me dire que la ressource a été redirigée (comment vérifier le 302)?

J'utilise javascript nu pour l'instant, sans jquery. Mais si jQuery peut m'aider, je suis prêt à l'adopter.

J'ai envisagé de tester les en-têtes du résultat XMLHttpRequest pour chaque URL de la ressource, mais il me semble que l'utilisation d'un pistolet d'artillerie pour tuer une mouche. Je préfère utiliser un gestionnaire approprié qui pourrait être déclenché juste en cas de ressource indisponible.

Edit : alternativement, je serais bien si chrome aurait une sorte de propriété de statut pour chaque objet chargé que je pourrais vérifier …

Je vérifierais document.styleSheets en javascript.

Voici un jsfiddle de travail pour les stylesheets:

http://jsfiddle.net/BQxBz/4/

 var styleSheetExists = function(name) { for (var i in document.styleSheets) { if (typeof document.styleSheets[i] == "object") { link = document.styleSheets[i].href; if (link === null) { continue; } if (link.indexOf(name, link.length - name.length) !== -1) { return true; } } } return false; } $(document).ready(function() { console.log(styleSheetExists('jquery-ui.css')); console.log(styleSheetExists('doesnotexist.css')); }); 

Pour javascript, j'utiliserais la détection d'objet: voir si un certain objet doit être chargé par un certain script. Par exemple pour détecter jQuery:

http://jsfiddle.net/TqQtE/

 if (typeof jQuery == "undefined") { // load jquery var fileref=document.createElement('script') fileref.setAttribute("type","text/javascript") fileref.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js") document.getElementsByTagName("head")[0].appendChild(fileref) } 

C'est juste une idée, je ne suis pas sûr de la viabilité, mais ça pourrait valoir la peine d'essayer. Explication dans le code:

 var errorHandler = function(event) { // Do something if the script could not be loaded }; var scripts = document.getElementsByTagName("script"); for(var i = 0, len = scripts.length; i < len; i++) { scripts[i].onerror = errorHandler; scripts[i].src = /* Some way to get your new src */; } 

Je ne suis pas certain que les gestionnaires de onerror , onerror fonctionnent lorsque vous modifiez la src d'une étiquette de script existante.

Veuillez signaler vos résultats. 😉

J'ai envisagé de tester les en-têtes du résultat XMLHttpRequest pour chaque URL de la ressource, mais il me semble que l'utilisation d'un pistolet d'artillerie pour tuer une mouche.

Eh bien … c'est ce que j'ai fait, mais nos scripts ont des buts différents.

  function conectar(metodo, endereco, resposta, corpo) { callback = function(xhr) { resposta(xhr) }; GM_xmlhttpRequest({ "method" : metodo, "url" : endereco, "onerror" : callback, "onload" : callback, "headers" : {'Content-Type' : 'application/x-www-form-urlencoded'}, "data" : corpo }); } 

et alors

 conectar('HEAD', linkkhref, resp) 

Vérifiez le mien ici: RandomProxyHeader