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