Ich habe einige Nebenläufigkeitsprobleme mit einer Webseite, die ich baue. Grundsätzlich habe ich drei Skript-Dateien, die ich verwende einige Daten zu halten:Wie kann ich die Ausführungsreihenfolge von Javascript steuern?
script1.js:
var myValue = 1;
script2.js:
var myValue = 2;
Script3. js:
var myValue = 3;
Und ich habe eine Seite, mypage.html, die im Grunde wie folgt aussieht:
<html>
<script>
function get_number()
{
var script_file = GetQueryStringValue("run");
e = document.createElement('script');
e.type='text/javascript';
e.src = script_file + ".js"
head.appendChild(e);
document.write(myValue);
}
</script>
<body onload="get_number()">
<div onclick="get_number()">Click me!</div>
</body>
</html>
Der Leitgedanke dieser Seite ist, dass Sie es wie folgt abfragen würde: mypage.html?run=script1
welche die get_number()
Funktion sagen würde um dynamisch script1.js
in mypage.htm einzufügen. Dann rufe ich get_number()
an, um den aus dem Skript geladenen Wert anzuzeigen.
Nun, ich habe das oben auf das, was ich denke, sind die relevanten Teile reduziert und ich habe eine Menge Zeug offensichtlich weggelassen. Mein tatsächlicher Code lädt eine große Auswahl an Werten und ist interessanter ... Aber ich hoffe, dass mir jemand dabei helfen kann.
Was ich finde ist, dass in IE die Nummer korrekt angezeigt wird.
In Firefox, Chrome und Safari, bekomme ich eine Fehlermeldung, dass myValue
nicht definiert ist. Wenn ich jedoch auf das von mir erstellte div. Click me
klicke, wird die Nummer korrekt angezeigt. Ich weiß, dass ich die externe Javascript-Datei korrekt lade. Aber es ist einfach nicht rechtzeitig geladen, damit meine get_number()
Funktion richtig funktioniert onload
.
Nun gehackt ich meine Datei ein wenig nach oben, so dass die get_number
Funktion wie folgt aussieht:
function get_number()
{
var script_file = GetQueryStringValue("run");
e = document.createElement('script');
e.type='text/javascript';
e.src = script_file + ".js"
head.appendChild(e);
setTimeout(function() { document.write(myValue), 10 });
}
Die setTimeout Verzögerungen genug für den DOM aktualisiert werden und die Javascript in den meisten Fällen geladen werden. Aber das ist ein totaler Hack. Firefox tendiert dazu, diesen "verbesserten" Code ständig korrekt zu laden, während Chrome und Safari den Wert in etwa 50% der Zeit erreichen.
Also, ich denke, ich frage mich, gibt es einen besseren Weg, um das zu erreichen, was ich hier versuche? Es ist sehr wichtig, dass der Wert extern (durch die Abfragezeichenfolge) gesteuert wird, aber abgesehen von dieser Anforderung bin ich sehr flexibel.
http://www.infoq.com/articles/stratifiedjs – n611x007