-1

在我的代码中,我有:

   $.ajax({
       url: 'http://chapters.zmgc.net',
       dataType: 'jsonp',
      success: function(d){   // "Type","Name","Link","Contact","Location","Icon"
        Tabzilla.zgContacts = d;
        var countries = [];
        d.rows.forEach(function(row){
          if (row[0] == 'Country') countries.push(
            {link:row[2], contact:row[3], country: row[4]}
          );     
        });

但我收到一个错误,Uncaught SyntaxError: Unexpected token :

{
 "kind": "fusiontables#sqlresponse",
....

如果我用实际文件替换 url 并删除 dataType,一切都按预期工作!

我已经在http://jsonlint.com/验证了http://chapters.zmgc.net的输出,没关系。

查看从http://chapters.zmgc.net返回的响应标头,它是:

Connection:keep-alive
Content-Type:application/json
Date:Thu, 13 Dec 2012 17:02:27 GMT
Transfer-Encoding:chunked

这是代码https://github.com/tomarcafe/Z-Tabzilla/blob/gh-pages/z-tabzilla.js#L282我想用读取远程数据替换本地文件?

我错过了什么?

4

3 回答 3

2

您不应该将 type 设置为jsonp,即带有填充的 JSON,因为它假定响应包含在函数调用中。

callback({payload: values});

并将试图被处决。

而是使用 type: json,或者简单地使用 .json$.getJSON正确传递 JSON 有效负载$.parseJSON

于 2012-12-13T17:13:43.897 回答
1

这是因为您要求 JSONP(带填充的 JSON)并获得不带填充的 JSON。JSONP 是由函数调用填充的 JSON,使其工作的唯一方法是在服务器上添加对 JSONP 的支持。

如果您无权访问,chapters.zmgc.net则必须联系他们并要求他们添加对 JSONP 的支持。

如果您确实有权访问,您可以添加?callback=parseThis到您的 url,然后在服务器端读取该变量并相应地填充您的 JSON:

parseThis(/* put your json in here */);

但是,如果您没有定义自己的回调,jQuery 会自动添加一个您可以使用的回调。它们看起来像这样:jQuery18200710562220774591_1355419375476

于 2012-12-13T17:10:06.533 回答
0

由于 Ajax 使用 jsonp(带填充的 json),但您的 url 似乎与 jsonp 不兼容,因此您必须避免使用它。

来自 jQuery:

“jsonp”:使用 JSONP 加载到 JSON 块中。添加一个额外的“?callback =?” 到 URL 的末尾以指定回调。通过将查询字符串参数“_=[TIMESTAMP]”附加到 URL 来禁用缓存,除非缓存选项设置为 true。

更多:http: //bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/

于 2012-12-13T17:18:37.790 回答