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

时间:2010-06-29 18:37:57

标签: javascript mootools google-chrome

我在我的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();
  });
});

22 个答案:

答案 0 :(得分:83)

看到红色错误

  

未捕获的SyntaxError:意外的标记<

Chrome浏览器控制台标签中的

通常表示 301 Redirects 可能是由.htaccess文件中存在奇怪规则引起的。

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

答案 1 :(得分:78)

对于可能遇到同样问题的人来说只是一个FYI - 我只需要让我的服务器将JSON作为application / json发送回来,并且默认的jQuery处理程序工作正常。

答案 2 :(得分:40)

这恰好发生在我身上,其原因并非上述原因。我使用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; 
}

希望这将有助于将来的人。

答案 3 :(得分: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对象给我带来了问题,我很想知道。

答案 4 :(得分:10)

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

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

var total = $.parseJSON(response);

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

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

答案 5 :(得分:7)

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

根据MooTools docs

  

将自动评估javascript内容类型的响应。

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

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

作为JavaScript,解析器将{}视为块范围而不是对象表示法。它与评估以下&#34;代码&#34;:

相同
"votes":47,"totalvotes":90

正如您所看到的,:在那里完全出乎意料。

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

答案 6 :(得分:3)

听起来你的回答正在以某种方式进行评估。这会在Chrome中出现相同的错误:

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

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

我会查看JSON.decode()函数,看看是否有eval。

此处类似的问题: Eval() = Unexpected token : error

答案 7 :(得分:1)

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

答案 8 :(得分:1)

当你的数据返回错误的json格式时,

未捕获的SyntaxError:意外的令牌”错误出现,在某些情况下,你不知道你的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); 
}

没有错误“未捕获的SyntaxError:意外的令牌
但如果你错了json格式
例如:

  

... {“firstName”:“John”,“lastName”:“Doe”}

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

因此你的json格式错误,请在JSON.decode或JSON.parse之前修复它

答案 9 :(得分:1)

今天也发生在我身上。我正在使用EF并返回一个实体以响应AJAX调用。我的实体上的虚拟属性导致了在服务器上未检测到的循环依赖性错误。通过在虚拟属性上添加[ScriptIgnore]属性,问题得以解决。

不是使用ScriptIgnore属性,而是返回DTO可能更好。

答案 10 :(得分:1)

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

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

  

未捕获的SyntaxError:意外的标记&lt;

所以为了帮助找到有问题的路径/请求,请查找302个请求。

希望有人帮助。

答案 11 :(得分:0)

在我的情况下,由于我的mvc控制器中的映射错误,我在运行spring mvc应用程序时遇到了同样的错误

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

我将上述映射更改为

 @RequestMapping("/private/updatestatus")

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

答案 12 :(得分:0)

当我使用SyntaxError: Unexpected token I尝试反序列化jQuery.getJSON()的浮点值时,我得到了一个“Infinity”,编码为INF,这是非法的JSON。

答案 13 :(得分:0)

对于我来说,当我在Chrome浏览器中查看源页面时,灯泡仍然亮着。我在if语句中有一个额外的括号。您将立即在失败的线路上看到带有十字的红色圆圈。这是一个相当无用的错误消息,因为未捕获的语法错误:意外的令牌在Chrome首次出现时不会引用行号。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

如果没有任何意义,则此错误也可能是由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}

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

error_reporting(E_ERROR | E_PARSE);

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

答案 16 :(得分:0)

在我的情况下,这是一个错误的网址(不存在),因此第二行中的“发送”应该是其他...

答案 17 :(得分:0)

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

所以错误的代码是:

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

正确代码:

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

答案 18 :(得分:0)

此错误也可能意味着您的代码中缺少colon:

答案 19 :(得分:0)

就我而言,将 / 放在脚本的 src 或样式表的 href 的开头解决了该问题。

答案 20 :(得分:-1)

我做错了

user_id

我已经初始化了 `var fs = require('fs'); var fs.writeFileSync(file, configJSON);` 变量。但是我再次把fs放在第二行。这个也给出了那种错误......

答案 21 :(得分:-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'" ...

但错误与问题无关。