2009-12-09 85 views
7

中的文档上触发“onload”事件我目前正在为Javascript方法开发单元测试,以检测文档的准备情况。这段代码已经在框架级别了,所以请避免提到这已经在jQuery或其他库中实现。如何在IE

我已经成功地模拟了“readystatechange”改变事件用下面的代码:

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

我没有为“负荷”事件这样做。在IE7无效参数错误,由调用抛出下面的代码结果fireEvent最后一行:

event = document.createEventObject(); 
event.type = 'load'; 
document.fireEvent('onload',event); 

有没有人这样做,或失败之前做到这一点?我也对任何建议以不同的方式解决事件感兴趣。

编辑:由新月新鲜的建议下,我改变了我的代码:

event = document.createEventObject(); 
event.type = 'load'; 
document.body.fireEvent('onload',event); 

没有更多的错误,但是对于“onload事件”听者不火。下面是我如何配置它:

document.attachEvent('onload',listener); 
+1

'load'事件实际上在'document.body'上触发。所以你可以试试'document.body.fireEvent('onload',event)'。我怀疑这实际上会触发连接到'onload'的句柄。如果它确实让我震惊...... – 2009-12-09 16:22:41

+0

你是100%的权利。在document.body上触发事件可以没有错误地完成,但是不会触发附加了document.attachEvent的侦听器。 – 2009-12-09 16:32:13

+0

@Eric:这么想。这是一个无赖的人。 – 2009-12-09 16:42:07

回答

4

根据this page at MSDNdocument没有onload事件。您需要window.onloaddocument.body.onload。这些在IE中是相同的:由于历史原因,<body onload="...">实际上设置为window.onload,因此MS决定使document.body.onload别名为window.onload

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

+1

@Christoph:好点,Crescent Fresh已经提到:我应该在document.body上发起事件。对window.onload有趣的评论,但没有那么有用,因为window没有fireEvent方法。 – 2009-12-09 16:38:00

+0

@Christoph感谢您编辑您的答案。我会接受它作为这个有趣的讨论的结论。 – 2009-12-09 17:41:50

0

当文档(包括外部资源,如图像)完全加载,而不是之前加载事件将触发。

你试图触发什么结果readystatechangereadyState价值实际上是否改变?无论是否这两者都没有太大的用处:或者您使用readyState来触发未发生变化的事件,或者您使用readyState来触发该事件,但这不是对文档状态的有效反映。

+0

@NickFitz附加在IE中触发'onload'事件的侦听器感谢你的回答。我不想改变document.readyState的值,它之前保持'完整'(因为我有一个等待,直到readyState变成'complete')并且在我的测试之后。请记住,此代码是为单元测试编写的。 – 2009-12-09 16:35:11

+0

@NickFitz:Eric只是试图模拟真实世界的'load'事件进行本地单元测试。 – 2009-12-09 16:41:28

+0

如果是单元测试,那么根本不需要触发任何事件。只需创建一个具有已知值的模拟事件对象,并直接调用事件处理程序,然后检查它是否为这些值生成了正确的结果。否则,它不是一个单元测试,它是一个集成测试:您正在测试代码如何与浏览器的内部事件处理机制集成。 – NickFitz 2009-12-10 11:29:59

3

出于某种原因,在DOM加载后,IE看起来会覆盖windowonload属性和一个空对象。至少是这样的话,当你尝试从一个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> 

在这种情况下,你会看到在window.onload被确认为一个功能,那么你会看到“测试”警报。当你点击标题时,你会看到window.onload现在是一个object。我试着迭代对象的属性,但它是空的。这并不酷。

一个蹩脚的解决方法是抓取可访问范围中的函数,并将其分配给您可以在方便时触发的其他属性...

<!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> 

我想不出任何其他方式来解决这个问题了。

+0

@Josh Stodola有趣...我今天发现document.attachEvent不是IE中的一个函数:你当然可以调用它,但(typeof document.attachEvent)返回“object”和document.attachEvent.call和document。 attachEvent.apply未定义...这个浏览器永远不会停下来让我感到惊讶。 – 2009-12-09 21:18:18