在我的代码中我有:
$.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:意外的令牌:
{
"kind": "fusiontables#sqlresponse",
....
如果我用实际文件替换url并删除dataType,则所有工作都按预期工作!
我已经在http://chapters.zmgc.net验证了http://jsonlint.com/的输出,这没关系。
查看从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我想用读取远程数据替换本地文件?
我错过了什么?
答案 0 :(得分:2)
你不应该将类型设置为jsonp
,即带有填充的JSON,因为假设响应被包装在函数调用中。
callback({payload: values});
并将尝试执行。
而是使用type:json,或简称为$.getJSON
,它将使用$.parseJSON
正确传递JSON有效内容。
答案 1 :(得分:1)
这是因为你要求JSONP(带填充的JSON)并获得没有填充的JSON。 JSONP是由函数调用填充的JSON,使其工作的唯一方法是在服务器上添加对JSONP的支持。
如果您无法访问chapters.zmgc.net
,则必须与他们联系并要求他们添加对JSONP的支持。
如果您有访问权限,可以将?callback=parseThis
添加到您的网址,然后在服务器端读取该变量并相应地填充您的JSON:
parseThis(/* put your json in here */);
但是,如果你没有定义自己的回调,jQuery会自动添加一个你可以使用的回调。它们看起来像这样:jQuery18200710562220774591_1355419375476
答案 2 :(得分:0)
由于Ajax使用jsonp(带填充的json),但你的url似乎不兼容jsonp,所以你必须避免使用它。
来自jQuery的:
“jsonp”:使用JSONP加载JSON块。添加一个额外的 “?回调=?”到URL的末尾以指定回调。禁用 通过将查询字符串参数“_ = [TIMESTAMP]”附加到缓存来缓存 URL除非cache选项设置为true。
更多信息:http://bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/