0

При динамическом создании элемента сценария и добавлении его на страницу мои ошибки не дают мне номера строк в скрипте, а вместо номера строки, где я добавляю скрипт.Как я могу получить номер строки ошибки в динамически добавленном теге <script>?

Код ниже, когда в .js-файле будет отображаться ошибка номера строки в зависимости от того, какая строка document.appendChild(script) включена. Фрагмент кода, если он запущен, вернет правильный номер строки. Как они это делают?

var script = document.createElement("script"); 
 
script.innerHTML = "\n\n\n\n\n\n\nfoo.bar"; //error should be on line 8 
 

 
document.head.appendChild(script)

+0

http://meta.stackoverflow.com/questions/336082/the-searchbar-works-better-with-tags-than-questions-explaining-this-could-reduc?noredirect1_comment403450_336082 –

+0

что-то пришло в боковой панели http://stackoverflow.com/questions/20838067/catch-js-errors-when-adding-a-script-dynamically?rq=1 –

+0

предыдущий вопрос вдохновил ответ на этот вопрос, хотя он не действительно показать это. –

ответ

0

Got it. Добавление попытке поймать вокруг кода работает большой

catchableScript = function(scriptText) { 
    var scriptText = "try {\n"+scriptText+"\n} \n catch(ex){console.log(ex.lineNumber-1)}"; 

    var script = document.createElement("script"); 
    script.innerHTML = scriptText; 

    document.head.appendChild(script) 

} 

catchableScript("\n\n\n\n\n\n\nfoo.bar"); 

Выход: 8

Кроме того, исключение содержит больше информации, которая полезна, но это и есть ответ на вопрос.

EDIT:

Для тех, кто хочет его, добавив этот код:

window.CURRENTLY_EVALED_SCRIPT = scriptText; 
var scriptText = "try {\n"+scriptText 
    +"\n} catch(ex){\n" 
    +"var lineNumber = ex.lineNumber-1;\n" 
    +"var errorOut = {};\n" 
    +"errorOut.exception = ex;\n" 
    +"errorOut.lines = window.CURRENTLY_EVALED_SCRIPT.split('\\n');\n" 
    +"var line = errorOut.lines[lineNumber-1];\n" 
    +"console.log(ex.message+' on line\\n'+line+' :: '+lineNumber, window.CURRENTLY_EVALED_SCRIPT_ELEMENT, errorOut);\n" 
      +"}"; 

    ... 

window.CURRENTLY_EVALED_SCRIPT_ELEMENT = script 

приведет к этому выходу в консоли:

foo is not defined on line 
foo.bar :: 8, <script>, Object { exception: ReferenceError, lines: Array[8] } 

И вы можете нажать <script>, чтобы перейти к или lines, чтобы увидеть массив всех строк.

Работает как очарование.

-1

Когда вы говорите "номер строки", вы, вероятно, означает номер строки файла. Но в этом случае, какой файл? Вы создаете сценарий динамически, так что на самом деле его нет.

Сценарий, который вы создаете, живет только в DOM, то есть в представлении вашего кода в памяти. Кажется, он ведет себя так, как я ожидал.

+0

Я так полагаю, но вы можете получить linenumber из eval, если поймаете ошибку. Я в настоящее время проверяю, могу ли я использовать окно ... onerror, чтобы поймать его, а затем получить номер строки –

+0

nope. window.onerror вызывает только строку, являющуюся ошибкой –

 Смежные вопросы

  • Нет связанных вопросов^_^