了解跨域XHR和XML数据

我一直在使用JavaScript和AJAX很长一段时间,我想了解Cross Domain XHR如何真正起作用以及JQuery如何处理它,出于某种原因我从来没有想过要考虑它是如何工作的。 我读过维基百科JSONP文章,我更困惑。 我不确定我不理解的是什么。

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

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

问)为什么它永远不会调用成功回调?

问)Flickr端点是否能完成返回JSONP的工作(我的意思是jsonFlickrFeed({})格式的数据)? 或者只是返回实际的JSON和JQuery pad呢?

3)使用$.getJSON代码就像下面或者小提琴一样

 $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", { format: "json" }, function(d) { console.log(d) });​ 

问)在案例3)中,JQuery如何处理它? 我看到返回的数据格式为jQuery1820349100150866434_1355379638775({})所以,如果我假设JQuery将JSON与回调相关联的工作是否正确?

Q)由于上述原因,它被称为JQuery的简写方法?

从我尝试的任何东西,我都没有使用XML数据。 我无法想到使用XML数据而不是JSON的方法。

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

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

如果它有帮助,这是我在dropbox上的XML示例 。 这是为了certificate它可以在源自同一域时解析XML数据。

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

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

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

或使服务器支持CORS

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

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

@adeneo在评论中回答了这个问题。 所以我对JSONP理解存在根本缺陷。 发出JSONP请求时,它不是XHR请求。 相反,要点是动态插入script标记并获取JSON 。 所以即使这个调用看起来像XHR(至少是IMO JQuery),但事实并非如此。 根本不使用XMLHttpRequest对象。

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

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