0

真っ先に:このプロジェクトはJQueryを使用していません。

サードパーティのJavaScriptがいくつかあります。大きくて毛深いので、頻繁に使用する必要がないため、次の必要な場合にのみ動的にロードします。

function loadBigHairyCode()
{
    var file = document.createElement('script')
    file.setAttribute("type","text/javascript")
    file.setAttribute("src","path/to/big/ugly/script/file.js")
    document.getElementsByTagName("head")[0].appendChild(file)

    magic_needs_to_happen_here
}

ここに示されていない対応するCSSを含め、スクリプトの読み込みは正常に機能します。

UglyGlobalFuncロードされたファイルは、通常の方法で他の場所で使用するコンストラクター関数(と呼びます)を定義します( var foo = new UglyGlobalFunc(....))。問題は、そのファイルの残りの部分がちょっと醜いので、それを少し修正して、それがより少なくなるようにする必要があるということです。具体的には、上記の「魔法はここで起こる必要がある」を示した時点で、次のように書きたいと思います。

UglyGlobalFunc.prototype.BodgeBodgeBodge = function() {....}

基になるファイルを編集しているかのように。

しかし、それは失敗します。コードのその時点では、UglyGlobalFuncが未定義であり、これは理にかなっています。のような単純なレベルの間接参照についても同じwindow.UglyGlobalFunc.proto...です。だから私の質問は:

  1. 動的にロードされたコンテンツは、実行のその時点(魔法が発生する必要がある場所)でもアクセスできますか?または、loadBigHairyCode()が返され、ブラウザーが何らかの更新サイクルを実行するまで、それらは「実際」になりませんか?

  2. はいの場合、どうすればそれらにアクセスできますか?ある種のgetGlobalVariableByName( "string")関数?

  3. そうでない場合は、...aieee。普通の正気の人はどうやってそのようなことをするのですか?

4

2 に答える 2

4

あなたはこれを試すことができます

function loadBigHairyCode()
{
    var file = document.createElement('script')
    file.onreadystatechange= function () { // works in IE
        if (this.readyState == 'complete') MyFunc();
    }
    file.onload= MyFunc;
    file.type="text/javascript";
    file.src="path/to/big/ugly/script/file.js";
    document.getElementsByTagName("head")[0].appendChild(file)
}

function MyFunc(){
    //....
}

更新: あなたはこれを読むことができます

于 2012-12-11T20:44:37.520 に答える
3

このような要素を作成するときは<script>、そのonloadイベントにバインドする必要があります。このイベントは、読み込まれて使用できるようになるとすぐに発生します。

もう1つのオプションは、を使用document.write('<script src="..."></script>');して同期的にロードすることです。その後、次の行で使用できます。ページの読み込みが完了する前に必ず行ってください。そうしないと、ドキュメント全体が上書きされます。

于 2012-12-11T20:42:59.220 に答える