如何在动态添加的<script>标记中获取错误的行号?

时间:2016-10-19 04:00:33

标签: javascript error-handling line-numbers dynamic-script-loading

当动态创建脚本元素并将其添加到页面时,我的错误不是给我脚本的行号,而是给我附加脚本的行号。

&#xA;&#xA;

在.js文件中的下面的代码将为您提供行号 document.appendChild(script)的行号错误。代码段(如果已运行)将返回正确的行号。他们是如何做到的?

&#xA;&#xA;

&#xD;&#xA;
&#xD;&#xA;
  var script = document.createElement(“script”);&#xD;&#xA; script.innerHTML =“\ n \ n \ n \ n \ n \ n \ n nfoo.bar”; //错误应该在第8行&#xD;&#xA;&#xD;&#xA; document.head.appendChild(脚本) 
&#xD;&#xA;
&#的xD;&#XA;
&#的xD;&#XA;

&#XA;

2 个答案:

答案 0 :(得分:0)

知道了。在代码中添加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只看到所有行的数组。

像魅力一样。

答案 1 :(得分:-1)

当您说“行号”时,您可能指的是文件的行号。但在这种情况下,它是哪个文件?你是动态创建脚本的,所以真的没有。

您创建的脚本仅存在于DOM中,即代码的内存中表示形式。它似乎完全按照我的预期行事。