未捕获到的SyntaxError:意外令牌:


192

我在MooTools脚本中运行AJAX调用,在Firefox中运行良好,但是在Chrome中出现Uncaught SyntaxError: Unexpected token :错误,我无法确定原因。注释掉代码以确定错误代码在哪里不会产生任何结果,我认为这可能是返回JSON的问题。在控制台中检查,我看到返回的JSON是这样的:

{"votes":47,"totalvotes":90}

我没有看到任何问题,为什么会发生此错误?

vote.each(function(e){
  e.set('send', {
    onRequest : function(){
      spinner.show();
    },
    onComplete : function(){
      spinner.hide();
    },
    onSuccess : function(resp){
      var j = JSON.decode(resp);
      if (!j) return false;
      var restaurant = e.getParent('.restaurant');
      restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
      $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
      buildRestaurantGraphs();
    }
  });

  e.addEvent('submit', function(e){
    e.stop();
    this.send();
  });
});

1
JSON很好。问题可能在于您如何处理它。显示代码会有所帮助。
tcooc

1
在问题中添加了代码部分。
trobrock 2010年

语法,JS和JSON似乎都没有错。在jsfiddle.net上发布(无效)测试用例会有所帮助-包括HTML。
Oskar Krawczyk

1
我目前正在束缚互联网,因此我的调制解调器压缩了我浏览的网站的HTML源,因此我无法真正在代码中浮出水面。但是,对于初学者来说,将每个JS代码都放在外部文件中-这总是使调试更容易-您会知道该错误是由JS或其他原因引起的。
Oskar Krawczyk

2
“意外令牌”可能是某些非法字符代码。当您打印到控制台时,这样的代码可能不会显示。因此,一次将字符串输出一个字符,或者使用协议分析器或调试器等查看字符串的实际字节。
GroovyDotCom

Answers:


93

看到红色错误

未捕获到的SyntaxError:意外令牌<

Chrome开发者的控制台标签中的表示响应正文中的HTML。

您实际上看到的是浏览器<!DOCTYPE html>对服务器意外的顶行的反应。


4
我不知道为什么您在谈论问题时为什么要谈论“意外令牌<” Unexpected token :。您的答案与OP的问题完全无关。
米哈尔Perłakowski

1
我该如何解决呢?我有一个导致在Chrome中导致此问题的php重定向。
为生活而工作的作品

7
在我的情况下,要添加到@andy_magoon中,我有一个脚本标签,该脚本标签应该提供JavaScript,但是由于请求已重定向到HTML页面(为什么不重定向,所以以<!DOCTYPE html开头) >(不是有效的javascript),浏览器在尝试将HTML解析为JS时会返回SyntaxError。
david.barkhuizen

2
@Thom修复它的方法是确保HTTP get返回您要查找的javascript文件,而不是意外的HTML。
david.barkhuizen

1
我得到了这个错误,因为事实证明,文件路径不正确,并且找不到脚本标记中指定的文件。
纽曼

80

仅供可能遇到相同问题的人参考-我只需要使我的服务器将JSON作为application / json发送回去,并且默认的jQuery处理程序就可以正常工作。


4
我想我遇到了这个问题。我正在从第三方API请求JSON,并且他们正在返回application / javascript作为响应,并且遇到了您在此问题中报告的错误。不确定如何处理。
wuliwong 2012年

5
一个奇怪的问题是-它可以在localhost上正常运行,但不能在服务器上正常运行。知道为什么吗?
VishwaKumar

你好。我有确切的问题,我无法解决,有人可以告诉我如何将JSON发送回服务器
Alen

谢谢,我正在发送应用程序/ JavaScript(因为我读错了SO),并且在简单有效的JSON上收到此错误。对其进行更改以application/json解决该错误。我没有使用JSONP。
scipilot 2014年

即使我收到相同的错误“ Uncaught SyntaxError:Unexpected token:”,即使收到json格式的响应{“ success”:true,“ data”:2593}
Rupali Pemare

41

这只是发生在我身上,原因并非上述原因。我正在使用jQuery命令getJSON并添加callback=?以使用JSONP(因为我需要跨域使用),然后返回JSON代码{"foo":"bar"}并得到错误。

这是因为我应该包含回调数据,例如 jQuery17209314005577471107_1335958194322({"foo":"bar"})

这是我用来实现此目的的PHP代码,如果使用JSON(不带回调),它将降低性能:

$ret['foo'] = "bar";
finish();

function finish() {
    header("content-type:application/json");
    if ($_GET['callback']) {
        print $_GET['callback']."(";
    }
    print json_encode($GLOBALS['ret']);
    if ($_GET['callback']) {
        print ")";
    }
    exit; 
}

希望这会在将来对某人有所帮助。


这对我帮助很大。每当我们使用jsonp方法时,都应该用jsoncallback数据包装json数据。jsonpcallback数据也不应以数字开头。当我尝试数字时,它没有解决。当我尝试使用此答案中所示的相同格式进行尝试时,它确实起作用了……
Ganesh Babu 2013年

足够真实,但是错误是相同的,并且如果使用JSON,代码将正常降级,并且仍然可以正常工作。
严峻...

这为我使用AJAX,jQuery和JSONP服务。非常感谢!
Piotr Wittchen

16

我刚刚解决了这个问题。导致标准Request调用出现问题的原因是,这是我改用的代码:

vote.each(function(element){                
  element.addEvent('submit', function(e){
    e.stop();
    new Request.JSON({
      url : e.target.action, 
      onRequest : function(){
        spinner.show();
      },
      onComplete : function(){
        spinner.hide();
      },
      onSuccess : function(resp){
        var j = resp;
        if (!j) return false;
        var restaurant = element.getParent('.restaurant');
        restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
        $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
        buildRestaurantGraphs();
      }
    }).send(this);
  });
});

如果有人知道为什么标准Request对象给我带来问题,我很想知道。


3
标准要求和request.json之间的差别主要是在头部,它增加了this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});-去图
贝尔巴托夫克里斯托夫

奇怪的是,这是导致此问题的原因。
trobrock 2010年

3
$$那里有什么双人间?
falsarella 2012年

@DimitarChristoff-关于falsarella关于$$的任何答案吗?
2013年

1
@bear在MooTools中定义了双元选择器。
安东尼·法尔

10

我以为可以将我的问题和解决方案添加到列表中。

我得到:Uncaught SyntaxError: Unexpected token <并且错误指向我的ajax成功声明中的这一行:

var total = $.parseJSON(response);

后来我发现,除了json结果外,还有HTML与响应一起发送,因为我的PHP错误。当您在PHP中遇到错误时,可以将其设置为使用巨大的橙色表来警告您,而这些表正是抛出JSON的原因。

我发现这样做只是console.log(response)为了查看实际发送的内容。如果JSON数据有问题,请尝试查看是否可以执行console.log或其他一些语句,以查看发送的内容和接收的内容。


1
我做到了 我在我的php文件中的某个地方回显了json,并在响应中获取了php [// json数据],但我无法解析它。感谢您发布此信息,以便我找出自己的错误。
尼古拉斯·德克

OP问题是完全不同的。在您的情况下,您尝试将HTML解析为JSON,在OP的情况下,他尝试将JSON解析为JavaScript。
米哈尔Perłakowski

7

当您请求JSON文件时,服务器返回JavaScript Content-Type标头(text/javascript)而不是JSON(application/json)。

根据MooTools docs

具有javascript内容类型的响应将自动进行评估。

结果,MooTools尝试将JavaScript评估为JavaScript,并且当您尝试评估JSON时:

{"votes":47,"totalvotes":90}

作为JavaScript,解析器将{}视为块作用域,而不是对象表示法。与评估以下“代码”相同:

"votes":47,"totalvotes":90

如你看到的, :这完全是意外的。

解决方案是Content-Type为JSON文件设置正确的标头。如果使用.json扩展名保存,则服务器应自行完成。


4

听起来您的回应正在被评估。这会在Chrome中产生相同的错误:

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);

这是由于javascript将括号“ {...}”解释为代码块,而不是人们期望的对象文字。

我看一下JSON.decode()函数,看看那里是否有一个eval。

此处类似的问题: Eval()=意外令牌:错误


2

如果没有任何意义,则此错误也可能是由html / javascript中嵌入的PHP错误引起的,例如以下错误

<br />
<b>Deprecated</b>:  mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}

不是<br />由PHP插入html的代码中的etc引起该错误。要解决此类错误(禁止警告),请在开始时使用此代码

error_reporting(E_ERROR | E_PARSE);

要查看,请右键单击页面“查看源代码”,然后检查完​​整的html以发现此错误。


1

当您的数据返回错误的json格式时,出现“ Uncaught SyntaxError:Unexpected token ”错误出现,在某些情况下,您不知道自己得到了错误的json格式。
请使用alert()检查它;功能

onSuccess : function(resp){  
   alert(resp);  
}

您收到的消息应为:{“ firstName”:“ John”,“ lastName”:“ Doe”}
,然后可以使用以下代码

onSuccess : function(resp){  
   var j = JSON.decode(resp); // but in my case i'm using: JSON.parse(resp); 
}

没有错误“ Uncaught SyntaxError:Unexpected token ”,
但是如果您得到错误的json格式,
例如:

... {“名字”:“约翰”,“姓”:“母鹿”}

要么

Undefined variable: errCapt in .... on line<b>65</b><br/>{"firstName":"John", "lastName":"Doe"}

因此您使用了错误的json格式,请先进行修复,然后再进行JSON.decode或JSON.parse


3
我建议使用console.log()而不是alert()进行调试。
米哈尔Perłakowski

1

今天我也发生了这种情况。我正在使用EF并返回一个Entity来响应AJAX调用。我实体上的虚拟属性导致服务器上未检测到的周期性依赖关系错误。通过在虚拟属性上添加[ScriptIgnore]属性,此问题已得到解决。

与其使用ScriptIgnore属性,不如直接返回DTO,可能会更好。


1

发生这种情况是因为我在我的快速服务器中设置了一条规则,以将任何404路由回/#加上原始请求。允许有角路由器/ js处理请求。如果没有js路由来处理该路径,/#/whatever则会向服务器发出请求,这仅仅是对/对整个网页。

因此,例如,如果我想提出请求,/correct/somejsfile.js但我错过了将其键入/wrong/somejsfile.js服务器的请求。该位置/文件不存在,因此服务器以响应302 location: /#/wrong/somejsfile.js。浏览器愉快地跟随重定向,并返回整个网页。浏览器将页面解析为js,您得到

未捕获到的SyntaxError:意外令牌<

因此,为帮助查找有问题的路径/请求,请查找302个请求。

希望能对某人有所帮助。


1

我遇到了同样的问题,结果是从服务器返回的Json不是有效的Json-P。如果您不将该调用用作跨域调用,请使用常规Json。


OP使用JSON,而不是JSONP。
米哈尔Perłakowski

0

SyntaxError: Unexpected token I当我jQuery.getJSON()尝试反序列化浮点值时Infinity,出现了“ ” ,编码为INF,这在JSON中是非法的。


1
该问题与“意外令牌 ”有关。
米哈尔Perłakowski

0

就我而言,由于我的MVC控制器中的映射错误,在运行Spring MVC应用程序时遇到了相同的错误

@RequestMapping(name="/private/updatestatus")

我将上面的映射更改为

 @RequestMapping("/private/updatestatus")

要么

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)

0

对我来说,当我在Chrome浏览器中查看网页的源代码时,灯泡就亮了。我在if语句中加了一个括号。您会立即在失败线上看到带有十字的红色圆圈。这是一条无济于事的错误消息,因为“未捕获的语法错误:意外的”令牌在首次出现在Chrome控制台中时未引用行号。


0

我做错了

   `var  fs = require('fs');
    var fs.writeFileSync(file, configJSON);`

我已经初始化了fs变量,但再次var输入第二行,这也给出了这种错误...


0

对于那些在AngularJs 1.4.6或类似版本中遇到此问题的人,我的问题是angular找不到我的模板,因为找不到我templateUrl提供的(路径)中的文件。我只需要提供一条可及的路径,问题就消失了。


我通过更正baseref url解决了相同的问题-指向根文件夹=> <base href =“ /”>
Abdeali Chandanwala

0

就我而言,这是一个错误的网址(不存在),所以也许第二行中的“发送”应该是其他...


0

我的错误是忘记单/双引号了javascript中网址的:

所以错误的代码是:

window.location = https://google.com;

正确的代码:

window.location = "https://google.com";

-2

未捕获的SyntaxError:意外令牌}

Chrome给了我这个示例代码的错误:

<div class="file-square" onclick="window.location = " ?dir=zzz">
    <div class="square-icon"></div>
    <div class="square-text">zzz</div>
</div>

并解决了将onclick固定为

... onclick="window.location = '?dir=zzz'" ...

但是错误与问题无关。


OP询问“意外令牌 ”。
米哈尔Perłakowski
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.