0

私はすでにこのコードで数日間立ち往生しています.すべてのjavascriptファイルがロードされるまでtargetObj.innerHTMLの実行を遅らせたいです(複数ある可能性があり、ヘッダーが追加されたのではなく、それらがロードされているかどうかを実際に確認する必要があります) )、よろしくお願いします!

function addScriptTag(src) {
    var newScript;
    var loadFunc = function ()
    {
        $.holdReady(false);
    };
    newScript = document.createElement('script');
    newScript.setAttribute('type','text/javascript');
    newScript.setAttribute('src',src);

    //Other browsers trigger this one
    if (newScript.addEventListener)
    newScript.addEventListener('load', loadFunc, false);

    document.getElementsByTagName('head')[0].appendChild(newScript);
}

function parseScript(_source) {
    var source = _source;
    var scripts = source.match(/<script[^>]*src=[^>]*>/g);
    if (scripts) {
    for (var i = 0; i < scripts.length; i++) {
        src = scripts[i].match(/src=("([^"]*)"|'([^']*)')/);
        src = src[2] || src[3];
        if (src) {
            addScriptTag(src);
        }
    }
    }
    var scripts = new Array();

    return source;
}

function ajax_showContent(divId,ajaxIndex,url,callbackOnComplete)
{
        $.holdReady(true);
    var targetObj = document.getElementById(divId);
    targetObj.innerHTML = parseScript(dynamicContent_ajaxObjects[ajaxIndex].response);
4

2 に答える 2

0

少し変更が必要ですが、おそらく見ているのは再帰的なsetTimeoutループです。を設定する代わりに、そのセットtargetObj.innerHTML = ...にコールバックを送信します。次に、で、を使用して10ミリ秒ごとに再帰的に自分自身を呼び出す関数があります。parseScripttargetObj.innerHTMLparseScriptwindow.setTimeout

この内部関数を呼び出すたびに、スクリプトが実行されたかどうかが確認されます。(おそらく、実行するスクリプトの数を保持するグローバル変数を用意し、それから各addScriptTag> loadFuncで減算します。0に達すると、すべてのスクリプトが実行されます。)まだ実行されていない場合は、関数window.setTimeout内で自分自身を再度呼び出すだけです。ある場合は、コールバックが実行され、目的の値が返されます。

このようなもの(テストされていない):

(function() {
    var scriptCount = 0;

    function addScriptTag(src) {
        var newScript;
        var loadFunc = function() {
            scriptCount--;
            $.holdReady(false);
        };
        newScript = document.createElement('script');
        newScript.setAttribute('type', 'text/javascript');
        newScript.setAttribute('src', src);

        //Other browsers trigger this one
        if (newScript.addEventListener) newScript.addEventListener('load', loadFunc, false);

        document.getElementsByTagName('head')[0].appendChild(newScript);
    }

    function parseScript(_source, callback) {
        var source = _source;
        var scripts = source.match(/<script[^>]*src=[^>]*>/g);
        if (scripts) {
            scriptCount = scripts.length;
            for (var i = 0; i < scripts.length; i++) {
                src = scripts[i].match(/src=("([^"]*)"|'([^']*)')/);
                src = src[2] || src[3];
                if (src) {
                    addScriptTag(src);
                }
            }
            var wait = function() {
                scriptCount > 0 ? window.setTimeout(wait, 10) : callback(source);
            };
        }
        else {
            callback("");
        }
        var scripts = new Array();

        return source;
    }



    function ajax_showContent(divId, ajaxIndex, url, callbackOnComplete) {
        $.holdReady(true);
        var targetObj = document.getElementById(divId);
        parseScript(
        dynamicContent_ajaxObjects[ajaxIndex].response, function(value) {
            targetObj.innerHTML = value;
        });
    }
})();

...しかし、指摘されているように、require.jsのような他のライブラリがあなたのためにこの種のことをするかもしれません。また、sourceあなたが本当にここに戻ろうとしているのかどうかはわかりませんので、いくつかの変更が必要になる場合があります。

于 2012-12-17T15:34:53.727 に答える
0

スクリプトの依存関係を非同期で読み込みたい場合は、RequireJSのような AMD ライブラリの使用を検討します。すべてのスクリプトがロードされていることを確認し、コールバックで夜のコードを実行できるようにします。

于 2012-12-17T15:20:06.907 に答える