2008-08-20 7 views
28

私はamq.js(ActiveMQ)とGoogle Mapsの両方で作業しています。私はJavaScriptロードオーダー

<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> 

は、しかし、私application.jsで、それはマップの罰金をロードしますが、AMQでトピックをサブスクライブしようとしたとき、私はエラーを取得し、このために、私のスクリプトをロードします。 AMQは、Firefoxのエラーコンソールにオブジェクトが定義されていないというプロトタイプに依存します。私は、スクリプトのロードが完了する前にamqオブジェクトの使用に問題があると思う。 application.jsで使用する前に両方のスクリプトが読み込まれていることを確認する方法はありますか?

グーグルはこの素晴らしい機能呼び出しgoogle.setOnLoadCallback(initialize);を持っています。 amq.jsにこのようなものがあるかどうかはわかりません。

答えて

27

application.jsで使用する前に両方のスクリプトが読み込まれていることを確認する方法はありますか?

JavaScriptファイルは、あなたがする必要がある必要があり、すべての他のファイルの後に負荷application.jsで順次をロードして、あなたが依存しているスクリプトは珍しい何かをやっている場合を除きのでをブロックする必要があります。

Non-blocking JavaScript Downloadsには、スクリプトがどのように読み込まれるかについての情報があります(また、ブロックを覆すためのいくつかの方法についても説明しています)。

+0

[Asynchronous Module Definition](http://en.wikipedia.org/wiki/Asynchronous_module_definition)APIなど、JavaScriptファイルや他のリソースを並行して読み込むための同じことを行うことも価値があります。 – Vimes

3

使用する前に両方のスクリプトが読み込まれていることを確認する方法はありますか?

はい。

最後にロードするコード(application.jsのもの)をプロトタイプdocument.observeに入れてください。これにより、プロトタイプ+他のものが完成して準備が整った後にのみコードがロードされるようにする必要があります。ジャバスクリプトがロードされているを確認します

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

とDOMは自分のものをやって前に準備ができている:あなたが使用することができますjqueryの中

10

(あなたはjQueryのに精通している場合、この関数はjQueryの$(document).readyに似ています)。私が正しくあなたの問題を理解していれば、これは

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

を働くかもしれないよう

はプロトタイプで、それが見えます..私はあなたがへのlibに依存したくない場合はそれが..

を助けるかもしれないと思いますこれを行う...私は、これはうまくいくかもしれないと思う:

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

javascriptがロードされていることを確認しますか? – Gattster

+0

domとjavascript – danb

2

AMQは、Firefoxのエラーコンソールが言うプロトタイプに依存オブジェクトがDEFIではありませんned。

AMQはPrototype libraryに依存していますか?あなたが提供したコードでそのライブラリのインポートを見ることができません。

2

AMQは プロトタイプライブラリに依存していますか?あなたが提供したコード にそのライブラリの のインポートが見つかりません。

はい、ActiveMQのjavascript(amq.js)はPrototypeに依存します。 amq.jsには3つのスクリプト、_amq.js、behaviour.js、およびprototype.jsが読み込まれます。

JavaScriptの読み込み順wrumsbyに関するお手伝いをしていただきありがとうございます。これは私のバグが別の城にあることを教えてくれる:(

私は別の問題を抱えていると思う。私はまた、ActiveMQ 5.0から5.1へのjsファイルをチェックし、同様に気づいた。 5.1では、トピックを購読するためのリフレッシュが必要ですが、この問題の原因を取り除いていただきありがとうございます。

7

私はこれと同様の問題が1つのスクリプトでしか発生しませんでした。 document.createElement('script')を使用して作成したscriptオブジェクトにaddEventListener("load",fn,false)を使用するこれは、標準のJSファイルを読み込み、「ポストロード」スクリプトを追加できる最後の機能です。

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); 
} 

これは将来的に誰かを助けてくれることを願っています。

+0

ありがとう、これは役に立ちます。 –

43

クロスドメインスクリプトはサイト自体のスクリプトの後に読み込まれるため、エラーが発生します。興味深いことに、誰もここでこれを知っていません。

+2

このコメントありがとうございました。スクリプトを同じドメインに移動した後、それ以上の問題はありません。 – BradH

+2

"considerer good answer"に間違いがありますか(http://stackoverflow.com/questions/1307929/javascript-dom-load-events-execution-sequence-and-document-ready):「JavascriptはあなたのHTMLに表示される順番で実行されるので、イベントをイベントに添付しようとする前に関数が定義されていることを確認してください。 –

+14

GoogleのCDNからjQueryを読み込んでjQueryを必要とする独自のローカルスクリプトを作成するのはかなり一般的な方法ですので、これは可能ではないようです – spinn

0

また、組み込みのSharePoint JavaScriptメソッドを使用して、スクリプトの実行を制御することもできます。

_spBodyOnLoadFunctionNames.push("yourFunction"); 
関連する問題