Ich versuche, ein Problem mit einem Code, den ich geerbt habe, herauszufinden.
Ich habe eine HTML-Seite mit
%Vor%file1.js hat
%Vor%file2.js hat
%Vor% Aufgrund des Defer-Attributs für die Elemente kann davon ausgegangen werden, dass der Code in .ready()
nicht korrekt ist, wenn% code%%%% s% referenziert%%% s% noch nicht definiert sein kann Wegen der verzögerten Ausführung noch ausgeführt?
Dies würde einem Fehler entsprechen, den ich aufspüren möchte (tritt nur sporadisch im IE auf), aber ich möchte warum das wirklich verstehen, bevor ich an einer Lösung arbeite. Ich habe keine Ahnung, warum der ursprüngliche Entwickler FOO.init()
verwendet hat, abgesehen von einem kryptischen Lob darüber, "er musste es so machen".
Defer sollte dazu führen, dass das Skript zu einer Warteschlange hinzugefügt wird, die nach dem vollständigen Laden der Seite verarbeitet wird. Entsprechend der Spezifikation sollten zurückgestellte Skripte der Warteschlange in der Reihenfolge hinzugefügt werden, in der sie auf die Seite kamen.
Allerdings haben verschiedene Browser etwas andere Dinge mit der Bestellung gemacht. IE scheint Scripte in der Reihenfolge, in der sie geladen wurden, und nicht in der Reihenfolge, in der sie auf der Seite auftraten, zu verschieben. Sie sehen den Fehler also sporadisch, weil er manchmal in der richtigen Reihenfolge geladen wird und manchmal nicht.
Siehe diesen Beitrag auf hacks.mozilla.com für eine ausführlichere Erklärung und Beispiele für die verschiedenen Browser Behandle die Reihenfolge der Zurückstellungswarteschlange.
Deffering in Javascript gibt dem Browser den Vorzug, wann er das Skript interpretieren soll, unter bestimmten optimalen Bedingungen Mit chrome wird das Skript heruntergeladen, während die Seite geladen wird, dann analysiert und interpretiert. Wenn Sie Defer wie oben verwenden, können Sie nie sicher sein, welches Skript zuerst geladen wird oder wann die Interpretation abgeschlossen ist.
BAR
könnte beim Laden einer Seite undefiniert sein und beim erneuten Laden (im Cache) definiert sein oder das zweite Skript wurde zuerst geladen.
Um dies zu testen, ändern Sie eines der Skripts, um einen neuen Download und eine neue Interpretation zu erzwingen und sehen Sie, welche Race-Bedingungen existieren.
Tags und Links javascript jquery deferred-loading