【问题标题】:Uncaught SyntaxErrror: Unexpected token ILLEGAL in chrome未捕获的语法错误:chrome 中出现意外的令牌非法
【发布时间】:2011-08-18 09:19:18
【问题描述】:

我在 jQuery ajax 函数中遇到问题。以下代码在 Mozilla 中运行良好,但在 IE 或 Chrome 中无法运行,当我尝试使用 chrome 中的开发人员工具识别问题时,出现错误:

Uncaught SyntaxError: Unexpected token ILLEGAL \n
$.ajax.success

当我点击它时,它会将我定向到var obj = JSON.parse(data); 行。

function getdata(){
    $.ajax({
        type:"GET",
        url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
        data: "",
        success: function(data) {
            var obj = JSON.parse(data);
            displayPlaylists(obj);
        }

    });
}

编辑: 我找到了一个在 chrome 中有效但在 IE 中无效的解决方案

function getdata(){
        $.ajax({
                type:"GET",
                url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
                dataType:"json",
                success: function(data) {
                    displayPlaylists(data);
                }

            });
    }

添加 dataType:"json" 意味着该函数期望返回 json 数据,因此在到达时对其进行解析(相当于使用 jQuery.parseJSON),但是正如我所说,这个解决方案仍然不起作用浏览器

【问题讨论】:

标签: jquery json google-chrome syntax-error token


【解决方案1】:

由于 jQuery 已经假定它是 JSON(来自 HTTP 标头),data 已经 作为 JSON 传递。

所以发生的情况是您在对象(JSON)上使用JSON.parse

同理:

JSON.parse({}); // parse an object

因为{}变成了一个字符串:

[object Object]

这根本不是有效的 JSON。

所以,只需删除 JSON.parse

【讨论】:

  • 谢谢你的解释,伙计。
【解决方案2】:

设置dataType为json,浏览器会自动为你解析json,看看是否适合你

  function getdata(){
            $.ajax({
                    type:"GET",
                    dataType:'json',
                    contentType:'application/json',
                    url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
                    data: "",
                    success: function(data) {                           
                        displayPlaylists(data);
                    }

                });
        }

【讨论】:

  • 这个解决方案在没有添加 contentType 的情况下在 chrome 中工作,但在 IE 中仍然没有结果
【解决方案3】:

我的 javascript linter 表明它阻塞的 JSON 数据中有一个 unicode 字符。这不应该是这种情况,因为它是有效的 JSON,但这一点:

"The Syndicate Challenge #4 World At War\r\nhttp://www.youtube.com/watch?v\u003d49g7f5lkvQ8"

似乎是麻烦的根源。我不是 100% 确定,因为 firefox 似乎无论如何都能够解析数据。 unicode 字符似乎也不合适,但可能是我。

【讨论】:

  • 返回的json由jsonlint验证
  • 有没有可能给我们提供上述json数据?
  • 这是 json 数据顺便说一句:gdata.youtube.com/feeds/api/users/TheSyndicateProject/…
  • 我发现了一个不合适的 unicode 字符,但我不确定这是否是导致问题的原因。
  • 这根本不是问题,删除 JSON.parse 并将 data.data.items 传递给您的 obj。检查我上面的答案以获得解决方案。
【解决方案4】:

具有讽刺意味的是,上周我在 Chrome 中遇到了同样的问题,但我怀疑它不仅出现在 Chrome 上,而且出现在任何浏览器上。

使用 Chrome Javascript 调试器,在填充 var 'obj' 的类似处放置一个断点,并检查 'data' 数组中是否包含多个对象。如果是这样,您可能正在尝试访问位于数据对象第一个索引位置内的对象。

如果您从服务器向页面发送匿名 json 对象,请访问第一个索引,而不是直接访问数据。

像这样:

function getdata(){
        $.ajax({
                type:"GET",
                url: "https://gdata.youtube.com/feeds/api/users/TheSyndicateProject/playlists?v=2&alt=jsonc",
                data: "",
                success: function(data) {
                    var obj = data.data.items;
                    displayPlaylists(obj);
                }

            });
    }

编辑:

我自己调试了你的链接,在进一步测试之后,我发现你甚至不需要解析这个对象,真的。 看看我上面的例子,将 data.data.items 传递给你的 var obj,它将从数组中加载你所有的对象。

看看有没有帮助。

【讨论】:

  • 我不认为这会起作用,因为数据作为字符串返回,但是我发现如果添加 dataType:"json" 那么数据在到达时被解析为 json 对象,因此数据参数可以像上面那样用作对象
  • @Jono Brogan,它确实有效,我自己测试过。我只是创建了一个简单的页面,仅加载 jquery 文件和该函数,对其进行调试,然后 data.data.items 有效地加载了可访问的项目。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多