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

tro*_*ock 178 javascript mootools google-chrome

我在我的MooTools脚本中运行一个AJAX调用,这在Firefox中工作正常但在Chrome中我收到Uncaught SyntaxError: Unexpected token :错误,我无法确定原因.注释掉代码来确定坏代码的位置什么都没有产生,我想这可能是返回JSON的问题.检查控制台我看到返回的JSON是这样的:

{"votes":47,"totalvotes":90}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何问题,为什么会出现这种错误?

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();
  });
});
Run Code Online (Sandbox Code Playgroud)

and*_*oon 88

看到红色错误

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

在Chrome开发人员的控制台标签中,通常会显示301重定向,这可能是由.htaccess文件中有一条奇怪的规则引起的.

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

  • 要添加到@andy_magoon,在我的情况下,我有一个脚本标记应该提供javascript,但因为请求被重定向到HTML页面(它重定向的重要性并不重要),以<!DOCTYPE html开头>,这是无效的javascript,浏览器在尝试将HTML解析为JS时返回SyntaxError. (7认同)
  • 当问题是关于"意外的令牌:"时,我不知道你为什么要谈论"意外的令牌<".你的答案与OP的问题完全无关. (3认同)
  • 我得到的正是这个错误,因为事实证明,文件路径不正确,并且找不到脚本标记中指定的文件。 (3认同)
  • 我该如何解决这个问题?我有一个 php 重定向,它在 Chrome 中导致了这个问题。 (2认同)
  • @Thom 修复它的方法是确保 HTTP get 返回您正在寻找的 javascript 文件,而不是意外的 HTML。 (2认同)

小智 78

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

  • 一个奇怪的问题是 - 它在localhost上运行正常,但在服务器上运行不正常.知道为什么吗? (5认同)
  • 我想我正在解决这个问题.我正在从第三方API请求JSON,他们正在返回应用程序/ javascript作为响应,我收到您在此问题中报告的相同错误.不知道如何处理它. (4认同)
  • -1如果对任何有相同问题的人没有帮助,这个答案 (4认同)
  • 谢谢我发送了 application/javascript (因为我误读了 [this SO](http://stackoverflow.com/questions/477816/what-is-the- Correct-json-content-type) )并且在简单的情况下收到了这个错误有效的 JSON。将其更改为“application/json”解决了该错误。我没有使用 JSONP。 (2认同)

Gri*_*... 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; 
}
Run Code Online (Sandbox Code Playgroud)

希望这将有助于未来的人.


tro*_*ock 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);
  });
});
Run Code Online (Sandbox Code Playgroud)

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

  • 标准请求和request.json之间的区别主要在于标题,它添加了`this.headers.extend({'Accept':'application/json','X-Request':'JSON'});` - go数字 (3认同)
  • 什么是双"$$"吗? (3认同)

Kev*_*ven 10

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

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

var total = $.parseJSON(response);
Run Code Online (Sandbox Code Playgroud)

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

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


Mic*_*ski 7

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

根据MooTools的文档:

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

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

{"votes":47,"totalvotes":90}
Run Code Online (Sandbox Code Playgroud)

作为JavaScript,解析器将对待{}作为块作用域而不是对象表示法.它与评估以下"代码"相同:

"votes":47,"totalvotes":90
Run Code Online (Sandbox Code Playgroud)

如你所见,:那里完全出乎意料.

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


Zec*_*umo 5

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

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);
Run Code Online (Sandbox Code Playgroud)

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

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

这里有类似的问题: Eval() = Unexpected token : error