Chrome:语法未捕获错误:输入意外结束


176

在Google Chrome浏览器中加载页面时,控制台中出现一个模糊的错误:

Uncaught SyntaxError:输入意外结束

我不知道是什么原因造成的。我将如何调试此错误?


2
在网络嗅探器中检查响应可能会为您提供线索。我的猜测是,Content-length标头指定的字节数超过了响应所包含的字节数,或者服务器可能以某种方式发送了无效的HTML。
tdammers 2010年

2
大部分时间都缺少}(javascript)。检查类和函数的结尾。尝试仅在脚本末尾添加另一个结尾},然后重新自动设置代码格式。如果您的代码中有任何奇怪的缩进,那么在此之前的某个位置很可能是}丢失的地方。
OG肖恩

错误加载JS时出现此问题。我按原样加载了它<script>https://example.com/a.js</script><script src="https://example.com/a.js"></script>
Daniel Apt

我今天在Google表格上收到此错误。我的猜测是他们的JS文件之一太大,以至于它终止而没有完全加载。或者他们的其中一个应用服务器存在错误,并且在完全下载JS文件之前关闭了http连接。
泰迪

Answers:


226

这个特殊的错误是一个令人烦恼的事实 。在大多数情况下,您的JavaScript会以某种方式损坏。例如缺少a }或类似的东西。

给出示例,这也会产生“输入的意外结束”:

eval('[{"test": 4}') // notice the missing ]

但问题的根源似乎是被请求的JSON的URL有内容类型text/html的Chrome显然试图解析为HTML,然后由于导致输入意外结束了包括图像标签是解析。

尝试将Content-Type设置为text/plain我认为应该可以解决的问题。

尽管如此,V8可以做一下,告诉一个完全是一个更好的工作,其中输入意外结束。


2
好的,非常感谢,我一起删除了json请求,但错误消失了,我还没有弄清楚我的json请求到底出了什么问题。我只是不知道从哪里开始调试。我是否想问您如何确定根本原因
dlaurent86

2
可能不是那么明显。我已经在最小化JS上遇到了这个错误,因为它被最小化器所破坏,而未最小化的JS是完全合法和有效的。不幸的是,Chrome仅显示发生错误的行,对于最小化的JS,该行通常是整个文件……
Cerin 2014年

输入结束的地方不多(因为结尾处是cuz)。相反,知道什么预计将帮助吨。
AndrewS 2014年

救了我的尾巴。模棱两可让我非常恼火。谢谢。
Cyprus106

4
我遇到了同样的错误,因为我使用的是JSON.parse(text)并且文本值是空字符串
A Khudairy 2015年

73

尝试Firebug for Mozilla-它会显示丢失的位置}

http://getfirebug.com/


12
不需要萤火虫。Firefox中的控制台告诉我确切缺少什么行和什么字符
Dylan Valade

1
也不需要firefug。firefox控制台ctrl+shift+i会告诉您。
本杰明·克鲁兹耶

1
警告,如果将脚本最小化为一行,则Firefox可能会挂起几分钟/几小时/几年。
塞林2014年

1
到目前为止,这是
查找

天哪,谢谢你。在开发人员工具方面,与Firefox相比,我觉得chrome遥遥领先。令人惊讶的是,它如何无法正确解决这一小问题。让我免于头疼!
以赛亚李

33

查看关于另一个类似问题的案例

就我而言,我试图解析一个空的JSON:

JSON.parse(stringifiedJSON);

换句话说,发生了以下情况:

JSON.parse("");

2
是的,我也有这个!您可以通过提供“ {}”而不是空字符串来轻松解决
cronoklee 2015年

1
由于URL中的双正斜杠(例如localhost:8080 // mypath / blagh),我收到了空的json,并且服务器为此返回了空的响应。
jpierson

1
我来这里只是为了确认该解决方案。
路易斯·阿松桑

10

}在JavaScript代码中省略了右花括号()时收到此错误。检查大括号是否正确平衡。


10

记录在案,任何试图找出导致此错误的各种原因的人。空的HTML5数据属性

data-mydata = ''

也会导致错误。您应该检查数据值是否为空字符串,并且根本不包括该属性。不用说,这与脚本生成的HTML密切相关。


没有您,这将永远不会解决。我正在使用VideoJS,并从其页面复制了其视频播放器的html。它有一个可以使用的数据属性占位符,但我没有。视频没有加载,我得到了所有人都在谈论的错误。删除后,data-setup='{"example_option":true}' 一切正常。
泰勒·布奇

1
@ user1002379,很高兴可以为您提供帮助。
DroidOS 2015年

8

对我来说,问题是我正在为$ .ajax做dataType: "json"一个POST请求,该请求返回一个HTTP 201(已创建),但没有请求主体。解决方法是简单地删除该键/值。


我启动了一个ajax请求(上载),并在完成之前中止了该请求,并且出现了此错误。
达斯汀·普瓦桑


6

导致此错误的另一原因:如果您的API故意不使用响应主体进行响应,而是使用200 OK状态代码而不是状态代码进行响应204 No Content。当没有内容时,某些JavaScript库可能无法很好地响应意外的内容类型,因此请使用正确的状态码!


3

肯定会有一个引起错误的括号。

我建议您在Firefox中打开该页面,然后打开Firebug并检查控制台-它会显示缺少的符号。

屏幕截图示例:

Firebug突出显示错误


2

我的问题是Google Chrome缓存。我通过在Firefox上运行Web应用程序进行了测试,但没有出现该错误。因此,我决定尝试清空Google Chrome浏览器的缓存,然后开始工作。


1

如果您的JavaScript代码缩小为一行,则此错误的另一个原因是使用//而不是/**/您的注释。

错误(//在关闭}函数后注释掉所有内容)

function example() { //comment console.log('TEST'); }

好(拒绝您的评论)

function example() { /* comment */ console.log('TEST'); }

另外,您还应该使用\“ the-text \”来指代“ the-text”。
海湾

1

就我而言,我是动态添加JavaScript并在字符串模板中使用了两次双引号,所以我将第二个改为单引号,并且错误消失了。我希望它能以同样的理由帮助一些来这里的人。


使用addthis我将双字符串附加到URL上,然后更改为单引号,并且控制台错误消失了
tfa

0

当按am / pm切换时,我使用针对angularjs的ui bootstrap指令使用ui引导程序时遇到类似的问题-uib-datepicker。

(未知)事件处理程序中的错误:SyntaxError:JSON输入角度时间选择器意外结束

原来是由于插件“ Trans-over”(单击时翻译一个词)引起的。也许我的回答会对某人有所帮助,因为我没有在互联网上找到任何东西。


0

由于这是异步操作,onreadystatechange可能会在将值加载到responseText中之前发生,请尝试使用a window.setTimeout(function () { JSON.parse(xhr.responseText); }, 1000); 查看错误是否仍然存在?博尔


0

我有这个错误,并通过添加在保护修复它readyStatestatus如下所示:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
          // Your code here
   }
};



0

尝试解析空的JSON可能是导致此错误的原因。

当您收到来自服务器等的响应时,请首先检查响应是否为空。例如:

function parseJSON(response) {
    if (response.status === 204 || response.status === 205) {
        return null;
    }
    return response.json();
}

然后,您可以获取:

fetch(url, options).then(parseJSON); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.