我一直在使用JavaScript和AJAX很长一段时间,我想了解Cross Domain XHR如何真正起作用以及JQuery如何处理它,出于某种原因我从来没有想过要考虑它是如何工作的。我看过Wikipedia JSONP文章,我更困惑。我不确定我不理解的是什么。
我知道使用JSONP
我可以直接在JavaScript中使用JSON
数据。例如this JS Fiddle example。在这里,我使用JSON
来显示图像列表。我可以使用XML
数据来实现相同的功能吗?在回答这部分问题之前,请先阅读其余的类比。
1)如果我尝试下面的内容或Fiddle link,我会收到错误Uncaught ReferenceError: jsonFlickrFeed is not defined
$.ajax({
url: "http://api.flickr.com/services/feeds/photos_public.gne",
data: {
format: "json"
},
dataType: "jsonp",
success: function(d) {
console.log(d);
}
});
2)以下示例或fiddle link正常工作
$.ajax({
url : "http://api.flickr.com/services/feeds/photos_public.gne",
data: {format: "json"},
dataType: "jsonp"
});
jsonFlickrFeed = function(d){
console.log(d);
}
问)我认为介于1和2之间,因为返回的数据格式为jsonFlickrFeed({})
,我们需要编写jsonFlickrFeed回调函数才能使其正常工作?
问)为什么它永远不会调用成功回调?
问)Flickr端点是否能完成返回JSONP的工作(我指的是格式为jsonFlickrFeed({})
的数据)?或者只是返回实际的JSON和JQuery填充它?
3)使用$.getJSON
代码如下所示,或fiddle
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", {
format: "json"
}, function(d) {
console.log(d)
});
问)在案例3)中,JQuery如何处理它?我看到返回的数据格式为jQuery1820349100150866434_1355379638775({})
所以,如果我假设JQuery将JSON与回调相关联的工作是否正确?
问)由于上述原因,它被称为JQuery的简写方法?
无论我尝试过什么,我都无法使用XML数据。我无法想到使用XML数据而不是JSON的方法。
问)是否可以以类似的方式使用XML数据而不是JSON?
Q)我能想到的唯一方法是通过相同的域代理数据。这种理解是否正确?
如果它有帮助,XML example我有dropbox。这是为了证明当XML数据来自同一个域时可以解析它。
答案 0 :(得分:1)
问)是否可以以类似的方式使用XML数据而不是JSON?
不,因为JSONP不是json,它是javascript。客户端需要来自服务器的脚本,它在客户端上执行。 “JSONP”是一个使用脚本标记来获取javascript对象的技巧。 您可以在javascript对象中以字符串形式发送XML。
Q)我能想到的唯一方法是通过相同的域代理数据。这种理解是否正确?
或使服务器支持CORS
http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
我的观点是,如果域不允许来自客户端脚本的默认X源请求,则无法对此做任何事情。有些浏览器可能允许它,但它不是默认行为。在这种情况下,唯一的选择是同一域上的代理。
答案 1 :(得分:0)
@adeneo在评论中回答了这个问题。因此,我对JSONP
的理解存在根本缺陷。发出JSONP请求时,它不是XHR请求。相反,需要动态插入script
标记并获取JSON
。所以即使这个调用看起来像XHR(至少是IMO JQuery),但事实并非如此。根本不使用XMLHttpRequest对象。
这个问题已经回答What is JSONP all about?但我以前错过了它。解释跨域请求的另一个好资源是devlog
我提出的其他问题变得多余了!