window.onload () не запускается с IE 8 в первом кадре - PullRequest
26 голосов
/ 20 мая 2009

Я пытаюсь заставить мои страницы корректно работать с IE 8, я узнал отсюда: http://www.masykur.web.id/post/How-to-Make-Our-Website-to-be-Ready-for-IE8.aspx что моя страница должна быть совместимой с XHTML 1.0 и по крайней мере совместимой с CSS 2.1, я сделал свою страницу и совместимую с CSS только с несколькими предупреждениями, но все же window.onload () не запускается Кто-нибудь сталкивался с этой проблемой?

вот фрагмент кода:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=8"/>
        <title>Testing</title>
        <link rel="stylesheet" href="test.css" type="text/css"></link>
        <script type="text/javascript" src="login.js"></script>
        <script type="text/javascript" src="common.js"></script>
        <script type="text/javascript">
            window.onload = function()
            {
                          // Not coming here at all on first shot   
            }
        </script>
    </head>
    <body>
     .
     .
     .

Однако обновление страницы, кажется, заставляет его работать.

Я что-то здесь упускаю?

UPDATE:

Одна из надстроек IE создала эту проблему после отключения его нормально работающего. Спасибо за ваше время и ответы :)

Ответы [ 9 ]

27 голосов
/ 14 июля 2010

Для IE попробуйте:

window.onload = new function() { alert('hello');};
9 голосов
/ 01 апреля 2011

Это довольно старая тема, но я нашел решение, которое могло бы помочь другим.

Я добавлял функцию к window.onload через динамически внедренный скрипт (действительно, чтобы имитировать загрузку внешнего скрипта по причинам, которые не важны в этом контексте). Как указано в этом посте, при первой загрузке в IE8 window.onload не будет запускаться, но будут выполняться все последующие вызовы.

Я обнаружил, что если я добавлю это в HTML-файл как внутренний скрипт, он будет работать каждый раз:

var windowOnload = window.onload || function() {};
window.onload = function() { windowOnload(); };

Весь приведенный выше код незаметно "инициализирует" IE8 window.onload. Я подозреваю, что IE8 не может вызвать window.onload в первый раз, если он вызывается из внешнего скрипта, так как событие onload еще не прикреплено к окну (или, с технической точки зрения, его typeof не определен). Похоже, что впервые IE8 делает это: присоединение onload к окну без его правильного выполнения.

Приведенный выше код становится вполне очевидным: мы просто заставляем IE8 распознать событие onload. Нам не важно, что выполняется, а что нет, поэтому мы просто следим за передачей через любой существующий код window.onload, который уже определен (просто в качестве меры предосторожности).

Важно иметь это как внутренний скрипт для HTML (по крайней мере, из моего тестирования).

Ваш HTML будет выглядеть примерно так (соответствующие части):

 <script type="text/javascript">
  var windowOnload=window.onload||function(){};window.onload=function(){windowOnload();};
 </script>
 <script type="text/javascript" src="script.js">
 </script>

Из моего тестирования, после очистки кэша и перезагрузки страницы, я получил window.onload, чтобы каждый раз успешно срабатывать.

Надеюсь, это поможет.

3 голосов
/ 20 мая 2009

У меня нет IE8 для личного тестирования, но что делает этот тест?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test IE 8</title>
<script type="text/javascript">
/* <![CDATA[ */
window.onload = function(){alert('Good morning!');}
/* ]]> */
</script>
</head>
<body>
<h1>Hello</h1>
<body>
</html>

Если этот тест работает должным образом, попробуйте бит CDATA вокруг вашего внутреннего блока JavaScript.

И затем, если это не работает должным образом, возможно, во внешнем JavaScript выше есть что-то, что препятствует запуску вашей загрузки. Предыдущий плакат упоминал об этом. В этот момент попробуйте консоль ошибок или отладчик, чтобы указать путь.

3 голосов
/ 20 мая 2009

У вас может быть ошибка в JavaScript, если это произойдет, любой JavaScript после этого не будет работать правильно.

Попробуйте удалить ссылку на login.js и common.js и попробуйте создать предупреждение в вашей проблемной функции.

1 голос
/ 20 мая 2009

onload срабатывает после загрузки ВСЕГО вашего контента (включая внешние изображения и т. Д.). Возможно, эти ресурсы загружаются с первого раза (до того, как они будут кэшированы). Другая возможность - ошибка в вашем коде, которая влияет только на IE, так как останавливает ваши сценарии (но только первый раз нечетен).

0 голосов
/ 28 октября 2013

Старый вопрос, но у меня была та же проблема, но это оказалось другой проблемой. Моя проблема была в том, что я сделал <script type="application/javascript">, который <IE9 не понимает или даже пытается запустить. Чтобы он работал в старых браузерах, вам все равно придется использовать text/javascript, хотя это технически неправильный тип ...

0 голосов
/ 16 ноября 2012

Я знаю, что это довольно старый вопрос, но я столкнулся с тем же.

 window.onload=function() { alert('hello');};

трактуется иначе, чем

 window.onload= new function() { alert('hello');};

Ключевое слово здесь new.

Мой JS завершал работу всякий раз, когда достигал (onload =) части, пока я не добавил слово «new» перед «function». Несмотря на то, что он работал нормально без «нового» на моем локальном хосте, но как только я разместил его в сети, он не будет работать, пока я не добавлю «новый».

0 голосов
/ 20 мая 2009

Следующий код работает для меня. Когда я загружаю страницу в Firefox, я сразу вижу предупреждение. Когда я впервые загружаю страницу в IE 8, она предупреждает меня об активном контенте. Если я разрешаю заблокированный контент, он просит меня подтвердить, что я и делаю. Тогда предупреждение появляется, как и ожидалось. Если это не работает для вас, попробуйте IE 8 на другом компьютере или начните удалять код на своей странице, чтобы проверить ошибки. Вы можете выполнить бинарный поиск: закомментируйте первую половину страницы и посмотрите, появляется ли предупреждение; если этого не произойдет, раскомментируйте первую половину и закомментируйте вторую. Повторите по мере необходимости, пока вы не сузили его до оскорбительного кода. Кстати, вам не нужен XHTML для соответствия IE8. HTML отлично работает и на самом деле имеет некоторые преимущества.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=8"/>
    <title></title>
    <style type="text/css">
    </style>
    <script type="text/javascript">
    window.onload=function() { alert('hello');};
    </script>
  </head>
  <body>
  </body>
</html>
0 голосов
/ 20 мая 2009

Если вы получаете разные результаты с использованием Apache и другого веб-сервера (IIS?) И сравниваете конечный результат с помощью IE8, то разница должна быть в отправляемом заголовке типа контента. Получите утилиту wget для вашей платформы и посмотрите, какие заголовки создаются. Если вы работаете в Windows, то Portable GUI версия графического интерфейса пользователя wget довольно хороша.

...