Как я могу получить номер строки ошибки в динамически добавленном теге <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)

2 ответа

Решение

Понял. Добавление try catch в коде прекрасно работает

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

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

РЕДАКТИРОВАТЬ:

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

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 чтобы просто увидеть массив всех строк.

Работает как шарм.

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

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

Другие вопросы по тегам