Как приостановить выполнение JavaScript в Internet Explorer? - программирование

Как приостановить выполнение JavaScript в Internet Explorer?

У меня есть следующий сценарий:

  • Главная страница
  • Вложенная страница
  • Общий JS файл (который включен в обе страницы)

Вложенная страница затем загружается в iframe главной страницы. Обе страницы ссылаются на функцию из общего JS файла при загрузке страницы.

Живая демонстрация:
http://www.ecmazing.com/misc/pause-execution/mainpage.html
http://www.ecmazing.com/misc/pause-execution/nestedpage.html
http://www.ecmazing.com/misc/pause-execution/common.js

Общий JS файл содержит одну глобальную функцию, которая окрашивает элемент H1 в красный цвет. Я хотел бы приостановить выполнение в начале этой функции, так что выполнение приостанавливается, пока элемент H1 все еще черный.

Как это сделать на главной странице:

Это тривиально. Просто загрузите страницу, откройте инструменты разработчика браузера, выберите файл common.js и установите точку прерывания в первой строке функции. Теперь перезагрузить страницу. Точка прерывания будет упорствовать перезагрузкой, и выполнение будет приостановлено.

Как сделать это на вложенной странице:

Теперь, в Chrome и Firefox (Firebug), точка останова, которая была установлена ​​выше (для главной страницы), также будет работать для вложенной страницы. Обе страницы используют один и тот же JS файл, и установка точки останова в этом файле будет применяться для обеих страниц автоматически. К сожалению, это правило не относится к IE.

И что еще хуже, даже если я установил точку прерывания впоследствии, а затем перезагрузить iframe только, точка останова будет не.

Итак, я не знаю, как приостановить выполнение для вложенной страницы в IE. Это можно сделать? (Я имею дело с этим, вручную установив debugger; в начале функции, но мне бы хотелось, чтобы это было возможно установить точку прерывания через инструменты dev в IE, если это возможно.)

4b9b3361

Ответ 1

Ближе всего я могу прийти к решению - установить точку останова в функции loadIFrame() на главной странице, а затем "наступить", пока не будет загружен файл вложенной страницы Common.js. В более сложном примере вы могли бы установить свои контрольные точки в новом файле Common.js, и они будут работать правильно до следующего раза, когда будет загружен iframe, когда все они будут потеряны снова.

Ответ 2

У меня нет IE9 для тестирования, но, возможно, вы можете рассматривать файл common.js как отдельный актив для страницы iframe? Я считаю, что он работает в других браузерах, так как эти файлы должны быть отмечены или помечены браузером как-то.

Примером является добавление ?iframePage в конец common.js на странице iframe. По крайней мере, в Firefox показан актив, загруженный как common.js?iframePage. Все, что прошло после строки запроса, игнорируется браузером, но в противном случае JavaScript загружается с этим точным именем.

Другой пример - сделать копию common.js и переименовать ее в commonClone.js, который затем используется для страницы iframe.

Любой пример может позволить вам установить точку останова дважды в IE9, по одному для каждого актива.

Тем не менее, вам нечего мешать создавать iframe только точки останова, которые не зависят от файла common.js, который использует родительская страница. Этот метод позволяет звонить это параллельная точка прерывания, позволяет асинхронную отладку JavaScript, поскольку страница iframe и родительская страница обрабатывают JavaScript самостоятельно, но могут работать в тандем.

Ссылка на этот метод из официального источника Библиотека MSDN: Использование инструментов разработчика F12 для отладки ошибок JavaScript Управление точками останова, который показывает, как выполнять точки останова в нескольких файлах JavaScript.

Согласно недавнему сообщению форума на Форуме разработчиков IE9, решение предотвратить перезагрузку файлов JavaScript при использовании для отладки - использовать встроенный обработчик событий вместо attachEvent, как показано в этом примере:

replace (or comment it out)

$(document).onload(function(){ mycustomonload functions});

with

<body onload="mycustomonload functions">

Ответ 3

Если вы делаете это исключительно для тестирования совместимости, попробовали ли вы использовать плагин IETab для Chrome?

Это эмулирует механизм рендеринга IE, позволяя вам использовать отладчик Chrome.

Если это не достаточно хорошо, я думаю, что вы зашли в тупик, инструменты IE dev просто недостаточно сложны.

Ответ 4

Возможно, если бы вы могли реструктурировать свой код HTML и JavaScript, вы можете ссылаться только на common.js на родительскую страницу и сделать как основную, так и вложенную страницу той же функцией JavaScript.

Таким образом, одна точка останова будет удовлетворять обоим сценариям.

Ответ 5

Чтобы отлаживать iframes в IE и иметь возможность устанавливать и сохранять точки останова, вы можете открыть адрес iframe в своем собственном ie tab/window. Однако это невозможно/просто, если iframe связывается со своим родителем.

Ответ 6

Надеюсь, вы хотя бы используете IE Debuggy Bar. Обновите файл common.js с помощью этого кода

function func () {
    if(typeof window.parent.debug !== "undefined"){
        window.parent.debug();
    }
    document.getElementsByTagName( 'h1')[0].style.color = 'red';
}


function debug(){
    var a = "break here";
}

установите точку останова на var a = "break here"; после загрузки главной страницы. Когда вы нажмете кнопку Load iframe, js остановится на этой строке. Используйте стек вызовов, чтобы перейти к предыдущей инструкции (строке) javascript, которая должна быть в файле common.js в файле nestedpage.html. Теперь установите другую точку останова, где бы вы ни захотели, и нажмите "Продолжить" в отладчике, или используйте функцию STEP

== UPDATE ===

Кстати, чтобы ответить на ваш вопрос, почему точка останова не может быть сохранена в iframe, подумайте об этом. Каждый раз, когда вы нажимаете кнопку "Загрузить IFrame", старый экземпляр объекта window размещается в памяти, а вместе с ним все точки останова и новый создается с помощью нового экземпляра common.js. То же самое произойдет, если вы назовете windows.open("http://......");

Также помните, что у вас есть один и тот же файл, загруженный в оба window(s), он загружается в два разных кадра исполнения в браузере. вы можете запускать два экземпляра браузера одного и того же браузера, но они не показывают одну и ту же страницу в окне. Tho, есть общие вещи, такие как файлы cookie, но это выходит за рамки этой темы.

Ответ 7

вы можете использовать setTimeout() для паузы javascript для суточного времени...