0

我使用 JavaScript 和 AJAX 已经有一段时间了,我想了解 Cross Domain XHR 是如何工作的以及 JQuery 是如何处理它的,出于某种原因,我从来没有想过它是如何工作的。我已经阅读了Wikipedia JSONP文章,我更加困惑。我不确定我不明白什么。

我知道使用JSONP我可以JSON直接在 JavaScript 中使用数据。例如这个 JS Fiddle 例子。在这里,我JSON用来显示图像列表。我可以使用XML数据来实现同样的目标吗?在回答这部分问题之前,请阅读类比的其余部分。

1)如果我尝试类似下面的东西或小提琴链接我得到错误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)下面的例子或小提琴链接工作正常

$.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 回调函数才能使其工作?

Q) 为什么它从不调用成功回调?

Q) 是 Fl​​ickr 端点完成返回 JSONP 的工作吗(我的意思是格式中的数据jsonFlickrFeed({}))?或者它只是返回实际的 JSON 和 JQuery 填充它?

3)$.getJSON代码如下所示或小提琴

$.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) 我能想到的唯一方法是通过同一个域代理数据。这种理解正确吗?

如果它在这里有帮助的话是我在 Dropbox 上的XML 示例。这是为了证明当 XML 数据来自同一个域时,它可以被解析。

4

2 回答 2

1

Q) 是否可以以类似的方式使用 XML 数据而不是 JSON?

不,因为 JSONP 不是 json,它是 javascript。客户端需要来自服务器的脚本,该脚本在客户端上执行。“JSONP”是一种使用脚本标签来获取 javascript 对象的技巧。您可以在 javascript 对象中以字符串形式发送 XML。

Q) 我能想到的唯一方法是通过同一个域代理数据。这种理解正确吗?

或者让服务器支持 CORS

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

我的观点是,如果域默认情况下不允许来自客户端脚本的 X 源请求,那么您将无能为力。某些浏览器可能允许它,但这不是默认行为。在这种情况下,唯一的选择是同一域上的代理。

于 2012-12-13T06:37:18.050 回答
0

@adeneo 回答了这个问题,但在评论中。所以我的理解JSONP从根本上是有缺陷的。当发出 JSONP 请求时,它不是 XHR 请求。相反,需要注意的是script动态插入标签并获取JSON. 因此,即使调用看起来像 XHR(至少 IMO JQuery),它也不是。根本不使用 XMLHttpRequest 对象。

这个问题已经回答过了JSONP 到底是什么?但我以前不知何故错过了它。另一个解释跨域请求的好资源是devlog

我提出的其他问题变得多余了!

于 2013-01-17T14:27:44.927 回答