如何在IE中的文档上触发“onload”事件

时间:2009-12-09 16:00:11

标签: javascript unit-testing internet-explorer events document

我目前正在为Javascript方法开发单元测试,以检测文档的准备情况。此代码已经处于框架级别,因此请避免在jQuery或其他库中实现此代码。

我已使用以下代码成功模拟了'readystatechange'更改事件:

var event;
event = document.createEventObject();
event.type = 'readystatechange';
document.fireEvent('onreadystatechange',event);

我没有为'load'事件做同样的事情。以下代码导致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);

3 个答案:

答案 0 :(得分:4)

根据this page at MSDNonload没有document个事件。

您需要window.onloaddocument.body.onload。这些在IE中是相同的:由于历史原因,<body onload="...">实际上设置了window.onload,因此MS决定使document.body.onload成为window.onload的别名。

问题是 - 正如Eric在评论中提到的那样 - 似乎没有办法手动触发窗口事件,这意味着可能没有针对Eric问题的解决方案。

答案 1 :(得分:4)

出于某种原因,在加载DOM之后,IE似乎覆盖了onload window属性<!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> 的空对象。至少在尝试从DOM元素的任何事件处理程序中访问它时就是这种情况......

object

在这种情况下,您会看到window.onload最初被识别为函数,然后您会看到“测试”警报。当您单击标题时,您会看到window.onload现在是<!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> 。我尝试迭代对象的属性,但它是空的。这不酷。

一个蹩脚的解决方法是获取可访问范围内的功能并将其分配给您可以方便地触发的其他属性...

{{1}}

我现在想不出任何其他方法可以解决这个问题。

答案 2 :(得分:0)

当文档(包括图像等外部资源)已完全加载时,将触发加载事件。

您尝试解雇readystatechange后会得到什么结果? readyState值实际上是否发生了变化?无论是否,这都没有多大用处:要么使用未更改的readyState来启动事件,要么使用不是州的有效反映的readyState来执行此操作该文件。