2012-04-12 6 views
8

Ich versuche, ein Problem mit etwas Code herauszufinden, den ich geerbt habe.Interaktion zwischen jQuery .ready() und <script defer>

Ich habe eine HTML-Seite mit

<script type="text/javascript" src="file1.js" defer="defer"></script> 
<script type="text/javascript" src="file2.js" defer="defer"></script> 
</body> 
</html> 

file1.js hat

FOO = { 
    init : function() { 
    var bar = BAR; 
    } 
} 

$(document).ready(FOO.init); 

file2.js hat

var BAR = { 
} 

Wegen der Zurückstellungs Attribut auf den Elementen, ist es sicher anzunehmen, dass, wenn die .ready()FOO.init() ruft, dass BAR kann zu diesem Zeitpunkt noch undefiniert b/c der Code in file2.js wurde wegen der verzögerten Ausführung noch nicht ausgeführt?

Dieser Fehler passen würde ich auf der Spur versuchen (nur sporadisch in IE auftritt), aber ich mag wirklich warum dies geschieht verstehen, bevor ich an einer Lösung arbeiten. Ich habe keine Ahnung, warum der ursprüngliche Entwickler defer verwendet hat, abgesehen von einem kryptischen Kommentar über "Er musste es" so machen.

+0

Ich habe keine Antwort, aber ich fühle für dich, Mann. –

+0

Verstehst du das "Defer" -Attribut? Weil es mir scheint, ist es eine sehr häufige Sache zu tun ... –

+0

Ich denke, der ursprüngliche Entwickler wollte ein anderes Skript vor Datei1.js und Datei2.js geladen werden (oder er wusste nicht über $ (Dokument) .ready () ...) – jbl

Antwort

2

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 Reihenfolge getan. 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.

Eine ausführlichere Erklärung und Beispiele dafür, wie verschiedene Browser die Reihenfolge der Zurückstellungswarteschlange behandeln, finden Sie unter this post auf hacks.mozilla.com.

0

Deffering in Javascript gibt dem Browser vor, wann das Skript zu interpretieren ist, in einigen optimalen Bedingungen wie mit Chrom wird das Skript heruntergeladen, während die Seite geladen wird, dann geparst 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 auf einer Seite laden undefiniert werden und beim Neuladen (im Cache) definiert werden oder das zweite Skript wurde zuerst geladen.

Um dies zu testen, nehmen Sie eine Änderung an einem der Skripte vor, um einen neuen Download und eine neue Interpretation zu erzwingen und zu sehen, welche Race-Bedingungen existieren.

Verwandte Themen