我知道IE对load
元素没有<script>
事件 - 有没有办法可靠地弥补这一点?
我已经看过一些关于事物的讨论(例如,requestState == "complete"
),但没有一点可以证实。
这是为了在脚本加载完成后调用代码,这样我就不必使用AJAX来加载新的源代码(从而消除了跨域AJAX的问题)。
答案 0 :(得分:25)
您可以使用head.js之类的脚本加载器。它有自己的负载回调,它也会减少加载时间。
从headjs
代码:(略微修改为更便携)
function scriptTag(src, callback) {
var s = document.createElement('script');
s.type = 'text/' + (src.type || 'javascript');
s.src = src.src || src;
s.async = false;
s.onreadystatechange = s.onload = function () {
var state = s.readyState;
if (!callback.done && (!state || /loaded|complete/.test(state))) {
callback.done = true;
callback();
}
};
// use body if available. more safe in IE
(document.body || head).appendChild(s);
}
答案 1 :(得分:4)
我想补充一点,如果你不支持IE7及以下版本,你不需要onreadystatechange
个东西。资料来源:quircksmode.org
原始答案的简化和工作代码:
function scriptTag (src, callback) {
// src is just a string now!
var s = doc.createElement('script');
s.type = 'text/javascript';
s.src = src;
s.async = false;
s.onload = callback;
document.body.appendChild(s);
}
答案 2 :(得分:2)
这只是ilia答案的延伸。我像这样使用了scriptTag:效果很好:
// these 3 scripts load serially.
scriptTag(boot_config.DEPENDENCIES.jquery,function(){
// jquery ready - set a flag
scriptTag(boot_config.DEPENDENCIES.jqueryui,function(){
// jqueryui ready - set a flag
scriptTag(boot_config.DEPENDENCIES.your_app,function(){
// your_app is ready! - set a flag
});
});
});
// these 2 scripts load in paralell to the group above
scriptTag(boot_config.EXTERNALS.crypto,function(){
// crypto ready - set a flag
});
scriptTag(boot_config.EXTERNALS.cropper,function(){
// cropper ready - set a flag
});