暂停页面执行,直到加载脚本

时间:2012-12-17 15:09:59

标签: javascript jquery ajax

我已经用这段代码卡住了几天,我想延迟targetObj.innerHTML的执行,直到加载了所有的javascript文件(可能有多个,我实际上需要检查它们是否已加载而不是标题已添加),先谢谢你们!

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);

2 个答案:

答案 0 :(得分:0)

如果要异步加载脚本依赖项,我会考虑使用像RequireJS这样的AMD库。它将检查是否已加载所有脚本,并允许您在回调中执行yoru代码。

答案 1 :(得分:0)

这会有一些变化,但你可能会看到的是一个递归的setTimeout循环。不是设置targetObj.innerHTML = ...,而是向设置parseScript的{​​{1}}发送回调。然后,在targetObj.innerHTML中,有一个函数使用parseScript每10毫秒递归调用一次。

对此内部函数的每次调用都会检查您的脚本是否已被执行。 (也许通过一个全局变量来保存要执行的脚本数量,并从每个addScriptTag&gt; loadFunc中减去它。一旦达到0,你就已经执行了所有脚本。)如果它们还没有被执行,那么函数只是在window.setTimeout中再次调用自身。如果有,则执行回调 - 将所需的值传回给它。

像这样(未经测试):

window.setTimeout

...但是,正如所指出的,还有其他像require.js这样的库可能会为你做这类事情。另外,我不确定(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; }); } })(); 是否真的要回到这里,所以可能需要进行一些修改。