script onload/onerror avec IE(pour le chargement différé) des problèmes
Je suis à la reconstruction de mon paresseux chargeur de module d'accepter asyncronus demande, mais j'ai un GROS problème:
internet explorer ne prennent pas en charge le script.onload/onerror!!!
L'ancien script dans le monde entier eval de la cible à la source du script lire avec un ajax sync appel,
il fonctionne très bien,c'est la croix-navigateur et que je peux le faire async l'édition 1 de la variable, mais il est très difficile à déboguer(TOUT le code source est exécutée en une seule ligne et le navigateur donne pas beaucoup d'infos sur les erreurs,de diviser le code en ligne avec une regexp est IMPOSSIBLE parce que js ont des blocs avec une infinie profondeur et la regexp ne sont tout simplement pas bon à cela).
C'est le code que j'utilise pour créer le script(un classique):
var script = document.createElement('script');
script.type = 'text/javascript';
script.src =name;
script.name =name;
script.async = true;
script.onload=<my_onload_code>;
script.onerror=<my_onerror_code>;
il ne fonctionne pas sur IE, car il doesen " soutien onload et onerror avec le script;
le code ci-dessous est une solution, mais ne fonctionne que si le script n'est pas asynchrone
if(script.onreadystatechange!==undefined)//only IE T_T
script.onreadystatechange = function() {
if (script.readyState == 'loaded')//ERROR LOADING
<my_onerror_code>;
else
if(script.readyState == 'complete')//loaded
<my_onload_code>;
};
je peux le tester toutes les X millisecondes jusqu'à ce que le script est chargé, mais c'est un vilain solution et je veux l'éviter.
EDIT: c'est le code que j'ai essayé de vérifier toutes les X ms si le script est chargé, il n'est pas mauvais et il fonctionne mieux que l'ajax, le problème est que je ne peux pas savoir si le script est chargé avec succès ou avec l'erreur(onload ou onerror).
var script = document.createElement('script');
script.type = 'text/javascript';
script.src =name;
script.name =name;
script.async = true;
script.onload=function(){Lazy_loader.onload(this);};
script.onerror=function(){Lazy_loader.onerror(this);};
if(script.onreadystatechange!==undefined){//ie fix T_T
script.timer=setInterval(function(){
if (script.readyState == 'loaded' || script.readyState == 'complete')}//ERROR LOADING
if(LOADED???)//loaded
Lazy_loader.onload(script);
else
Lazy_loader.onerror(script);
clearInterval(script.timer);
}
},100);
}
document.getElementsByTagName('head')[0].appendChild(script);
j'ai essayé d'utiliser la méthode addEventListener/attachEvent de fonctions, mais il n'a pas l'air de fonctionner(même en utilisant addEvent fonctions à partir du web)
résumant les options semble être:
- Utiliser AJAX et mondial eval pour charger le script de débogage de l'enfer)
- Utiliser AJAX et mondial eval seulement avec IE(peut être une solution,je n'utilise pas IE)
- Utiliser AJAX et mondial eval seulement si le script contient des erreurs(j'ai besoin de vérifier les timings de problèmes car avec mon code, je l'ai "simuler" synchrone code, même si l'appel asynchrone)
- Script de Test.onreadystatechange (uniquement sur IE) tous les X temps, jusqu'à ce qu'elle est chargé(LAID!!!)
- Utilisation de la fenêtre.onload : à ÉVITER,il faut charger TOUTE la page,j'ai besoin de l'appeler quand un SEUL script est lancé(voir les détails sur endpage)
- Ajouter un code sur la source de chaque script (ÉVITER comme dit sur endpage)
- corriger le script.onload pour IE(à l'aide de la méthode addEventListener/attachEvent?!?)
ATTENTION:
je ne veux pas utiliser la fenêtre.onload car il est déclenché que lorsque la page est chargée,j'ai besoin de feu quand seulement la cible de script est chargé(mon chargement paresseux script est beaucoup plus complexe, de sorte s'il vous plaît ne me demandez pas pourquoi);
je NE VEUX PAS utiliser un tiers de la bibliothèque(comme jquery,prototype,etc.),
je ne veux pas même à modifier la cible à la source du script(comme lors de l'utilisation de JSPON ou l'ajout d'un script d'alerte que le script est chargé).
Espère que c'est pas trop!!!
Merci.
l'essayer,ça ne marchera pas. c'est comme essayer de modifier le contenu d'un <script> tag: pour des raisons de sécurité, il est désactivé.
Voir aussi script.readyState être digne de confiance pour détecter la fin de script dynamique de chargement?
OriginalL'auteur Plokko | 2010-08-14
Vous devez vous connecter pour publier un commentaire.
C'est une solution:
si c'est IE, je vais simplement charger le texte avec un async appel ajax et ensuite définir le script.texte pour les données chargées.
IE semble verrouillage onload et onerror(pour des raisons de sécurité?)et pas de script.texte(certains autres navigateurs peuvent ne pas l'autoriser pour la sécurité resons pour empêcher les attaques XSS comme sur les iframes),je ne sais pas pourquoi microsoft ne peut pas tout simplement le respect des normes,simplement je déteste ie et "trucs" pour corriger theyr du desing problèmes.
cela fonctionne bien sur la plupart des navigateurs(IE/chrome/firfox testé pour l'instant)et j'ai testé le chargement de 3 fichiers:
et ils sont chargés dans un total de 40XX ms dans tous les navigateurs(un peu plus de temps est pris par le navigateur pour afficher le onload/onerror script),je peux aussi(avec mon lazy loader script)simuler une synchronisation de chargement à l'exécution de code seulement après que tous les fichiers dans la file d'attente sont chargés.
Si vous connaissez un meilleur moyen, ou si vous connaissez des erreurs qui peuvent se produire dans cette mise en œuvre, veuillez répondre!
Merci!
OriginalL'auteur Plokko
Je dois dire que, indépendamment de savoir si
async
est définie ou non, à l'aide dereadyState = 'loaded'
pour vérifier l'erreur n'est pas assez. En fait,loaded
sera déclenchée dans les situations erreur de chargement de script ou le premier temps de chargement de script correct.Vous pouvez ajouter
src
aléatoire de la chaîne de requête pour désactiver le cache, puis vérifier lereadyState
.OriginalL'auteur nozer0
ignorer la jonque ci-dessous. le nextSibling chose a une raison d'être dans le débogueur et n'était pas vraiment reproductible dans le monde réel. au lieu de cela, je dois vous recommandons de vérifier http://www.requirejs.org
il fournit une méthode qui est aussi proche d'une inclusion ou de l'instruction d'importation que vous pourriez trouver en js.
c'est totalement un bouffon de la solution, et je vais suivre ce fil de commentaires sur pourquoi cela fonctionne, mais voilà comment j'ai résolu ce sans minuterie.
comme je l'ai dit je ne sais pas POURQUOI nextSibling est nul sur un 404 avais essayer, mais si le js url est correcte, nextSibling avait une valeur.
Je suis prêt à parier que nextSibling est nulle, car le 404 avec élément de script est la dernière chose annexé à la tête de votre test.
OriginalL'auteur prodaea
Essayez celui-ci: https://stackoverflow.com/a/18840568/2785975. Ici, le problème pour IE7-8 à l'événement onerror est décrit et la décision est affiché.
OriginalL'auteur Yuri Izgarshev