Javascript “如何开火”;“满负荷”;IE中的文档事件
我目前正在为检测文档就绪性的Javascript方法开发单元测试。这段代码已经是框架级的,所以请避免提及jQuery或其他库中已经实现了这段代码 我已使用以下代码成功模拟了“readystatechange”更改事件:Javascript “如何开火”;“满负荷”;IE中的文档事件,javascript,unit-testing,internet-explorer,events,document,Javascript,Unit Testing,Internet Explorer,Events,Document,我目前正在为检测文档就绪性的Javascript方法开发单元测试。这段代码已经是框架级的,所以请避免提及jQuery或其他库中已经实现了这段代码 我已使用以下代码成功模拟了“readystatechange”更改事件: var event; event = document.createEventObject(); event.type = 'readystatechange'; document.fireEvent('onreadystatechange',event); 我未能对“加载”事
var event;
event = document.createEventObject();
event.type = 'readystatechange';
document.fireEvent('onreadystatechange',event);
我未能对“加载”事件执行相同的操作。以下代码导致IE7中的无效参数错误,该错误由最后一行的fireEvent调用引发:
event = document.createEventObject();
event.type = 'load';
document.fireEvent('onload',event);
以前有没有人做过,或者没有做过?我还对以不同方式启动该活动的任何建议感兴趣
编辑:根据Crescent Fresh的建议,我将代码更改为:
event = document.createEventObject();
event.type = 'load';
document.body.fireEvent('onload',event);
不再有错误,但“onload”的侦听器不会启动。下面是我如何配置它的:
document.attachEvent('onload',listener);
加载事件将在文档(包括图像等外部资源)已完全加载时触发,而不是之前 您尝试触发
readystatechange
的结果是什么?readyState
值是否确实发生了变化?无论是否,这也没有多大用处:要么使用未更改的readyState
触发事件,要么使用未有效反映文档状态的readyState
触发事件。根据,对于文档
,没有onload
事件
您需要window.onload
或document.body.onload
。这些在IE中是相同的:由于历史原因,
实际上设置了window.onload
,因此MS决定将document.body.onload
作为window.onload
的别名
正如Eric在评论中提到的那样,这样做的问题是,似乎没有办法手动触发窗口事件,这意味着Eric的问题可能没有解决方案。出于某种原因,似乎IE在加载DOM后用空对象覆盖了
窗口的onload
属性。当您试图从DOM元素的任何事件处理程序中访问它时,至少是这样
<!DOCTYPE html>
<html>
<head>
<title>Test by Josh</title>
<script type="text/javascript">
window.onload = function() {
alert("Test");
}
alert(typeof window.onload);
</script>
</head>
<body>
<h1 onclick="alert(typeof window.onload);">Test</h1>
</body>
</html>
我现在想不出任何其他方法来解决这个问题。加载事件实际上在document.body
上触发。因此您可以改为尝试document.body.firevent('onload',event)
。不过,我怀疑它是否真的会触发连接到onload
的句柄。如果是的话,我会很震惊……你是100%正确的。触发document.body上的事件不会出错,但不会触发与document.attachEvent关联的侦听器。@Eric:我也这么想。这是一个令人不快的人。@Eric您可能还应该附加到文档.body.attachEvent()
而不仅仅是文档.attachEvent()
@gnarf:no<代码>@NickFitz谢谢你的回答。我没有试图更改document.readyState的值,它在测试之前(因为我需要等待readyState变为“完成”)和测试之后保持“完成”。请记住,这段代码是为单元测试编写的。@NickFitz:Eric只是试图为本地单元测试模拟真实世界的load
事件。如果它是为单元测试编写的,那么您根本不需要触发任何事件。只需创建一个具有已知值的模拟事件对象并直接调用事件处理程序,然后检查它是否为这些值生成了正确的结果。否则这不是单元测试,这是一个集成测试:您正在测试代码是如何与浏览器的内部事件处理机制集成的。@NickFitz,除了我没有对事件处理程序进行单元测试:)我正在为一个方法编写单元测试,该方法替换并过滤窗口和文档上的addEventListener和attachEvent。@Christoph:很好,Crescent Fresh已经提到:我应该在document.body上触发事件。关于window.onload的评论很有趣,但没有太大帮助,因为window没有fireEvent方法。@Christoph感谢您编辑您的答案。我接受它作为这个有趣讨论的结论。@Josh Stodola有趣。。。我今天发现document.attachEvent不是IE中的函数:当然可以调用它,但是(typeof document.attachEvent)返回“object”,document.attachEvent.call和document.attachEvent.apply都未定义。。。这个浏览器永远不会停下来给我惊喜。
<!DOCTYPE html>
<html>
<head>
<title>Test by Josh</title>
<script type="text/javascript">
window.onload = function() {
alert("Test");
}
</script>
</head>
<body>
<h1 onclick="window.onloadfix()">Test</h1>
<!-- Could potentially be injected via server-side include if needed -->
<script type="text/javascript">
window.onloadfix = function() {
window.onload();
}
</script>
</body>
</html>