Internet Explorer… Не удалось открыть узел. Операция прервана.

Все веб-разработчики прекрасно знают на собственном опыте, каким непредсказуемым бывает IE в разнообразных ситуациях, имея на все собственное мнение, которое, как известно, хрен оспоришь. И, казалось бы, ничто уже не может удивить.

Однако ж нет, может! 🙂

В одном из проектов была замечена удивительная странность: периодически в IE при загрузке некоторых страниц сайта вдруг вылетало сообщение «Не удалось открыть узел http://www.example.com/. Операция прервана» или «Internet Explorer cannot open the Internet site http://www.example.com. Operation aborted». Причем ошибка возникала только в IE, в других браузерах страницы загружались идеально.

При нажатии на кнопку OK часть загруженной страницы закрывалась (да, при этом IE иногда успевал отобразить часть страницы) и замещалась стандартной страницей ошибки «Невозможно отобразить страницу»/»Internet Explorer cannot display the webpage».

What the fuck?! — подумал я. Что за непонятная ерунда и как от нее избавиться? Ведь страница закрывается раньше, чем можно отследить вообще что-нибудь. Пришлось обратиться в Google. Как обычно, я оказался не одинок в своих бедах с IE. После нескольких испытаний наконец-то была определена причина ошибки и найдено ее решение.

Итак, вся проблема была в том, что IE очень не любит JS-скрипты, которые пытаются добавить элементы в существующую структуру DOM. И это часто может приводить к отключению системы обработки скриптов и полной отмене рендеринга страницы в IE.

Ниже рабочий пример закодированной страницы, которая заставляет IE падать с такой же ошибкой:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
 <head>
  <title>Internet Explorer: Operation Aborted. Sample error.</title>
 </head>
 <body>
  <table>
    <script>
     document.body.appendChild(document.createElement('div'))
      </script>
    </table>
  </body>
 </html>

Одно из наиболее простых решений — дождаться, пока структура DOM будет полностью обработана в браузере. Для этого можно использовать событие window.onload. Многие Javascript фреймворки имеют собственные реализации этого события, например, в JQuery есть собственное событие $(document).ready. Кстати, именно это событие при использовании JQuery забыли предыдущие разработчики проекта, в котором мне довелось поучаствовать.

Ниже пример решения с использованием события window.onload:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
 <html>
 <head>
   <title>Internet Explorer: Operation Aborted. Sample solution.</title>
   </head>    <body>
   <ul>
      <script>
       window.onload = function(){
        document.body.appendChild(document.createElement('div'))
      }
  </script>
  </ul>
 </body>
 </html>

Таким образом, создаем обертку и ждем полной загрузки страницы перед запуском скриптов.

P.S.: IE8 уже не умирает, однако выдает ошибку в JS коде.

P.P.S.: Кто-нибудь знает, почему может не работать плагин для подсветки кода в WP? Я пытался использовать плагин WP-Syntax (http://wordpress.org/extend/plugins/wp-syntax/), однако даже просто при переходе из HTML редактора в визуальный редактор теряется большая часть кода. И даже если сохраниться при работе с HTML кодом — при выводе какая-то ерунда получается. Видимо, в WP стоит какой-то дополнительный фильтр HTML кода, но я не слишком хорошо знаю WP, чтобы от этого избавиться.

P.P.S.2: Уважаемые посетители блога и конкретно данной страницы — прошу принять во внимание, что данное решение подходит для веб-разработчиков и только для них. Я не в состоянии (да и не хочу) определять, почему лично у Вас не загружается какой-либо сайт, даже если он выдает такое же сообщение. Благодарю за понимание.


99 комментариев

So, what do you think ?