【问题标题】:Uncaught SyntaxError: Unexpected token :Uncaught SyntaxError: Unexpected token :
【发布时间】:2011-03-09 19:01:08
【问题描述】:

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

【问题讨论】:

  • JSON 很好。问题可能是你如何处理它。显示代码会有所帮助。
  • 将代码部分添加到问题中。
  • 语法、JS 和 JSON 似乎都没有问题。在 jsfiddle.net 上发布一个(不)工作的测试用例会有所帮助 - 包括 HTML。
  • 我目前正在连接互联网,因此我的调制解调器会压缩我浏览的网站的 HTML 源代码,因此我无法真正从代码中找出正面或反面。但是,对于初学者来说,将每个 JS 代码放在外部文件中——这总是使调试更容易——你会知道错误是由 JS 或其他原因引起的。
  • “意外令牌”可能是一些非法字符代码。当您打印到控制台时,这样的代码可能不会出现。因此,一次打印出字符串一个字符或使用协议分析器或调试器等来查看字符串的实际字节数。

标签: javascript mootools google-chrome


【解决方案1】:

看到红色错误

Uncaught SyntaxError: Unexpected token

在您的 Chrome 开发人员的控制台选项卡中,响应正文中的 HTML 指示。

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

【讨论】:

  • 当问题是关于 Unexpected token : 时,我不知道你为什么要谈论“意外的令牌
  • 我该如何解决这个问题?我有一个 php 重定向导致 Chrome 出现这种情况。
  • 添加到@andy_magoon,在我的例子中,我有一个脚本标签应该提供javascript,但是因为请求被重定向到一个HTML页面(它被重定向的原因并不重要) ,以 开头,它不是有效的 javascript,浏览器在尝试将 HTML 解析为 JS 时返回 SyntaxError。
  • @Thom 修复它的方法是确保 HTTP get 返回您正在寻找的 javascript 文件,而不是意外的 HTML。
  • 我得到了这个错误,因为事实证明,文件路径不正确,找不到脚本标签中指定的文件。
【解决方案2】:

对于可能有同样问题的人来说,仅供参考——我只需要让我的服务器将 JSON 作为 application/json 发回,默认的 jQuery 处理程序就可以正常工作。

【讨论】:

  • 我想我遇到了这个问题的反面。我从第三方 API 请求 JSON,他们返回 application/javascript 作为响应,我收到了与您在这个问题中报告的相同的错误。不知道如何处理。
  • 一个奇怪的问题是——它在本地主机上运行良好,但在服务器上却不行。知道为什么吗?
  • 你好。我有确切的问题,我无法解决,谁能告诉我你如何将 JSON 发送回服务器
  • 谢谢我发送应用程序/javascript(因为我误读了 this SO )并且在简单有效的 JSON 上收到此错误。将其更改为 application/json 解决了该错误。我没有使用 JSONP。
  • 即使我收到同样的错误 "Uncaught SyntaxError: Unexpected token :" ,即使在收到 json 格式的响应 {"success":true,"data":2593}
【解决方案3】:

这件事刚刚发生在我身上,原因不是以上原因。我正在使用 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 数据也不应该以数字开头。当我尝试使用数字时,它没有成功。当我用这个答案中显示的相同格式尝试它时,它起作用了......
  • 确实如此,但错误是一样的,如果使用 JSON,代码会优雅地降级并且仍然可以工作。
  • 这对我来说适用于 AJAX、jQuery 和 JSONP。非常感谢!
【解决方案4】:

我刚刚解决了这个问题。标准请求调用出现问题,所以这是我使用的代码:

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 对象会给我带来问题,我很想知道。

【讨论】:

  • 标准request和request.json的区别主要在headers中,增加了this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'}); - 看图
  • 奇怪的是,这是导致此问题的原因。
  • 那里的双$$是什么?
  • @DimitarChristoff --falsarella 关于 $$ 的任何答案?
  • @bear 双美元选择器在 MooTools 中定义。
【解决方案5】:

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

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

var total = $.parseJSON(response);

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

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

【讨论】:

  • 我这样做了。我在我的 php 文件中的某处回显 json,并在我的响应中获取 php[//json 数据],但我无法解析它。感谢您发布此内容,以便我找出自己的错误。
  • OP 问题完全不同。在您的情况下,您正在尝试将 HTML 解析为 JSON,而在 OP 的情况下,他正在尝试将 JSON 解析为 JavaScript。
【解决方案6】:

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

根据MooTools docs

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

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

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

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

"votes":47,"totalvotes":90

如您所见,: 在那里完全出乎意料。

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

【讨论】:

    【解决方案7】:

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

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

    这是由于大括号 '{...}' 被 javascript 解释为代码块,而不是人们可能期望的对象字面量。

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

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

    【讨论】:

      【解决方案8】:

      如果没有任何意义,这个错误也可能是由嵌入在 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 中的代码中的 &lt;br /&gt; 等导致错误。要修复这种错误(抑制警告),请在开始时使用此代码

      error_reporting(E_ERROR | E_PARSE);
      

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

      【讨论】:

        【解决方案9】:

        "Uncaught SyntaxError: Unexpected token" 当您的数据返回错误的 json 格式时出现错误,在某些情况下,您不知道您得到了错误的 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 格式
        例如:

        ...{"firstName":"John", "lastName":"Doe"}

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

        所以你得到了错误的 json 格式,请在 JSON.decode 或 JSON.parse 之前修复它

        【讨论】:

        【解决方案10】:

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

        与其使用 ScriptIgnore 属性,不如只返回一个 DTO。

        【讨论】:

          【解决方案11】:

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

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

          Uncaught SyntaxError: Unexpected token

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

          希望对某人有所帮助。

          【讨论】:

            【解决方案12】:

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

            【讨论】:

            • OP 使用 JSON,而不是 JSONP。
            【解决方案13】:

            我的错误是 忘记了 javascript 中 url 周围的单引号/双引号

            所以错误代码是:

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

            正确代码:

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

            【讨论】:

              【解决方案14】:

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

              【讨论】:

              • 这个问题是关于“Unexpected token :”。
              【解决方案15】:

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

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

              我把上面的映射改成

               @RequestMapping("/private/updatestatus")
              

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

              【讨论】:

                【解决方案16】:

                对我来说,当我在 Chrome 浏览器中查看页面的源代码时,灯泡会亮起。我在 if 语句中有一个额外的括号。您会立即在失败线上看到带有十字的红色圆圈。这是一条相当无用的错误消息,因为 Uncaught Syntax Error: Unexpected 令牌首次出现在 Chrome 控制台中时没有引用行号。

                【讨论】:

                  【解决方案17】:

                  我做错了

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

                  我已经初始化了fs 变量。但是我再次将var 放在第二行。这也给出了那种错误...

                  【讨论】:

                    【解决方案18】:

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

                    【讨论】:

                    • 我通过更正 baseref url 解决了同样的问题 - 指向根文件夹 =>
                    【解决方案19】:

                    在我的情况下,这是一个错误的 url(不存在),所以也许你在第二行的“发送”应该是其他的......

                    【讨论】:

                      【解决方案20】:

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

                      【讨论】:

                        【解决方案21】:

                        在我的例子中,将/ 放在脚本src 或样式表href 的开头解决了这个问题。

                        【讨论】:

                          【解决方案22】:

                          遇到类似问题,这是在 Chrome 中解决的方法。单击令牌所在的文件(在我的例子中是app.js:1):

                          然后它会很好地重定向到 Sources 并用错误词指出确切的行:

                          在这种情况下,正如多次提到的,这是由于Doctype 中的&lt;

                          【讨论】:

                          • 应该如何修复它,因为我认为删除“
                          【解决方案23】:

                          反复面对 JS 问题我正在为我的 xblock 包应用 Ckeditor。如果有人帮助我,请向我建议。使用 OpenEdx、Javascript、xblock

                          xblock.js:158 SyntaxError: Unexpected token '=>'
                          at eval (<anonymous>)
                          at Function.globalEval (jquery.js:343)
                          at domManip (jquery.js:5291)
                          at jQuery.fn.init.append (jquery.js:5431)
                          at child.loadResource (xblock.js:236)
                          at applyResource (xblock.js:199)
                          at Object.<anonymous> (xblock.js:202)
                          at fire (jquery.js:3187)
                          at Object.add [as done] (jquery.js:3246)
                          at applyResource (xblock.js:201) "SyntaxError: Unexpected token '=>'\n    at eval (<anonymous>)\n    at Function.globalEval (http://localhost:18010/static/studio/common/js/vendor/jquery.js:343:5)\n    at domManip (http://localhost:18010/static/studio/common/js/vendor/jquery.js:5291:15)\n    at jQuery.fn.init.append (http://localhost:18010/static/studio/common/js/vendor/jquery.js:5431:10)\n    at child.loadResource (http://localhost:18010/static/studio/bundles/commons.js:5091:27)\n    at applyResource (http://localhost:18010/static/studio/bundles/commons.js:5054:36)\n    at Object.<anonymous> (http://localhost:18010/static/studio/bundles/commons.js:5057:25)\n    at fire (http://localhost:18010/static/studio/common/js/vendor/jquery.js:3187:31)\n    at Object.add [as done] (http://localhost:18010/static/studio/common/js/vendor/jquery.js:3246:7)\n    at applyResource (http://localhost:18010/static/studio/bundles/commons.js:5056:29)"
                          

                          【讨论】:

                            【解决方案24】:

                            Uncaught SyntaxError: Unexpected token }

                            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 询问“意外的令牌 :”。
                            猜你喜欢
                            • 2012-05-17
                            • 2019-02-10
                            • 2014-07-08
                            • 2014-01-06
                            • 2012-04-10
                            • 1970-01-01
                            相关资源
                            最近更新 更多