J'utilise le chargement de script dynamique pour réduire la durée du chargement initial de la page. Pour m'assurer que les fonctions et les objets définis par un script sont accessibles, je dois m'assurer que le script a été entièrement chargé.Peut-on faire confiance à script.readyState pour détecter la fin du chargement de script dynamique?
J'ai développé my own Javascript library à cette fin, et donc fait beaucoup de recherches sur le sujet, en étudiant comment cela se fait dans différentes bibliothèques. Au cours d'une discussion concernant cette question, Kyle Simpson, l'auteur de LABjs, a déclaré que:
LABjs (et beaucoup d'autres chargeurs) mis à la fois "onload" et "onreadystatechange" sur tous les éléments de script, sachant que certains navigateurs un feu, et certains vont tirer l'autre ...
Vous pouvez trouver un exemple dans the current version of jQuery as of this writing, v1.3.2:
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if (!done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete")) {
done = true;
success();
complete();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild(script);
}
};
C'est l'état de l'art, mais lors de l'analyse d'un comportement étrange dans Opera 9.64, j'en suis arrivé à la conclusion que, grâce à cette technique, le rappel onload s'est déclenché trop tôt.
Je vais poster mes propres résultats en réponse à cette question, et je voudrais recueillir des preuves supplémentaires et des commentaires de la communauté.
Quelqu'un trouve-t-il le code actuel dans la branche jQuery 1.x-master? On dirait qu'ils ont quitté en utilisant '.onreadystatechange' et' .onload' et les ont remplacés par des promesses? [Clicky] (https://github.com/jquery/jquery/blob/1.x-master/src/ajax.js) – Campbeln