在 Google Chrome 中加载我的页面时,我在控制台中收到一个模糊的错误:
未捕获的 SyntaxError:输入意外结束
我不知道是什么原因造成的。我将如何调试此错误?
Content-length
标头指定的字节数比响应包含的字节数多,或者服务器可能以某种方式发送了无效的 HTML。
<script>https://example.com/a.js</script>
,它应该是 <script src="https://example.com/a.js"></script>
这个特定的错误是关于 v8 的一个令人讨厌的事实。在大多数情况下,您的 JavaScript 以某种方式被破坏了。例如缺少 }
或类似的东西。
给出的示例,这也会产生“意外的输入结束”:
eval('[{"test": 4}') // notice the missing ]
但问题的根本原因似乎是请求的 JSON url 的 Content-Type 为 text/html
,Chrome 显然试图将其解析为 HTML,然后导致输入意外结束包含的图像标签正在被解析的事实。
尝试将 Content-Type 设置为 text/plain
我认为它应该可以解决问题。
尽管如此,V8 可以做得更好,告诉人们输入意外结束的确切位置。
试试 Firebug for Mozilla - 它会显示缺少的 }
的位置。
ctrl+shift+i
会告诉您。
请参阅另一个 similar question 上的 my case:
就我而言,我试图解析一个空的 JSON: JSON.parse(stringifiedJSON);换句话说,发生的事情如下: JSON.parse("");
当我在 JavaScript 代码中省略右大括号字符 (}
) 时,我收到此错误。检查您的牙套是否正确平衡。
作为记录,对于任何试图找到导致此错误的各种原因的人。一个空的 HTML5 数据属性
data-mydata = ''
也会导致错误。您应该检查数据值何时为空字符串并且根本不包含该属性。不用说,这在很大程度上与脚本生成的 HTML 有关。
data-setup='{"example_option":true}'
后一切正常。
对我来说,问题是我正在为返回 HTTP 201(已创建)且没有请求正文的 POST 请求使用 dataType: "json"
执行 $.ajax。解决方法是简单地删除该键/值。
此错误的另一个原因是:如果您的 API 故意响应没有响应正文,但响应的是 200 OK
状态代码而不是 204 No Content
状态代码。一些 JavaScript 库在没有内容时可能无法很好地响应意外的内容类型,因此请使用正确的状态码!
肯定会有一个导致错误的开放括号。
我建议您在 Firefox 中打开该页面,然后打开 Firebug 并检查控制台——它会显示缺少的符号。
示例截图:
https://i.stack.imgur.com/uP2eq.png
我的问题是 Google Chrome 缓存。我通过在 Firefox 上运行我的 Web 应用程序对此进行了测试,但没有出现该错误。所以我决定尝试清空谷歌浏览器的缓存并且它有效。
如果您的 JavaScript 代码被压缩为一行,则导致此错误的另一个原因是您的注释使用 //
而不是 /**/
。
不好(注释掉 //
之后的所有内容,包括您的函数的结束 }
)
function example() { //comment console.log('TEST'); }
好(限制您的评论)
function example() { /* comment */ console.log('TEST'); }
在我的情况下,我动态添加了 javascript 并在字符串模板中使用了 2 次双引号,所以我将第二个更改为单引号,错误就消失了。我希望它会帮助一些出于同样原因来到这里的人。
尝试解析空 JSON 可能是导致此错误的原因。
当您收到来自服务器或其他的响应时,请先检查它是否为空。例如:
function parseJSON(response) {
if (response.status === 204 || response.status === 205) {
return null;
}
return response.json();
}
然后你可以获取:
fetch(url, options).then(parseJSON);
在按下 am/pm 切换时,我使用 angularjs - uib-datepicker 的 ui bootstrap 指令遇到了类似的问题。
(未知)的事件处理程序中的错误:SyntaxError:JSON 输入角度时间选择器的意外结束
原来是因为插件“Trans-over”(点击时会翻译一个单词)。也许我的回答会对某人有所帮助,因为我在互联网上没有找到任何东西。
由于它是异步操作,因此 onreadystatechange
可能在值加载到 responseText 之前发生,请尝试使用 window.setTimeout(function () { JSON.parse(xhr.responseText); }, 1000);
来查看错误是否仍然存在?波尔
我遇到了这个错误,并通过在此处显示的 readyState
和 status
添加防护来修复它:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Your code here
}
};
如果您在 Anchor 标记处遇到错误,只需将“Onclick”替换为“href”或将“href”替换为“Onclick”
当我遇到同样的问题时,将请求中的 Accept
标头设置为 application/json
对我有用。
就我而言,我的网速很低,当我关闭其他用户的互联网连接时,错误消失了,奇怪
https://i.stack.imgur.com/RQEVs.png