J'ajoute dynamiquement des <script>
balises à une page <head>
et j'aimerais pouvoir dire si le chargement a échoué d'une manière ou d'une autre - un 404, une erreur de script dans le script chargé, peu importe.
Dans Firefox, cela fonctionne:
var script_tag = document.createElement('script');
script_tag.setAttribute('type', 'text/javascript');
script_tag.setAttribute('src', 'http://fail.org/nonexistant.js');
script_tag.onerror = function() { alert("Loading failed!"); }
document.getElementsByTagName('head')[0].appendChild(script_tag);
Cependant, cela ne fonctionne pas dans IE ou Safari.
Quelqu'un connaît-il un moyen de faire fonctionner cela dans des navigateurs autres que Firefox?
(Je ne pense pas qu'une solution qui nécessite de placer un code spécial dans les fichiers .js soit une bonne solution. Elle est inélégante et inflexible.)
javascript
onerror
script-tag
David
la source
la source
if
+ le sondage est une crotte ennuyeuse que je ne veux pas avoir à mettre dans tous les JS.Réponses:
Il n'y a pas d'événement d'erreur pour la balise de script. Vous pouvez dire quand il réussit et supposer qu'il ne s'est pas chargé après un délai:
la source
Si vous ne vous souciez que des navigateurs html5, vous pouvez utiliser l'événement d'erreur (puisque ce n'est que pour la gestion des erreurs, il devrait être correct de ne prendre en charge cela que sur les navigateurs de nouvelle génération pour KISS IMHO).
De la spécification:
~
Cela signifie que vous n'avez pas à effectuer d'interrogation sujette aux erreurs et que vous pouvez le combiner avec l'attribut async et defer pour vous assurer que le script ne bloque pas le rendu de la page:
Plus d'informations sur http://www.w3.org/TR/html5/scripting-1.html#script
la source
<script src="nonexistent.js" onerror="alert('error!')"></script>
fiddleUncaught SyntaxError: Unexpected token '<'
(dans le dernier Chrome)<script src="nonexistent.js" onerror="alert('error!')"></script>
devrait aller dans votre fichier HTML, pas dans JS.Le script d'Erwinus fonctionne très bien, mais n'est pas très clairement codé. J'ai pris la liberté de le nettoyer et de déchiffrer ce qu'il faisait. J'ai apporté ces modifications:
prototype
.require()
utilise une variable d'argumentalert()
message n'est renvoyé par défautMerci encore à Erwinus, la fonctionnalité elle-même est parfaite.
la source
ma solution propre de travail (2017)
Comme Martin l'a souligné, utilisé comme ça:
OU
la source
loaderScript("myscript.js").then(() => { console.log("loaded"); }).catch(() => { console.log("error"); });
Je sais que c'est un vieux fil mais j'ai une bonne solution pour vous (je pense). Il est copié à partir d'une de mes classes, qui gère tous les éléments AJAX.
Lorsque le script ne peut pas être chargé, il définit un gestionnaire d'erreurs, mais lorsque le gestionnaire d'erreurs n'est pas pris en charge, il revient à un minuteur qui vérifie les erreurs pendant 15 secondes.
la source
Pour vérifier si le javascript
nonexistant.js
n'a renvoyé aucune erreur, vous devez ajouter une variable à l'intérieurhttp://fail.org/nonexistant.js
commevar isExecuted = true;
, puis vérifier si elle existe lorsque la balise de script est chargée.Cependant, si vous voulez seulement vérifier que le
nonexistant.js
renvoyé sans 404 (ce qui signifie qu'il existe), vous pouvez essayer avec uneisLoaded
variable ...Cela couvrira les deux cas.
la source
J'espère que cela ne sera pas critiqué, car dans des circonstances particulières, c'est le moyen le plus fiable de résoudre le problème. Chaque fois que le serveur vous permet d'obtenir une ressource Javascript à l'aide de CORS ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing ), vous disposez d'un large éventail d'options pour le faire.
L'utilisation de XMLHttpRequest pour récupérer des ressources fonctionnera sur tous les navigateurs modernes, y compris IE. Puisque vous cherchez à charger Javascript, vous disposez en premier lieu de Javascript. Vous pouvez suivre la progression en utilisant readyState ( http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener ). Enfin, une fois que vous avez reçu le contenu du fichier, vous pouvez l'exécuter avec eval (). Oui, j'ai dit eval - parce que sur le plan de la sécurité, cela ne diffère pas du chargement normal du script. En fait, une technique similaire est suggérée par John Resig pour avoir des balises plus agréables ( http://ejohn.org/blog/degrading-script-tags/ ).
Cette méthode vous permet également de séparer le chargement de l'évaluation et d'exécuter des fonctions avant et après l'évaluation. Cela devient très utile lors du chargement de scripts en parallèle mais en les évaluant l'un après l'autre - ce que les navigateurs peuvent faire facilement lorsque vous placez les balises en HTML, mais ne vous le laissez pas en ajoutant des scripts au moment de l'exécution avec Javascript.
CORS est également préférable à JSONP pour le chargement de scripts ( http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests ). Cependant, si vous développez vos propres widgets tiers à intégrer dans d'autres sites, vous devez en fait charger les fichiers Javascript de votre propre domaine dans votre propre iframe (encore une fois, en utilisant AJAX)
En bref:
Essayez de voir si vous pouvez charger la ressource en utilisant AJAX GET
Utilisez eval après son chargement
Pour l'améliorer:
Vérifiez les en-têtes de contrôle du cache envoyés
Recherchez autrement la mise en cache du contenu dans localStorage, si vous devez
Consultez le «JavaScript dégradant» de Resig pour un code plus propre
Découvrez require.js
la source
Cette astuce a fonctionné pour moi, même si j'avoue que ce n'est probablement pas la meilleure façon de résoudre ce problème. Au lieu d'essayer cela, vous devriez voir pourquoi les javascripts ne se chargent pas. Essayez de conserver une copie locale du script sur votre serveur, etc. ou vérifiez auprès du fournisseur tiers à partir duquel vous essayez de télécharger le script.
Quoi qu'il en soit, voici la solution de contournement: 1) Initialisez une variable sur false 2) Définissez-le sur true lorsque le javascript se charge (en utilisant l'attribut onload) 3) vérifiez si la variable est vraie ou fausse une fois le corps HTML chargé
la source
Voici une autre solution basée sur JQuery sans aucun minuteur:
Merci à: https://stackoverflow.com/a/14691735/1243926
Exemple d'utilisation (exemple original de la documentation JQuery getScript ):
la source
cache:true
pour l'appel $ .getScript (c'est désactivé par défaut). De cette façon, pour la plupart des requêtes, il utilise automatiquement la version en cache pour l'appel getScript (vous économisant de la latence)Cela peut être fait en toute sécurité en utilisant des promesses
et utiliser comme ça
la source
La raison pour laquelle cela ne fonctionne pas dans Safari est que vous utilisez la syntaxe d'attribut. Cela fonctionnera bien cependant:
... sauf dans IE.
Si vous voulez vérifier le script exécuté avec succès, définissez simplement une variable à l'aide de ce script et vérifiez qu'elle est définie dans le code externe.
la source
<script>
. Si vous essayez de l'ajouter avant, vous obtenez une erreur indiquant que la balise n'existe pas, et si vous l'ajoutez après, le script est déjà exécuté et a déclenché ses événements. Le seul moyen est de rechercher les effets secondaires causés par le script.événement onerror
* Mise à jour d'août 2017: onerror est déclenché par Chrome et Firefox. onload est déclenché par Internet Explorer. Edge ne déclenche ni une erreur ni une charge. Je n'utiliserais pas cette méthode mais cela pourrait fonctionner dans certains cas. Voir également
<link> onerror ne fonctionne pas dans IE
*
Définition et utilisation L'événement onerror est déclenché si une erreur survient lors du chargement d'un fichier externe (par exemple un document ou une image).
Conseil: Lorsqu'ils sont utilisés sur des supports audio / vidéo, les événements associés qui se produisent en cas de perturbation du processus de chargement des supports sont les suivants:
En HTML:
element onerror = "myScript">
En JavaScript , en utilisant la méthode addEventListener ():
object.addEventListener ("erreur", myScript);
Remarque: la méthode addEventListener () n'est pas prise en charge dans Internet Explorer 8 et les versions antérieures.
Exemple Exécutez un JavaScript si une erreur se produit lors du chargement d'une image:
img src = "image.gif" onerror = "maFonction ()">
la source
Il a été proposé de définir un délai d'expiration, puis de supposer une défaillance de charge après un délai d'expiration.
Le problème avec cette approche est que l'hypothèse est fondée sur le hasard. Après l'expiration de votre délai, la demande est toujours en attente. La demande du script en attente peut se charger, même après que le programmeur a supposé que le chargement ne se produirait pas.
Si la demande pouvait être annulée, le programme pourrait attendre un certain temps, puis annuler la demande.
la source
Voici comment j'ai utilisé une promesse pour détecter les erreurs de chargement qui sont émises sur l'objet window:
la source
Eh bien, la seule façon dont je peux penser à faire tout ce que vous voulez est assez moche. Exécutez d'abord un appel AJAX pour récupérer le contenu du fichier Javascript. Lorsque cela est terminé, vous pouvez vérifier le code d'état pour décider si cela a réussi ou non. Ensuite, prenez le responseText de l'objet xhr et enveloppez-le dans un try / catch, créez dynamiquement une balise de script, et pour IE, vous pouvez définir la propriété text de la balise de script sur le texte JS, dans tous les autres navigateurs, vous devriez pouvoir ajoutez un nœud de texte avec le contenu à la balise script. S'il y a un code qui s'attend à ce qu'une balise de script contienne réellement l'emplacement src du fichier, cela ne fonctionnera pas, mais cela devrait convenir dans la plupart des situations.
la source