Как запустить событие" 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 это недопустимое отражение состояния документа.