我使用动态脚本加载来减少初始页面加载的持续时间。为了确保脚本定义的函数和对象是可访问的,我需要确保脚本已经完全加载。
为此,我开发了自己的 Javascript 库,因此对该主题进行了大量研究,研究它在不同库中是如何完成的。在与此问题相关的讨论中, LABjs的作者 Kyle Simpson表示:
LABjs(和许多其他加载器)在所有脚本元素上同时设置“onload”和“onreadystatechange”,知道有些浏览器会触发一个,有些会触发另一个......
在撰写本文时,您可以在当前版本的 jQuery v1.3.2中找到一个示例:
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
success();
complete();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild( script );
}
};
这是最先进的技术,但是在分析 Opera 9.64 中的一个奇怪行为时,我得出的结论是,使用这种技术,onload 回调被过早地触发了。
我将发布我自己的发现来回答这个问题,并希望从社区收集进一步的证据和反馈。