我刚刚开发了一个动态脚本加载器,它在 IE9 中运行良好,但在 IE11 和 FF 中运行良好。
这是我的代码:
function getResourceScript(filename)
{
var script = document.createElement('script');
script.setAttribute('src', mShuttlePath + "scripts/" + filename);
script.setAttribute('type', 'text/javascript');
script.setAttribute('language', 'javascript');
document.getElementsByTagName('head')[0].appendChild(script);
}
function documentLoadInit()
{
if (document.readyState == 'complete')
{
// check if all scripts are loaded
for (var n = 0; n < document.scripts.length; n++)
{
if (document.scripts[n].readyState != "complete" && document.scripts[n].readyState != "loaded")
{
setTimeout(documentLoadInit, 49);
return false;
}
}
Init();
}
else
{
setTimeout(documentLoadInit, 49);
}
}
getResourceScript("core/core.js");
getResourceScript("core/ajax.js");
这里的主要问题是,script.readyState 在 IE11 中被删除了——我发现了这么多!
但是如何替换呢?如何检查脚本何时加载/完成?
有什么想法吗?
最佳答案
来自 MSDN:
Note: For the script element,
readyState
is no longer supported. Starting with Internet Explorer 11, useonload
. For info, see Compatibility changes.
因此,除了检查 readyState
之外,您还可以使用如下内容:
if (!script.addEventListener) {
//Old IE
script.attachEvent("onload", function(){
// script has loaded in IE 7 and 8 as well.
callBack();
});
}
else
{
script.addEventListener("load", function() {
// Script has loaded.
callBack();
});
}
另外,我很确定您可以改进您的代码。而 setInterval()
更适合这种情况。阅读一些有关如何使用 dom 事件的信息,如果您仍然遇到兼容性问题,可以使用以下内容:
function loadExtScript(src, test, callback) {
var s = document.createElement('script');
s.src = src;
document.body.appendChild(s);
var callbackTimer = setInterval(function() {
var call = false;
try {
call = test.call();
} catch (e) {}
if (call) {
clearInterval(callbackTimer);
callback.call();
}
}, 100);
}
该函数将测试作为参数。由于您是应用程序的设计者,您会知道什么是成功的测试。一旦此测试为真,它将执行回调。
关于javascript - script.readyState 在 IE11 和 FF 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25617535/