Wie Feuer "onload" - event auf Dokument im IE
Ich bin derzeit auf der Entwicklung von Unit-Tests für Javascript-Methode, die erkennt die Bereitschaft des Dokuments. Dieser code ist bereits auf framework-Ebene, so vermeiden Sie bitte erwähnt dies bereits in jQuery oder eine andere Bibliothek.
Habe ich erfolgreich simuliert die 'readystatechange' change-Ereignis mit dem folgenden code:
var event;
event = document.createEventObject();
event.type = 'readystatechange';
document.fireEvent('onreadystatechange',event);
Ich es nicht tun das gleiche für den 'load' - event. Der folgende code führt zu einem ungültigen argument Fehler im IE7, ausgelöst durch den Aufruf von fireEvent in der letzten Zeile:
event = document.createEventObject();
event.type = 'load';
document.fireEvent('onload',event);
Hat jemand dies getan, oder nicht zu tun, dies vor? Ich interessiere mich auch für jede Anregung zum auslösen des Ereignisses in einer anderen Weise.
Edit: nach dem Vorschlag von Crescent Frische, änderte ich meinen code an:
event = document.createEventObject();
event.type = 'load';
document.body.fireEvent('onload',event);
Es ist kein Fehler mehr, aber der Hörer für 'onload' wird nicht ausgelöst. Hier ist, wie ich es konfiguriert:
document.attachEvent('onload',listener);
- Die
load
Ereignis tatsächlich feuert aufdocument.body
. So können Sie versuchen, stattdocument.body.fireEvent('onload',event)
. Ich bezweifle, dass Ihnen tatsächlich Feuer Griffe befestigtonload
obwohl. Wenn es das täte, wäre ich schockiert.... - Sie sind 100% Recht. Die Entlassung der Veranstaltung auf dem Dokument.Körper kann getan werden, ohne Fehler, aber die Zuhörer mit dem beigefügten Dokument.attachEvent werden nicht ausgelöst.
- dachte so viel. Das ist ein doofer Mann.
- Frisch Zu schlecht. Wenn du deinen Kommentar in eine Antwort werde ich mich freuen, es zu akzeptieren. Irgendeinem Grund hinter der Tatsache, dass 'readystatechange' und 'laden' anders Verhalten?
- Sie sollten wahrscheinlich auch zu legen, um den
document.body.attachEvent()
statt nurdocument.attachEvent()
- wahrscheinlich... ich bin in Sie suchen, nur Kontrolle, wenn ich fälschlicherweise angenommen, dass document.attachEvent('onload', etwas) sollte immer Feuer
- Ich glaube nicht, dass Handler angehängt
document.body.attachEvent('onload', ...)
Feuer, wenn die Seite geladen wird, normalerweise jedenfalls. IE zwingt Sie zu befestigen, entweder über<body onload="..."
,window.onload = ...
oderwindow.attachEvent('onload', ...)
. - aber anscheinend window-onload-und-Dokument.body onload sind die gleichen? zucken nur so ein Gedanke...
- NÖ.
<body onload="..."
ist der einzige Weg, um die Karte an das Fensteronload
Fall, soweit ich weiß.document.body.attachEvent('onload', ...)
wird einfach ignoriert. - Im IE natürlich.
- Frisch-das ist die Schlussfolgerung, die ich gerade erreicht durch ausführen ein paar neue tests: Listener für das 'onload' - Ereignis werden nur entlassen werden, DH, wenn angebracht durch das Fenster.attachEvent, nicht Dokument.attachEvent noch Dokument.Körper.attachEvent
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut diese Seite auf MSDN, es gibt keine
onload
Ereignis fürdocument
.Willst du entweder
window.onload
oderdocument.body.onload
. Diese sind identisch im IE: aus historischen Gründen<body onload="...">
tatsächlich setztwindow.onload
, so dass MS entschiedendocument.body.onload
aliaswindow.onload
.Das problem mit diesem ist - wie Eric erwähnt in den Kommentaren -, dass es scheint nicht ein Weg, um Sie manuell Feuer-window-Ereignisse, was bedeutet, dass es möglicherweise nicht eine Lösung für Erics problem.
Aus irgendeinem Grund, es scheint, dass der IE überschreibt die
onload
Eigenschaft vonwindow
mit einem leeren Objekt, nachdem das DOM geladen ist. Das ist zumindest dann der Fall, wenn Sie versuchen, Zugriff von innerhalb jeder event-handler an DOM-element...In dieser situation, du wirst sehen, dass Fenster.onload ist anerkannt als eine Funktion zunächst, dann sehen Sie die "Test" - Warnung. Wenn Sie klicken Sie auf die überschrift, werden Sie sehen, dass Fenster.onload wird nun ein
object
. Ich habe versucht, Durchlaufen die Eigenschaften des Objekts, aber es ist leer. Das ist nicht cool.Einer Lahmen workaround ist, greifen die Funktion in dem Umfang zugänglich, und weisen Sie es auf eine andere Eigenschaft, die Sie feuern können an Ihrer Bequemlichkeit...
Ich kann mir nicht vorstellen, dass es eine andere Möglichkeit um dieses Problem zu beheben jetzt.
Load-Ereignis wird ausgelöst, wenn das Dokument (einschließlich externe Ressourcen wie Bilder) vollständig geladen ist, und nicht vorher.
Welche Ergebnisse sind Sie immer über Ihre versuche, das Feuer
readystatechange
? Hat diereadyState
Wert eigentlich überhaupt wechseln? Ob oder nicht, das ist nicht viel, entweder: entweder feuern Sie die Veranstaltung mit einemreadyState
das hat sich nicht verändert, oder Sie tun so mit einenreadyState
es nicht die gültige Reflexion über den Stand des Dokuments.load
Ereignis für die lokale unit-tests.