如何触发“onload” IE 中文档的事件
我目前正在为 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);
I am currently developing Unit Tests for a Javascript method that detects the readiness of the document. This code is already at framework level, so please avoid mentions of this being already implemented in jQuery or another library.
I have successfully simulated the 'readystatechange' change event with the following code:
var event;
event = document.createEventObject();
event.type = 'readystatechange';
document.fireEvent('onreadystatechange',event);
I failed to do the same for the 'load' event. The following code results in an invalid argument error in IE7, thrown by the call to fireEvent on the last line:
event = document.createEventObject();
event.type = 'load';
document.fireEvent('onload',event);
Has anyone done this, or failed to do this before? I am also interested in any suggestion to fire the event in a different way.
Edit: following the suggestion by Crescent Fresh, I changed my code to:
event = document.createEventObject();
event.type = 'load';
document.body.fireEvent('onload',event);
There is no more error, but the listener for 'onload' does not fire. Here is how I configured it:
document.attachEvent('onload',listener);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
根据 MSDN 上的此页面,有
document
没有onload
事件。您需要
window.onload
或document.body.onload
。这些在 IE 中是相同的:由于历史原因,实际上设置了
window.onload
,因此 MS 决定制作document.body.onload
是window.onload
的别名。问题是 - 正如埃里克在评论中提到的 - 似乎没有办法手动触发窗口事件,这意味着埃里克的问题可能没有解决方案。
According to this page at MSDN, there's no
onload
event fordocument
.You want either
window.onload
ordocument.body.onload
. These are identical in IE: for historical reasons,<body onload="...">
actually setswindow.onload
, so MS decided to makedocument.body.onload
an alias ofwindow.onload
.The problem with this is - as Eric mentioned in the comments - that there doesn't seem to be a way to manually fire window events, which means that there might not be a solution for Eric's problem.
由于某种原因,IE 在 DOM 加载后似乎用空对象覆盖了
window
的onload
属性。至少当您尝试从 DOM 元素的任何事件处理程序中访问它时是这样的......在这种情况下,您会看到 window.onload 最初被识别为函数,然后您会看到“Test”警报。当您单击标题时,您将看到 window.onload 现在是一个
对象
。我尝试迭代对象的属性,但它是空的。这不酷。一个蹩脚的解决方法是获取可访问范围中的函数并将其分配给您可以在方便时触发的不同属性......
我现在想不出任何其他方法来解决这个问题。
For some reason, it appears that IE overrides the
onload
property ofwindow
with an empty object after the DOM is loaded. At least that is the case when you try to access it from within any event handler of a DOM element...In this situation, you'll see that window.onload is recognized as a function initially, then you see the "Test" alert. When you click on the heading, you'll see that window.onload is now an
object
. I tried iterating through the properties of the object, but it's empty. This is not cool.One lame workaround is to grab the function in the accessible scope and assign it to a different property that you can fire at your convenience...
I can't think of any other way to address this issue right now.
load 事件将在文档(包括图像等外部资源)完全加载时触发,而不是在此之前。
您尝试触发
readystatechange
会得到什么结果?readyState
值实际上有变化吗?无论是否,这都没有多大用处:要么使用未更改的readyState
触发事件,要么使用未更改的readyState
触发事件文档状态的有效反映。The load event will fire when the document (including external resources such as images) has fully loaded, and not before.
What results are you getting from your attempts to fire
readystatechange
? Does thereadyState
value actually change at all? Whether or not, that's not of much use either: either you fire the event with areadyState
that hasn't changed, or you do so with areadyState
that isn't a valid reflection of the state of the document.