我已经用这段代码卡住了几天,我想延迟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);
答案 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;
});
}
})();
是否真的要回到这里,所以可能需要进行一些修改。