Можно ли отлаживать динамическую загрузку 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. Результат должен отображаться, как показано ниже изображений.

alt текст http://d7cgnq.bay.livefilestore.com/y1pJGV27qEARXzZhsMMhPD5z0OxAtnkQK8eKeEXMAxuHjsuWeAq1aGl7sTISRNqVv3lw8ghyxE_GorlwSJDvTql0m0ugSGXPaY-/undebugable-firebug-html.PNG

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

alt-текст http://d7cgnq.bay.livefilestore.com/y1pz_RwqjgeVqe2mAlUZha0PalpPdP0X5AiwJcQhYahERlnbPDdZpb-_d1e96Q-14raSDMJOBsdcV9jsi4B5yCUDqm41Wc3h0yk/undebugable-firebug-script.PNG

но он не найден на вкладке скрипта FireBug

обновление 2-Создание точки останова отладки в динамическом скрипте загрузки

alt-текст http://d7cgnq.bay.livefilestore.com/y1peKdIMOztXss-pc8PlJEmaGov_0ShYnLsuDdK5OLETbCG0UpkX6Te29w0YW2pNKaD_0ANAiizh2GdGPAAp_1q0JWAETo4Qoiw/Debugger-VS2010.png

alt текст http://d7cgnq.bay.livefilestore.com/y1pUeHaHoTXj0WBl74fnTrXwdr_y7s7h8jNKfslSONgshzZBpUddGHNBWA9cXRabo3HAl3QazeozrCABo7pNVQc1Acl-UXXbHFE/Debugger-GoogleChrome.png

оба вышеприведенных изображения показывают вставку оператора" debugger; " в некоторой строке скрипта может сработать точка останова динамическая загрузка скрипта. Однако оба отладчика не показывают никакого кода в точке останова. Поэтому делать это бесполезно.

спасибо,

12 88

12 ответов:

также можно было бы использовать chrome для того же. В Chrome есть функция, в которой вы можете указать атрибут parser и сделать часть динамического JS в виде файла, который затем можно просмотреть и установить точки останова.

атрибут, который должен быть установлен

//# sourceURL=dynamicScript.js

где dynamicScript.js-это имя файла, который должен отображаться в браузере файлов сценариев.

дополнительная информация здесь

пол ирландских и говорит об этом кратко в своем превосходном выступлении на Инструменты И Стек Разработки Webapp

попробуйте добавить оператор "debugger;" в javascript, который вы добавляете динамически. Это должно заставить его остановиться на этой линии независимо от настроек точки останова.

Я использую google chrome для этой цели.

в chrome на вкладке скрипты вы можете включить "пауза на все исключения"

enter image description here

а потом поставить где-то в строке кода try{throw ''} catch(e){}. Chrome остановит выполнение, когда он достигнет этой строки.

EDIT: измененное изображение, так что было бы яснее, о чем я говорю.

Да ,это (теперь) можно отлаживать динамически загруженный JavaScript с помощью Google Chrome!

нет необходимости добавлять дополнительные debugger; или любой другой атрибут для динамически загружаемых JS файл. Просто выполните следующие действия для отладки:

Способ 1:

мой технический лидер только что показал супер-простой способ отладки динамически загружаемых методов Javascript.

  1. Откройте консоль chrome и напишите имя метод и нажмите enter.
    В моем случае это GetAdvancedSearchConditonRowNew
    Если метод JS загружен, то он покажет определение метода.

enter image description here


  1. нажмите на определение метода и весь JS файл будет открыт для отладки :)

enter image description here


Способ 2:

в качестве примера, Я загружаю JS файл, когда я нажимаю на кнопку с помощью ajaxзвонок.

  1. открыть network вкладка в Google chrome dev tools
  2. нажмите на элемент управления (например. кнопка), которая загружает некоторый файл javascript и вызывает некоторую функцию javascript.
  3. обратите внимание на вкладку network и найдите эту функцию JS (в моем случае это RetrieveAllTags?_=1451974716935)
  4. наведите курсор на ее initiater и вы найдете свой динамически загруженный JS-файл(с префиксом VM*).

debug dynamic loading JavaScript in chrome -1


  1. нажать на открыть.
  2. поместите отладчик куда угодно в этот файл: D

debug dynamic loading JavaScript in chrome -1


Я думаю, вам может понадобиться дать 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);";

chrome_debugger

работает для меня.

мне нужно изменить некоторый 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 или других современных браузеров вы можете легко найти любой оцененный код с помощью инструмента разработчика, такого как следующие изображения.

  1. имитация некоторого динамического файла загрузки.

enter image description here

  1. пресс Ctrl + Shift+F на источник вкладка и поиск вышеуказанной функции.

enter image description here

создать некоторую точку останова и выполнить функцию, чтобы проверить его.

enter image description here