Обнаружение причины сбоя в работе IE - PullRequest
6 голосов
/ 23 апреля 2009

Мой сайт страдает от ошибки Операция прервана . То, что я нахожу странным, - то, что в моем случае ошибка только иногда случается. В течение трех месяцев сайт работал нормально, но сегодня это происходит, но не каждый раз.

Страница, на которой это происходит, довольно большая, с большим количеством сторонних элементов управления. Что я хотел бы, это инструмент, который может точно определить, где происходит сбой. Похоже, лучшее, что я могу сделать, - это найти первую ошибку JavaScript, которая возникает после прекращения операции; Однако это не очень помогает. Этот сбой вызван тем, что элемент dom недоступен, чего я и ожидал, поскольку IE прекратил анализ HTML.

У кого-нибудь есть идеи или хитрости, чтобы сузить это?

Редактировать

Я ценю дополнительные способы решения проблемы; Тем не менее, я ищу способ определить, какой скрипт вызывает проблему.

Окончательное редактирование

После перехода на IE8 я смог определить причину - всплывающее диалоговое окно модального набора AjaxControl Toolkit. Не было никакого конкретного способа определить это, что разочаровывает, но отладчик позволил мне увидеть, где он терпел неудачу, что было очень последовательным. Поскольку в элементе управления нет способа сообщить ему о необходимости перенести инициализацию, я отключил его, и у меня есть скрипт для создания клиентского элемента управления в обработчике событий загрузки моего документа.

Эта проблема не является ошибкой элемента управления, она возникла потому, что содержимое всплывающего окна фактически находится во второй форме. Честно говоря, я удивлен, что это сработало.

Ответы [ 6 ]

3 голосов
/ 21 апреля 2010

Вы можете использовать скрипт, предоставленный IE Blog, для исследования проблемы. Смотри: http://blogs.msdn.com/ie/archive/2009/09/03/preventing-operation-aborted-scenarios.aspx

3 голосов
/ 23 апреля 2009

Есть ли у вас какой-либо javascript, который манипулирует DOM, как описано в http://support.microsoft.com/kb/927917#more_information?

Попробуйте переместить все блоки скриптов в самый конец страницы, непосредственно перед тегом </body>, и не пытайтесь установить свойство innerHTML самого тега body.

Если проблема в том, что javascript выполняется до полной сборки DOM, попробуйте переместить все вызовы инициализации в функцию, которая будет выполняться только после полной загрузки страницы. Итак, вместо чего-то вроде этого:

<div class="myWidgetControl"/>
<script type="text/javascript">
  initializeWidgets();
</script>

Попробуйте что-то вроде этого:

<div class="myWidgetControl"/>
<script type="text/javascript">
  $(document).ready(
    function () { initializeWidgets(); }
  );
</script>
1 голос
/ 31 января 2013

в большинстве случаев это проблема DOM в JS.

$( element ).append( someHtml );

, поэтому в IE вы можете добавлять контент к объекту, только если у него есть закрывающий тег

Например, приведенный ниже код приведет к тому, что IE7 выведет сообщение «Операция прервана»

<div id="o">

...
$(o).appendChild();
...

</div>

И правильный путь

<div id="o">

...

</div>

$(o).appendChild();
1 голос
/ 23 апреля 2009

Это хитрый прием, который я использовал (основываясь на ссылке в комментариях JS ниже), который полностью исключает ошибку Op Ab, не влияя на производительность в других браузерах. Сначала вы оборачиваете любой скрипт, который вы делаете, который может вызвать ошибку (например, загрузку / создание стороннего виджета) в функции, затем вызываете эту функцию в функции delayExecutionForIE - обратите внимание, что вызов myFunction там дважды, один раз для IE и один раз для хороших браузеров.

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

function delayExecutionForIE() {
      if ( typeof document.all == "object" && 
           (document.readyState != "loaded" 
           && document.readyState != "complete") 
         ) {
            try {
                  //If IE is used, use the trick by Diego Perini
                  //http://javascript.nwbox.com/IEContentLoaded/
                  document.documentElement.doScroll("left");
                  myFunction();
            } catch(error) {
                  setTimeout(delayExecutionForIE, 200);
            }
      } else {
            myFunction();
      }
}

function myFunction() {
    //this is your function that manipulates the DOM
}

delayExecutionForIE();
0 голосов
/ 23 апреля 2009

А Microsoft рекомендует обновить до IE8!

0 голосов
/ 23 апреля 2009

Хотя IE8 больше не будет приводить к тому, что эта ошибка полностью «рушит» рендеринг, вместо этого она регистрирует ошибку, но, к сожалению, она не перехватывается отладчиком JavaScript, найденным в новых инструментах разработчика, и сообщение об ошибке не говорит вам, где ошибка действительно произошла.

Обходной путь, который, безусловно, утомителен, но может решить проблему, заключается в том, чтобы использовать отладчик IE8 для установки точки останова на самом первом выполняемом фрагменте кода JavaScript, а затем продолжать нажимать кнопку «Шаг» до появления ошибки. значок появляется в левом нижнем углу браузера. Когда это происходит, вы знаете, что строка кода, которая вызывает ошибку, была выделена непосредственно перед тем, как вы щелкнули по шагу. Вероятно, это будет довольно много кода, через который вы будете проходить, но я не могу думать ни о чем другом (ну, кроме как связаться с поставщиками этого стороннего кода и посмотреть, есть ли у них какие-либо обновления, которые могут быть связаны ).

Конечно, вы можете просто сказать своим пользователям перейти на IE8. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...