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);
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.
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.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.