Как запустить событие" 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);
кто-нибудь сделал это или не смог сделать это раньше? Меня также интересует любое предложение запустить мероприятие по-другому.
Edit: следуя предложению Crescent Fresh, я изменил свой код на:
event = document.createEventObject();
event.type = 'load';
document.body.fireEvent('onload',event);
больше нет ошибки, но прослушиватель для "onload" не срабатывает. Вот как я его настроил:
document.attachEvent('onload',listener);
3 ответов
по данным эта страница в MSDN нет onload
событие document
.
вы хотите либо window.onload
или document.body.onload
. Они идентичны в IE: по историческим причинам,<body onload="...">
фактически window.onload
, поэтому MS решила сделать document.body.onload
псевдоним window.onload
.
проблема с этим заключается в том, - как Эрик упомянул в комментариях, - что, похоже, нет способа вручную запускать события окна, что означает, что не может быть решения для Эрика проблема.
по какой-то причине кажется, что IE переопределяет onload
собственность window
С пустым объектом после загрузки DOM. По крайней мере, это тот случай, когда вы пытаетесь получить к нему доступ из любого обработчика событий элемента 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>
в этой ситуации, вы увидите, что окно.onload распознается как функция изначально, затем вы видите предупреждение "Test". Когда вы нажмете на заголовок, вы увидите это окно.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>
Я не могу придумать другого способа решить эту проблему прямо сейчас.
событие load запускается, когда документ (включая внешние ресурсы, такие как изображения) полностью загружен, а не раньше.
какие результаты вы получаете от ваших попыток огонь readystatechange
? Делает readyState
значение вообще меняется? Независимо от того, является ли это не очень полезным: либо вы запускаете событие с readyState
ничего не изменилось, или вы делаете это с readyState
это недопустимое отражение состояния документа.