该项目采用模块化设计,每个模块都有.html,.js和.css文件。在加载模块时,检查那些相关文件,如果它们已经存在于DOM中(例如,模块已经至少打开过一次),则没有问题。如果文件尚未加载(例如模块尚未加载),则偶尔会遇到调用javascript函数的问题,但外部.js文件还没有被加载装了。以下是负责处理此问题的函数:
function loadFile(sType,sURI,sCallback) {
// sType the type of file to load: link, script
// sURI the URI of the file to load
// sCallback the code to execute after successfully loading the file
var ref = document.createElement(sType);
if (sType == 'script') {
ref.setAttribute("type","text/javascript");
ref.setAttribute("src",sURI);
} else if (sType == 'link') {
ref.setAttribute("rel","stylesheet");
ref.setAttribute("type","text/css");
ref.setAttribute("href",sURI);
}
ref.async = true;
ref.onreadystatechange = ref.onload = function() {
var state = ref.readyState;
if (! sCallback.done && (! state || /loaded|complete/.test(state))) {
sCallback.done = true;
if (typeof(sCallback) === 'function') {
callback();
} else {
eval(sCallback);
}
}
};
document.getElementsByTagName('head')[0].appendChild(ref);
}
还有其他一些SO文章用于上述功能:
Dynamically load external javascript file, and wait for it to load - without using JQuery
Javascript check if function exists
因此上面的函数将被调用为:
loadFile('link',"module.css?cache=0", $("#divModule").hide().load("module.php?action=init").fadeIn('slow'));
loadFile('script',"module.js?cache=0", "initModule('req')");
第一个调用将在.css文件下载后加载模块的.html文件内容(通过module.php调用)。第二次调用将在.js文件下载后调用模块js init函数。
它似乎没有与.css文件有任何问题,但有时模块将无法正确加载意味着布局正确呈现,但没有填充值(这是模块js init发生的情况)功能)。如果我查看“Web控制台”'在FF中,没有任何错误被抛出。有什么想法吗?
谢谢, 戴夫
答案 0 :(得分:0)
很难说我没有看到那个module.php代码中发生了什么,但它看起来像你的第一个至少是立即触发,而不是作为回调。除非我遗漏了某些东西,否则回调应该是一个函数,而现在你实际上正在执行jquery隐藏/加载东西,当你调用loadfile
时。您可能希望将其包装在函数中。