Ich benutze dynamisches Skript, um die Dauer der anfänglichen Seitenladung zu reduzieren. Um sicherzustellen, dass die Funktionen und Objekte, die von einem Skript definiert werden, zugänglich sind, muss ich sicherstellen, dass das Skript vollständig geladen wurde.Kann script.readyState vertrauenswürdig sein, um das Ende des Ladens von dynamischen Skripten zu erkennen?
Ich habe my own Javascript library zu diesem Zweck entwickelt, und so eine ganze Menge Forschung zu diesem Thema gemacht, zu studieren, wie es in verschiedenen Bibliotheken getan wird. Während einer Diskussion zu diesem Problem, Kyle Simpson, der Autor von LABjs vorsah:
LABjs (und vielen anderen Ladern) gesetzt beide „onload“ und „onreadystatechange“ auf allen Script-Elemente, wohl wissend, dass werden einige Browser ein Feuer, und einige das andere Feuer ...
Sie können ein Beispiel dafür in the current version of jQuery as of this writing, v1.3.2 finden:
// 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);
}
};
Das ist der Stand der Technik, aber während der Analyse eines seltsamen Verhaltens in Opera 9.64 kam ich zu dem Schluss, dass der Onload-Callback mit dieser Technik zu früh gefeuert wurde.
Ich werde meine eigenen Ergebnisse in der Antwort auf diese Frage veröffentlichen, und möchte weitere Beweise und Rückmeldungen von der Gemeinschaft sammeln.
Wer findet den aktuellen Code im jQuery 1.x-master-Zweig? Es sieht so aus, als hätten sie '.readystatechange' und' .onload' nicht mehr verwendet und sie durch Versprechen ersetzt? [Clicky] (https://github.com/jquery/jquery/blob/1.x-master/src/ajax.js) – Campbeln