我尝试了https://stackoverflow.com/a/950146/151453提供的代码,并且我成功验证了我可以从t2.js
加载t1.js
。但是,t2.js
完成加载回调仅适用于Chrome(v26),Firefox(v17)和IE10,但不适用于Microsoft IE8(Windows 7)。
IE8的症状是:永远不会调用回调start_deco()
。
如何在IE8中获得相同的结果?谢谢。
====以下代码====
t1.html:
<html>
<head></head>
<body>
Hello!
<script src="t1.js"></script>
</body>
</html>
t1.js:
// loadScript function provided by https://stackoverflow.com/a/950146/151453
function loadScript(url, callback)
{
// adding the script tag to the head as suggested before
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
// then bind the event to the callback function
// there are several events for cross browser compatibility
//script.onreadystatechange = callback; // chj: !!!
script.onload = callback;
// fire the loading
head.appendChild(script);
}
function start_deco()
{
alert('Done t2.js.');
loadScript('t3.js.');
}
loadScript('t2.js', start_deco) // wish to load jquery.js etc
t2.js:
console.log('Loading t2.js...')
t3.js:
console.log('Loading t3.js...')
============== UPDATE1 =================
在IE8上,如果我在script.onreadystatechange = callback;
中启用loadScript()
,则会弹出警告框,但是,调用loadScript('t3.js.');
会失败并在该行上显示“未实现错误”,以便t3。 js无法加载。图片如下:
答案 0 :(得分:2)
哦,我明白了。这都怪我! https://stackoverflow.com/a/950146/151453提供的loadScript()在IE8和Firefox,Chrome上完全可行。
并且,为了使其在IE9 +中工作,我必须遵循Microsoft的建议:http://msdn.microsoft.com/en-us/library/ie/hh180173(v=vs.85).aspx。
评论script.onreadystatechange = callback;
声明是我的错。
我的IE8控制台上显示的“未实现”错误是由于在调用callback
时缺少loadScript('t3.js.');
参数。
所以,要解决这个问题,我应该在loadScript()中添加一行,最终结果是:
function loadScript(url, callback)
{
// adding the script tag to the head as suggested before
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
if(!callback) callback = function(){}; // ★★★★★★★★★ JUST ADD THIS LINE!
// bind the event to the callback function
if(script.addEventListener) {
script.addEventListener("load", callback, false); // IE9+, Chrome, Firefox
}
else if(script.readyState) {
script.onreadystatechange = callback; // IE8
}
// fire the loading
head.appendChild(script);
}
在IE8,IE9,Firefox 17,Chrome 27上验证。
答案 1 :(得分:1)
IE8及更早版本处理script
对象的方式略有不同 - 它们不会公开onLoad
事件而是公开onReadyStateChange
事件。您可以在https://github.com/mootools/mootools-more/blob/master/Source/Utilities/Assets.js查看Mootools的Asset.javascript
函数,以获得一个很好的例子。你主要是在寻找这个部分:
if (!script.addEventListener){
script.addEvent('readystatechange', function(){
if (['loaded', 'complete'].contains(this.readyState)) load.call(this);
});
} else {
script.addEvent('load', load);
}
当然应该注意这样的情况是总是使用像Mootools或jQuery这样的库的主要原因之一,以完全避免这样的问题。
答案 2 :(得分:0)
我知道这不是来自js,但这是一个选择吗?
<html>
<head></head>
<body>
Hello!
<script src="t1.js"></script>
<!--[if IE 8]>
<script src="t2.js"></script>
<![endif]-->
</body>
</html>