Можно ли отлаживать динамическую загрузку JavaScript с помощью некоторых отладчиков, таких как WebKit, FireBug или IE8 Developer Tool?
из моего недавнего вопроса я уже создал некоторую функцию JavaScript для динамической загрузки частичного представления. Итак, я не могу отлаживать динамическую загрузку JavaScript. Потому что весь загруженный JavaScript будет оцениваться функцией "eval".
тем не менее, я нашел способ создать новый JavaScript, используя следующий скрипт для динамического создания скрипта в заголовке текущего документа. Все загруженные скрипты будут отображаться в HTML DOM (что вы можете использовать любой отладчик, чтобы найти он.)
var script = document.createElement('script')
script.setAttribute("type","text/javascript")
script.text = "alert('Test!');";
document.getElementsByTagName('head')[0].appendChild(script);
кстати, большинство отладчиков (IE8 Developer Toolbar, Firebug и Google Chrome) не могут установить точку останова в любом динамическом скрипте. Потому что отладочный скрипт должен быть загружен в первый раз после загрузки страницы.
есть ли у вас идея для отладки в динамическом содержимом скрипта или файла?
обновление 1 - Добавить исходный код для тестирования
вы можете использовать следующий файл xhtml для отладки someVariable значение.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dynamic Loading Script Testing</title>
<script type="text/javascript">
function page_load()
{
var script = document.createElement('script')
script.setAttribute("id", "dynamicLoadingScript");
script.setAttribute("type","text/javascript");
script.text = "var someVariable = 0;n" +
"someVariable = window.outerWidth;n" +
"alert(someVariable);";
document.getElementsByTagName('head')[0].appendChild(script);
}
</script>
</head>
<body onload="page_load();">
</body>
</html>
из ответа, я просто проверить его в FireBug. Результат должен отображаться, как показано ниже изображений.
пожалуйста, посмотрите на сценарий "dynamicLoadingScript", который добавляется после загрузки страницы.
но он не найден на вкладке скрипта FireBug
обновление 2-Создание точки останова отладки в динамическом скрипте загрузки
оба вышеприведенных изображения показывают вставку оператора" debugger; " в некоторой строке скрипта может сработать точка останова динамическая загрузка скрипта. Однако оба отладчика не показывают никакого кода в точке останова. Поэтому делать это бесполезно.
спасибо,
12 ответов:
также можно было бы использовать chrome для того же. В Chrome есть функция, в которой вы можете указать атрибут parser и сделать часть динамического JS в виде файла, который затем можно просмотреть и установить точки останова.
атрибут, который должен быть установлен
//# sourceURL=dynamicScript.js
где dynamicScript.js-это имя файла, который должен отображаться в браузере файлов сценариев.
дополнительная информация здесь
пол ирландских и говорит об этом кратко в своем превосходном выступлении на Инструменты И Стек Разработки Webapp
попробуйте добавить оператор "debugger;" в javascript, который вы добавляете динамически. Это должно заставить его остановиться на этой линии независимо от настроек точки останова.
Я использую google chrome для этой цели.
в chrome на вкладке скрипты вы можете включить "пауза на все исключения"
а потом поставить где-то в строке кода
try{throw ''} catch(e){}
. Chrome остановит выполнение, когда он достигнет этой строки.EDIT: измененное изображение, так что было бы яснее, о чем я говорю.
Да ,это (теперь) можно отлаживать динамически загруженный JavaScript с помощью Google Chrome!
нет необходимости добавлять дополнительные
debugger;
или любой другой атрибут для динамически загружаемых JS файл. Просто выполните следующие действия для отладки:Способ 1:
мой технический лидер только что показал супер-простой способ отладки динамически загружаемых методов Javascript.
- Откройте консоль chrome и напишите имя метод и нажмите enter.
В моем случае этоGetAdvancedSearchConditonRowNew
Если метод JS загружен, то он покажет определение метода.
- нажмите на определение метода и весь JS файл будет открыт для отладки :)
Способ 2:
в качестве примера, Я загружаю JS файл, когда я нажимаю на кнопку с помощью
ajax
звонок.
- открыть
network
вкладка в Google chrome dev tools- нажмите на элемент управления (например. кнопка), которая загружает некоторый файл javascript и вызывает некоторую функцию javascript.
- обратите внимание на вкладку network и найдите эту функцию JS (в моем случае это
RetrieveAllTags?_=1451974716935
)- наведите курсор на ее
initiater
и вы найдете свой динамически загруженный JS-файл(с префиксомVM*
).
- нажать на открыть.
- поместите отладчик куда угодно в этот файл: D
Я думаю, вам может понадобиться дать eval'D код "имя", как это:
http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
Если вы это сделаете, я думаю, что это скорее
debugger
подход "обновление 2" должен работать тогда.
обновление: синтаксис для sourceUrl был изменен (@заменен на#), чтобы избежать ошибки в неподдерживаемых браузерах (читай: IE). подробности
использование Chrome (12.0.742.112) с кодом, который вы предоставили плюс оператор отладчика, как это
script.text = "debugger;var someVariable = 0;\n" + "someVariable = window.outerWidth;\n" + "alert(someVariable);";
работает для меня.
мне нужно изменить некоторый JavaScript (ограничивая область действия всего селектора jQuery текущим частичным >view div) перед его выполнением.
может ли его более ощутимым, если вы привязываете изменение селектора к событию на вашем частичном представлении вместо создания элементов скрипта в теле html ( не чувствует право.)
вы могли бы сделать что-то подобное
(function(j)( var limiting_selector = ''; j(".partial_views").bind('focusin over',function(e){ limiting_selector = j(this).attr('someattr') // or j(this).data('limiting-selector') }).bind('focusout out',function(e){ limiting_selector = ''; }); // And then go on with // j(limiting_selector+' .someclass') ))(jQuery)
этот код всегда добавлял бы ограничивающий селектор ко всем операциям выбора jQuery, выполняемым, пока мышь находится в определенном элементе, учитывая, что HTML не испорчен.
(все еще кажется хакерским, может быть у кого-то есть лучшее решение)
ура
в Firebug, вы должны быть в состоянии видеть, что сценарий после загрузки страницы и сценарий вводится. Когда вы это сделаете, вы можете установить точку останова в соответствующем месте, и она будет сохранена при обновлении страницы.
динамично загруженный Javascript по-прежнему должен быть проанализирован браузером это где WebKit, или FireBug debugger sat так что он подчиняется отладчику независимо от того, что, я думаю, это то же самое для инструментов разработчика в IE8,
таким образом, ваш код подлежит отладчику, так что где ваша проблема не будет в этом файле или тексте, если он не ошибается
другое дело
script.text = "alert('Test!');";
не действует, поэтому он не будет работать во всех браузерах, что вы хотитеscript.innerHTML = "alert('Test!');";
несмотря на то, что его innerHTML это означает, что код внутри HTML-тегов не HTML внутри просто большинство людей используют его для этого, поэтому он объясняется неправильно
ОТРЕДАКТИРОВАНО ДЛЯ ОБНОВЛЕНИЯ ДВА
и на втором обновлении с помощью Chrome я сделал это
перейти к about: пустой Откройте консоль вверх и мимо в
var script = document.createElement('script') script.setAttribute("type","text/javascript") script.innerHTML = "alert('Test!');debugger;"; document.getElementsByTagName('head')[0].appendChild(script);
затем он сломается и откроет вкладку скрипта с about: blank shown (ничего не видно)
затем справа стороны показывают список стека вызовов, а затем нажмите на второй (анонимная функция), и он покажет вам.
Итак, в вашем файле у вас будет (анонимная функция), которая является кодом, который вы запускаете, и вы увидите точку останова там. так что вы знаете, что ваш в правильном.
используя Google Chrome (или сафари) инструмент разработчиков, вы можете запустить JavaScript строка за строкой.
Инструмент Разработчика>
Скрипты>
выберите, какой скрипт вы хотите отладить>
знак паузы на правой стороне Или установите точки останова, щелкнув номер строки
один вариант я хотел бы использовать его добавление консоли.оператор log (") в моем коде. Как только этот оператор появляется в консоли, с ним связывается номер строки. Вы можете щелкнуть этот номер, чтобы перейти к местоположению в источнике и установить точку останова. Недостатком этого подхода является то, что точки останова не сохраняются при перезагрузке страницы, и перед добавлением отладчика необходимо выполнить весь код.
для текущего браузера Google Chrome или других современных браузеров вы можете легко найти любой оцененный код с помощью инструмента разработчика, такого как следующие изображения.
- имитация некоторого динамического файла загрузки.
- пресс Ctrl + Shift+F на источник вкладка и поиск вышеуказанной функции.
создать некоторую точку останова и выполнить функцию, чтобы проверить его.