0

以下の関数が呼び出しを取得するときにjavascriptをロードするWebページがあります。

loadjavascript:function(v_url) 
    {
        if (v_url != indef && v_url != ' ') {

            var filename = '../includes/javascript.php?url=' + v_url;

            var fileref=document.createElement('script');
                fileref.setAttribute("type","text/javascript");
                fileref.setAttribute("src", filename);
            if (typeof fileref!="undefined")
                document.getElementsByTagName("head")[0].appendChild(fileref);
        }   
    }

firebugをチェックインすると、非常に多くの同じjavascriptがロードされているのを見ることができます。

この問題を解決するために私がしたいのは-

1)javascriptがロードされていない場合に関数が呼び出されたら、それをロードしてヘッドに追加します。2)関数が呼び出され、それがヘッドセクションにすでに存在する同じjavascriptである場合、新しいものをロードせずに、すでに存在するjavascriptを実行します。

それを行うことはできますか、それともjavasctriptでは不可能です。誰かがそれを行う方法についていくつかのアイデアを共有できますか。

前もって感謝します。

4

1 に答える 1

1

この問題は、リファクタリングの必要性を示唆しています。しかし、実際に尋ねられた質問に答える: :-)

1)javascriptがロードされていない場合に関数が呼び出されたときに、それをロードしてヘッドに追加します。

この部分は簡単で、 の既存のscript要素をループするだけheadです。

var head = document.getElementsByTagName('head')[0];
var list = head.getElementsByTagName('script');
var index, script, found;

found = false;
for (index = 0; !found && index < list.length; ++index) {
    script = list[index];
    if (script.src.indexOf('?url=' + v_url) !== -1) { // Or however precise you want to be
        found = true;
    }
}
if (found) {
    // It was found, don't load it again
}
else {
    // It wasn't found, load it
}

2) 関数が呼び出され、それが head セクションに既に存在する同じ JavaScript である場合、新しいものをロードせずに、既に存在する JavaScript を実行します。

この部分では、問題のスクリプトを変更する必要があります。基本的に、スクリプトが次のようになっているとします。

function defineSomeFunction() {
    // ...
}
function defineSomeOtherFunction() {
    // ...
}
if (foo) {
    bar();
}
if (thisCondition) {
    thatAction();
}
// etc.

...実行しているすべてのインライン処理(if上記の 2 つのステートメント) が実際には次のように関数によって実行されるように変更する必要があります。

function defineSomeFunction() {
    // ...
}
function defineSomeOtherFunction() {
    // ...
}
function inlineStuff() {
    if (foo) {
        bar();
    }
    if (thisCondition) {
        thatAction();
    }
    // etc.
}
inlineStuff();

次に、一度ロードされたことを検出したら、再度ロードするのではなく、inlineStuff関数を呼び出すだけです。

これらの関数が複数ある場合 (実際にあるように見えます)、inlineStuff関数名が一意であり、 によって推論または定義できることを確認する必要がありv_urlます。これにより、どの関数を呼び出すかがわかります。window次に、すべてのグローバルがそこにあるので、それを参照して呼び出すことができます。

var functionName = figureOutFunctionNameFromURL(v_url);
window[functionName]();
于 2013-02-16T09:51:46.830 に答える