我使用动态脚本加载来减少初始页面加载的持续时间.为确保可以访问脚本定义的函数和对象,我需要确保脚本已完全加载.
为此我开发了自己的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 );
}
};
Run Code Online (Sandbox Code Playgroud)
这是最先进的技术,但在分析Opera 9.64中的一个奇怪的行为时,我得出的结论是,使用这种技术,onload回调过早被解雇了.
我会在回答这个问题时发表自己的研究结果,并希望收集社区的进一步证据和反馈.
我目前正在为Javascript方法开发单元测试,以检测文档的准备情况.此代码已经处于框架级别,因此请避免在jQuery或其他库中实现此代码.
我已使用以下代码成功模拟了'readystatechange'更改事件:
var event;
event = document.createEventObject();
event.type = 'readystatechange';
document.fireEvent('onreadystatechange',event);
Run Code Online (Sandbox Code Playgroud)
我没有为'load'事件做同样的事情.以下代码导致IE7中的无效参数错误,在最后一行调用fireEvent抛出:
event = document.createEventObject();
event.type = 'load';
document.fireEvent('onload',event);
Run Code Online (Sandbox Code Playgroud)
有没有人这样做过,或者之前没有这样做过?我也对任何以不同方式解雇事件的建议感兴趣.
编辑:按照Crescent Fresh的建议,我将代码更改为:
event = document.createEventObject();
event.type = 'load';
document.body.fireEvent('onload',event);
Run Code Online (Sandbox Code Playgroud)
没有更多的错误,但'onload'的监听器不会触发.这是我配置它的方式:
document.attachEvent('onload',listener);
Run Code Online (Sandbox Code Playgroud) 我最近发现拼写选项归功于Code Review上的这个答案,我觉得该选项非常有用(编辑时)并且非常烦人(在阅读代码时,因为所有的误报).
我想以某种方式在切换到插入模式时自动启用该选项:
set spell
Run Code Online (Sandbox Code Playgroud)
并在切换回正常模式时自动禁用它:
set nospell
Run Code Online (Sandbox Code Playgroud) MSDN上的onerror页面指出,onerror处理程序可以附加到脚本元素,并且"在对象加载期间发生错误时触发".
出于单元测试的目的,我试图让这个onerror处理程序触发,但找不到合适的例子.
以下代码在Firefox中触发错误,但Internet Explorer中不显示任何警报
<script src="http://www.google.com/NOTFOUND.js" onerror="alert('error fired')"></script>
Run Code Online (Sandbox Code Playgroud)
有没有人知道script.src的值会触发附加到script.onerror的处理程序?
javascript ×3
scripting ×2
unit-testing ×2
document ×1
dynamic ×1
events ×1
labjs ×1
load ×1
vim ×1