1

ユーザーが画面上で必要なウィジェット/ガジェットを選択できるように、私はウィジェット/ガジェットベースのWebサイトで作業しています。

これは、ウィジェット/ガジェットごとに1つずつ、数百/数千のjsファイルがあることを意味します。$ .getScriptを使用して、ユーザーの選択に基づいて、必要に応じて正しいjsファイルをロードできると思いました。

私が発見した問題は、$。getScriptはjavascriptグローバル変数を介してのみ変数を送信できることです。グローバル変数と$.getScriptは、一緒にうまく機能しないようです。

これを行う別の方法はありますか?つまり、ロードされたjsファイルがサブjsファイルを呼び出すjsファイルから変数を受け取ることができるユーザーの選択に基づいて、必要に応じてjsファイルをロードするだけですか?

4

3 に答える 3

3

私が発見した問題は、$。getScriptはjavascriptグローバル変数を介してのみ変数を送信できることです。グローバル変数と$.getScriptは、一緒にうまく機能しないようです。

経由でロードされたスクリプトは、$.getScriptグローバルに問題なくアクセスできます。(グローバル変数が良い考えではありません。)

ただし、ロードされたスクリプトに情報を渡す別の方法は、各スクリプトがスクリプト名に基づいてロード後のコールバックを実装し、ローダーコードがそのコールバックを(渡す引数を使用して)一度呼び出すことです$.getScript。そのこと。

実例| ソース

もちろん、その例ではグローバルも使用しています— $jQueryの場合、新しいスクリプトのtheNewScriptロード完了関数はグローバルです。本番システムでは、これを行うために、アプリ全体に対してグローバルを1つMyAppだけ設定し(たとえば)、他のグローバルをまったく作成しないようにスコープ関数内ですべてのコードを定義し、新しいスクリプトでそのプロパティとして「ロード完了」機能。(通常、スクリプトを要求ロードしないため、通常、グローバルはまったく定義しません。)

于 2012-12-10T16:13:51.617 に答える
3

この問題の解決策は、require.jsのようなモジュールローダーシステムを使用することです。

依存関係という名前の各ファイルに基づいて、ロードするファイルを自動的に認識します。

モジュールは、次のように依存関係の概要を明確に示します。

require(["helper/util"], function(util) {
    //This function is called when scripts/helper/util.js is loaded.
    //If util.js calls define(), then this function is not fired until
    //util's dependencies have loaded, and the util argument will hold
    //the module value for "helper/util".
});

それが完了すると、require.jsローダーが正しいJSファイルを自動的にロードします。構文は少し異なりますが、問題は解決します。

于 2012-12-10T16:14:30.820 に答える
0

純粋なJavaScriptを使用してスクリプトを呼び出してみてください

        var html_doc = document.getElementsByTagName('head')[0];
        js = document.createElement('script');
        js.setAttribute('type', 'text/javascript');
        js.setAttribute('src', '../scripts/jquery-1.7.2.min.js');
        html_doc.appendChild(js);
        js.onreadystatechange = function () {
            if (js.readyState == 'loaded' || js.readyState == 'complete') {
                doSomething
            }
        }

        //works on ff e no chrome
        js.onload = function () { doSomething }
于 2012-12-10T18:38:02.760 に答える