1

javascriptファイルで非常に苛立たしい問題が発生しています。page_data、ユーティリティ、モジュールなどの名前空間を含む1つのグローバル名前空間があります。

私のディレクトリは次のようになります:/utilities/single_utility.js /modules/module.js etc tec

とにかく、(ユーティリティを使用する)モジュールの前にユーティリティをロードしますが、問題が発生し続けます。

私のローダースクリプトは次のようになります(SEAFでラップされています):

    for (var index in file_list) {

    var url = file_list[index];
    var new_script = document.createElement('script');

    new_script.setAttribute("type", "text/javascript");
    new_script.setAttribute("src", url);

    element.appendChild(new_script);
}

プロジェクトは私のグローバル名前空間であり、これらの他のすべての名前空間を保持しています。しかし、Project.utilities.session.exist()などを使用して、モジュールの1つでユーティリティを参照しようとすると、Projectが見つからないというエラーがスローされることがありますか?

ファイルが正しくロードされていることを確認するためにこれを修正するにはどうすればよいですか、または他の何か間違ったことをしていますか?

4

3 に答える 3

3

を使用async = falseすると、ロード順序が保護されます。

これは、順序を読み込んで維持するために使用するクイックスニペットです。

var loadScript = function( url ) {
    if (url) {
        var doc = document,
        t = doc.createElement("script"),
        s = doc.getElementsByTagName("script")[0];
        t.type = "text/javascript";
        // Keep script order!
        t.async = false;
        t.src = url;
        s.parentNode.insertBefore(t, s);
    }
};

MDNおよびMicrosoftからのこのロジック(およびブラウザーのサポートに関する)を裏付けるいくつかの参照

于 2012-08-18T03:21:40.410 に答える
0

スクリプトタグをページに追加する場合、ブラウザは外に出てそれらのスクリプトをダウンロードする必要があります。作成したのと同じ順序でダウンロードして実行されるという保証はありません。

ブラウザに応じて、ロードnew_script時にイベントリスナーを追加する必要があります。しかし、本当に私はあなたのためにすべての厄介な詳細を処理 するスクリプトローディングライブラリ( RequireJSなど)を使用することをお勧めします。onloadonreadystatechange

余談ですが、すべてのスクリプトタグをページに直接追加してみませんか?その場合、それらは順番にロードされます。

于 2012-08-18T03:13:25.980 に答える
0

スクリプトローダーを使用してこの問題を解決するとよいでしょう。

Mattが言ったように、スクリプトの依存関係も処理したい場合は、RequireJSが適切なオプションです。

スクリプトの読み込みの場合のみ、LAB.jsを調べることができます。これは非常に小さく、簡単です。

for (var index in file_list) {
    $LAB.script(file_list[index]);
}

スクリプトに依存関係があり、順番にロードする必要がある場合は.wait()、を使用して、スクリプトによって返されるチェーンオブジェクトを保持できます。ループを書き直して、チェーンを維持することができます。

var chain;
for (var index in file_list) {
    if (!chain) { 
         chain = $LAB.script(file_list[index]).wait(); 
    } else {
         chain.script(file_list[index]).wait();
    }
}

または、配列を忘れてfile_list$LABを直接使用します。

$LAB.script('file1.js').wait()
    .script('file2.js').wait()
    /* ... */
于 2012-08-18T03:50:24.037 に答える