2008-08-20 5 views
28

Ich arbeite mit amq.js (ActiveMQ) und Google Maps. Ich lade meine Skripte in dieser ReihenfolgeJavaScript Load Order

<head> 
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    <title>AMQ & Maps Demo</title> 

    <!-- Stylesheet --> 
    <link rel="stylesheet" type="text/css" href="style.css"></link> 

    <!-- Google APIs --> 
    <script type="text/javascript" src="http://www.google.com/jsapi?key=abcdefg"></script> 

    <!-- Active MQ --> 
    <script type="text/javascript" src="amq/amq.js"></script> 
    <script type="text/javascript">amq.uri='amq';</script> 

    <!-- Application --> 
    <script type="text/javascript" src="application.js"></script> 
</head> 

jedoch in meinem application.js lädt es Karten in Ordnung, aber ich erhalte eine Fehlermeldung, wenn zu einem Thema mit AMQ abonnieren möchte. AMQ hängt vom Prototyp ab, dessen Fehlerkonsole in Firefox sagt, dass das Objekt nicht definiert ist. Ich denke, ich habe ein Problem mit dem Amq-Objekt, bevor das Skript geladen ist. Gibt es eine Möglichkeit, sicherzustellen, dass beide Skripts geladen werden, bevor ich sie in meiner application.js verwende?

Google hat diesen netten Funktionsanruf google.setOnLoadCallback(initialize);, der großartig funktioniert. Ich bin mir nicht sicher, ob amq.js so etwas hat.

Antwort

27

Gibt es eine Möglichkeit, sicherzustellen, dass beide Skripts geladen werden, bevor ich sie in meiner application.js verwende?

JavaScript-Dateien sollten sequentiell und blockieren laden, so es sei denn, die Skripte, auf dem Sie je tun etwas Ungewöhnliches alles, was Sie benötigen, sollten Last zu tun ist, application.js nach den anderen Dateien.

Non-blocking JavaScript Downloads enthält einige Informationen darüber, wie Skripts geladen werden (und behandelt einige Techniken, um die Blockierung zu unterlaufen).

+0

Es lohnt sich auch, die API [Asynchronous Module Definition] (http://en.wikipedia.org/wiki/Asynchronous_module_definition) und andere zu betrachten, die dasselbe tun, um JavaScript-Dateien und andere Ressourcen parallel zu laden. – Vimes

3

Gibt es eine Möglichkeit, sicherzustellen, dass beide Skripts geladen werden, bevor ich sie verwende?

Ja.

Geben Sie den zuletzt geladenen Code (application.js) in den Prototyp document.observe ein. Dies sollte sicherstellen, dass der Code nur geladen wird, nachdem der Prototyp + andere Sachen fertig und fertig sind. (Wenn Sie mit jQuery vertraut sind, ist diese Funktion ähnlich wie jQuery $(document).ready)

10

in jquery Sie verwenden können:

$(document).ready(function(){/*do stuff here*/}); 

, die das Javascript sicher macht geladen ist und der dom ist bereit, bevor Sie Ihre Sachen zu tun.

in Prototyp sieht es so

document.observe("dom:loaded", function() {/*do stuff here*/}); 

funktionieren könnte, wenn ich richtig Ihr Problem verstehen .. denke ich, dass ..

kann helfen, wenn Sie nicht auf einer lib verlassen wollen tun dies ... ich denke, das funktionieren könnte:

<script> 
    function doIt() {/*do stuff here*/} 
</script> 
<body onLoad="doIt();"></body> 
+0

Stellt es sicher, dass Javascript geladen ist und das dom, oder nur das dom? – Gattster

+0

dom und javascript – danb

2

AMQ auf Prototyp abhängt, die die Fehlerkonsole in FireFox sagt Objekt ist nicht defi ned.

Meinst du, dass AMQ von der Prototype library abhängt? Ich kann keinen Import für diese Bibliothek in dem von Ihnen bereitgestellten Code sehen.

2

Meinst du, dass AMQ von der Prototypbibliothek abhängt? Ich kann keinen Import für diese Bibliothek im Code sehen, den Sie bereitgestellt haben.

Ja für ActiveMQs Javascript (amq.js) hängt von Prototype ab. In der amq.js lädt es 3 Skripte, _amq.js, behaviour.js und prototype.js.

Vielen Dank für Ihre Hilfe auf der JavaScript load order wrumsby. Dies sagt mir, dass mein Fehler in einem anderen Schloss ist :(

Ich denke, ich habe ein anderes Problem. Ich überprüfte auch die Js-Dateien von ActiveMQ 5.0 bis 5.1 und bemerkte, dass sie genauso waren. Etwas hat sich in 5.0 geändert 5.1, die eine Aktualisierung für die Themen benötigt, um zu abonnieren. Ich werde weiter suchen, aber danke für die Beseitigung dieser möglichen Ursache.

7

Ich hatte ein ähnliches Problem, nur mit einem einzigen Skript.Die Lösung, die ich kam, war addEventListener("load",fn,false) zu einem script Objekt zu verwenden, erstellt mit document.createElement('script') Hier ist die letzte Funktion, die alle Standard-JS-Datei lädt und können Sie eine „post load“ Skript hinzufügen.

function addJavaScript(js, onload) { 
    var head, ref; 
    head = document.getElementsByTagName('head')[0]; 
    if (!head) { return; } 
    script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = js; 
    script.addEventListener("load", onload, false); 
    head.appendChild(script); 
} 

Ich hoffe, dass dies jemand in der Zukunft helfen kann.

+0

Danke, das ist hilfreich. –

43

Cross-Domain-Skripte werden nach Skripten der Website selbst geladen, deshalb erhalten Sie Fehler. Interessanterweise weiß das niemand hier.

+2

Vielen Dank für diesen Kommentar. Nach dem Verschieben meiner Skripte in die gleiche Domäne, keine Probleme mehr. – BradH

+2

Gibt es hier einen Fehler (http://stackoverflow.com/questions/1307929/javascript-dom-load-events-execution-sequence-and-document-ready) bei der "deutlich besseren Antwort": "Javascript ist garantiert Führen Sie die Reihenfolge in der Reihenfolge aus, in der sie in Ihrem HTML-Code enthalten ist. Stellen Sie daher sicher, dass Ihre Funktion definiert ist, bevor Sie versuchen, sie an ein Ereignis anzuhängen. "? –

+14

Dies scheint nicht möglich zu sein, da es ziemlich üblich ist, z. B. jQuery aus dem Google CDN zu laden und dann eigene lokale Skripte zu haben, die jQuery benötigen. – spinn

0

Sie können auch die integrierte SharePoint-JavaScript-Methode verwenden, um die Ausführung Ihrer Skripts zu steuern.

_spBodyOnLoadFunctionNames.push("yourFunction");