【发布时间】:2012-12-13 06:29:42
【问题描述】:
我使用 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);
}
Q) 我想在 1 和 2 之间,因为返回的数据格式类似于 jsonFlickrFeed({}),我们需要编写 jsonFlickrFeed 回调函数才能使其工作?
Q) 为什么它从不调用成功回调?
Q) 是否是 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)
});
Q) 在情况 3) 中,JQuery 如何处理它?我看到返回的数据格式为 jQuery1820349100150866434_1355379638775({}) 所以如果我假设 JQuery 完成了将 JSON 与回调相关联的工作,是否正确?
Q) 由于上述原因,它被称为 JQuery 的速记方法?
无论我尝试什么,我都无法使用 XML 数据。我一直想不出一种使用 XML 数据代替 JSON 的方法。
Q) 是否可以以类似的方式使用 XML 数据而不是 JSON?
Q) 我能想到的唯一方法是通过同一域代理数据。这种理解正确吗?
如果有帮助的话,XML example 我在 Dropbox 上。这是为了证明当XML数据来自同一个域时,它可以被解析。
【问题讨论】:
-
以上所有问题都有一个简单的答案; JSONP 通过在页面中插入脚本标签来工作,就像任何脚本标签一样,这就是为什么一些常规函数不起作用的原因,因为它不是真正的 XMLHttpRequest。至于以同样的方式获取XML,不,那是不可能的(获取XML当然是可能的,只是与JSONP的方式不同)。
-
你看过 CORS 吗? en.wikipedia.org/wiki/Cross-origin_resource_sharing 如果您的浏览器要求不是太宽泛 (caniuse.com/cors),那么它是一种更直接的跨域 XHR 方法。
-
@joshuacronemeyer 是的,我有。在大多数情况下它没有帮助。对我来说 JSON 不是问题,它消耗 XML。
-
我相信@adeneo 回答得当场。
标签: javascript jquery ajax xmlhttprequest