1

以前に含まれていなかった場合にのみjavascriptを含めるための小さなjavascriptスニペットを見つけました。

これは私自身のスクリプトでは機能しますが、2つのサードパーティ製ライブラリでは機能せず、その理由はよくわかりません。

    var included_files = new Array();
    function include_once(script_filename) {
        if (!in_array(script_filename, included_files)) {
            included_files[included_files.length] = script_filename;
            include_dom(script_filename);
        }
    }
    function in_array(needle, haystack) {
        for (var i = 0; i < haystack.length; i++) {
            if (haystack[i] == needle) {
                return true;
            }
        }
        return false;
    }
    function include_dom(script_filename) {
        var html_doc = document.getElementsByTagName('head').item(0);
        var js = document.createElement('script');
        js.setAttribute('language', 'javascript');
        js.setAttribute('type', 'text/javascript');
        js.setAttribute('src', script_filename);
        html_doc.appendChild(js);
        return false;
    }

function loaded() {
    include_once("shared/scripts/jquery.min.js");
    include_once("shared/scripts/iscroll.js");

    $(document).ready(function () {
        alert("hello");
    });
}

エラー:$が定義されていません。jQueryを通常の方法でインポートし、「iScroll」が定義されていないと表示された場合(後で使用するため)。

何か案は?

4

4 に答える 4

7

include_dom非同期です。スクリプトを並行してロードするため、スクリプトがいつロードされるかを実際に決定することはできません。ダウンロードを開始した直後にjQueryを使用しようとしましたが、機能しません。

ロードされたスクリプトのコールバックを指定できるスクリプトを使用する必要があります。require.jsをお勧めします

于 2012-10-19T07:48:05.360 に答える
4

スクリプトをDOMに追加していますが、スクリプトが提供する機能を使用する前に、スクリプトをロードさせていません。

追加するスクリプト要素のロードイベントにコールバックをバインドする必要があります。

(少なくともほとんどのブラウザーでは、他のブラウザーにいくつかのハックを実装する必要がある場合があります。jQueryのgetScriptメソッドのソースコードを調べたい場合があります)。

于 2012-10-19T07:47:16.030 に答える
2

スクリプトローダーを使用します。yepnopeはあなたがやろうとしていることすべてを行います

于 2012-10-19T07:49:25.550 に答える
2

誰かがコールバックを言いましたか?

function include_once(script_filename, callback) {
        if (!in_array(script_filename, included_files)) {
            included_files[included_files.length] = script_filename;
            include_dom(script_filename, callback);
        }
    }

function include_dom(script_filename, callback) {
    var html_doc = document.getElementsByTagName('head').item(0);
    var js = document.createElement('script');
    js.setAttribute('language', 'javascript');
    js.setAttribute('type', 'text/javascript');
    js.setAttribute('src', script_filename);
    if(callback && callback != 'undefined'){
        js.onload =  callback;
        js.onreadystatechange = function() {
            if (this.readyState == 'complete') callback();
        }
    }
    html_doc.appendChild(js);
    return false;
}

function loaded() {
    include_once("shared/scripts/jquery.min.js", function(){
        $(document).ready(function () {
            alert("hello");
        });
    });
    include_once("shared/scripts/iscroll.js");
}
于 2012-10-19T08:04:14.477 に答える