Javascript 理解跨域XHR和XML数据

Javascript 理解跨域XHR和XML数据,javascript,jquery,ajax,xmlhttprequest,Javascript,Jquery,Ajax,Xmlhttprequest,我使用JavaScript和AJAX已经有相当一段时间了,我想了解跨域XHR是如何工作的,以及JQuery是如何处理它的,出于某种原因,我从来没有想过它是如何工作的。我读了这篇文章,我更困惑了。我不确定我不理解的是什么 我知道使用JSONP可以直接使用JavaScript中的JSON数据。例如这里我使用JSON来显示图像列表。我可以用XML数据来实现同样的功能吗?在回答这部分问题之前,请先阅读其余的类比 1) 如果我尝试下面这样的操作,或者得到错误uncaughtreferenceerror:j

我使用JavaScript和AJAX已经有相当一段时间了,我想了解跨域XHR是如何工作的,以及JQuery是如何处理它的,出于某种原因,我从来没有想过它是如何工作的。我读了这篇文章,我更困惑了。我不确定我不理解的是什么

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

1) 如果我尝试下面这样的操作,或者得到错误
uncaughtreferenceerror:jsonFlickrFeed未定义

​$.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);
}
Q) 我假设在1和2之间,因为返回的数据是类似于
jsonFlickrFeed({})
的格式,我们需要编写jsonFlickrFeed回调函数来让它工作吗

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

Q) 是Flickr端点完成了返回JSONP(我指的是格式为
jsonFlickrFeed({})
)的数据)的工作吗?或者它只是返回实际的JSON,而JQuery将其填充

3) 使用
$.getJSON
时,代码如下或

Q) 在案例3中JQuery是如何处理的?我看到返回的数据的格式是
jquery182349100150866434_1355379638775({})
,所以如果我假设JQuery执行将JSON与回调关联的任务,那么它正确吗

Q) 出于上述原因,它被称为JQuery的速记方法

无论我尝试了什么,我都无法使用XML数据。我还没有想到一种使用XML数据而不是JSON的方法

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

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

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

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

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

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

或者让服务器支持CORS


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

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

这个问题已经得到了回答,但我以前不知怎么错过了。另一个解释跨域请求的好资源是


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

以上所有问题都有一个简单的答案;JSONP的工作原理是在页面中插入一个脚本标记,就像任何脚本标记一样,这就是为什么一些常规函数不能工作的原因,因为它不是真正的XMLHttpRequest。至于以同样的方式获取XML,不,这是不可能的(获取XML当然是可能的,只是与JSONP的方式不同)?如果您的浏览器需求不太广泛(),那么跨域XHR是一种更简单的方法。@joshuacronemeyer是的,我有。这在大多数情况下都没有帮助。对我来说,JSON不是问题所在,它使用XML。我相信@adeneo能很好地回答这个问题。你确实回答了我的问题(+1),但我觉得它不够清晰,所以我没有接受你的回答。
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", {
    format: "json"
}, function(d) {
    console.log(d)
});​