Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在动态添加的<;中获取错误的行号;脚本>;标签_Javascript_Error Handling_Line Numbers_Dynamic Script Loading - Fatal编程技术网

Javascript 如何在动态添加的<;中获取错误的行号;脚本>;标签

Javascript 如何在动态添加的<;中获取错误的行号;脚本>;标签,javascript,error-handling,line-numbers,dynamic-script-loading,Javascript,Error Handling,Line Numbers,Dynamic Script Loading,当动态创建脚本元素并将其添加到页面时,我的错误不是给我脚本的行号,而是给我附加脚本的行号 当在.js文件中时,下面的代码将给您一个行号错误,无论哪一行document.appendChild(script)处于启用状态。如果运行代码段,它将返回正确的行号。他们是怎么做到的 var script=document.createElement(“脚本”); script.innerHTML=“\n\n\n\n\n\n\nfoo.bar”//错误应该在第8行 document.head.append

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

当在.js文件中时,下面的代码将给您一个行号错误,无论哪一行
document.appendChild(script)
处于启用状态。如果运行代码段,它将返回正确的行号。他们是怎么做到的

var script=document.createElement(“脚本”);
script.innerHTML=“\n\n\n\n\n\n\nfoo.bar”//错误应该在第8行
document.head.appendChild(script)
当你说“行号”时,你可能指的是文件的行号。但在这种情况下,它是哪个文件?您正在动态创建脚本,因此实际上没有脚本


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

明白了。在代码周围添加一个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] }
foo未在第行定义
foo.bar::8,对象{异常:ReferenceError,行:数组[8]}
您可以单击
转到附加元素,或者单击
只查看所有行的数组


工作起来很有魅力。

侧边栏中出现了一些问题前面的问题启发了这个问题的答案,虽然它没有真正显示出来。我想是的,但是如果你发现了错误,你可以从评估中获得一个行号。我正在检查是否可以使用window…OneError捕捉它,然后获取行号Nope。window.onerror仅使用一个字符串调用,该字符串就是错误