我有一个函数示例,它检索json数据并发出警报。
在这个例子中,一切顺利:http://jsbin.com/uwupa3/edit
$(document).ready(function(){
var timeService = "http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?";
$.getJSON(timeService, function(data) {
alert(data);
});
});
但在第二个例子中,没有显示警告。 为什么?唯一的区别是检索json的服务。 json-object对我来说看起来非常有用:http://jsbin.com/uwupa3/2/edit
$(document).ready(function(){
var timeService = "http://json-time.appspot.com/time.json?tz=Europe/Brussels";
$.getJSON(timeService, function(data) {
alert(data);
});
});
我没有JS错误。我也试过这个本地(所以不是在JSbin上,而是在我的电脑上有一个htm文件),这也不起作用。
有人可以解释我做错了吗?
答案 0 :(得分:8)
您正在使用域外的网址,这意味着$.getJSON
不会使用XmlHttpRequest,而是使用某些JSONP - 请参阅documentation of $.getJSON
:
如果指定的URL位于远程 服务器,请求被视为 相反,JSONP。参见讨论
$.ajax()
中的jsonp数据类型 更多细节。
如果您查看$.ajax
的jsonp
选项的文档,您会看到:
覆盖回调函数名称 一个jsonp请求。这个值将是 用来代替'回调' '回调=?'查询字符串的一部分 在GET的url或a的数据中 POST。所以{jsonp:'onJsonPLoad'}会 导致'onJsonPLoad =?'传递给 服务器。
对于jsonpCallback
选项:
指定回调函数名称 一个jsonp请求。这个值将是 用来代替随机名称 由jQuery自动生成。
对于您的第一个请求,网址中有jsoncallback
个参数;对于您的第二个请求,没有这样的参数:
http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?
http://json-time.appspot.com/time.json?tz=Europe/Brussels
我想这与第二个请求没有做你想要的事实有关?
答案 1 :(得分:1)
您使用的是域外的网址,这意味着$.getJSON
不会使用XmlHttpRequest
,而是会使用JSONP
- 请参阅$ .getJSON的文档:
如果指定的URL位于远程服务器上,则将该请求视为 相反,JSONP。请参阅$ .ajax()中对jsonp数据类型的讨论 了解更多详情。
如果您查看$ .ajax的jsonp选项文档,您会看到:
覆盖jsonp请求中的回调函数名称。这个值 将在'callback =?'中使用而不是'callback'的一部分 在GET的url中查询字符串或POST的数据。所以 {jsonp:'onJsonPLoad'}会导致'onJsonPLoad =?'传递给了 服务器
对于jsonpCallback选项: