我整个上午都在阅读这个主题,但我仍对结果感到困惑。
根据我的理解,JQuery .ajax .get不能使用datatype =“xml”跨浏览器工作,但是下面的RSS提要确实有效
var rssurl = 'http://gdata.youtube.com/feeds/base/videos/-/trees?orderby=published&alt=rss';
然而,当我尝试拨打另一个Feed时,它无效。它给出了一个解析错误。
var rssurl = 'http://api.flickr.com/services/feeds/photos_public.gne?tags=trees&format=rss2'
现在,当我在本地复制并调用它时,这个不起作用的源确实有效。这就是为什么我认为这是一个跨域问题。
此外,在Fiddler中查看时,我可以看到Feed已下载。我觉得奇怪的是,如果这是一个跨域调用,为什么会这样呢?肯定会在提取源之前停止?
在提取Feed的代码下方。
$.ajax({
type: "GET",
url: rssurl,
dataType: "xml",
success: function(data, textStatus, jqXHR) {
document.write("got the feed: "+ textStatus+"
");
var $xml = $(data);
$xml.find("item").each(function() {
var $this = $(this),
document.write( $this.find("title").text() );
});
},
error: function(jqXHR, textStatus, errorThrown){
alert('failure');
console.log('status: ' + textStatus);
if (textStatus == 'error')
console.log(errorThrown);
}
);
所以我的问题:
欢呼声
答案 0 :(得分:1)
CORS norm指定浏览器要求服务器授权将内容嵌入来自其他来源的帧中。所有现代浏览器都遵循这一规范。
当您询问api.flickr.com时,它不会授予您授权。
但是当你问gdata.youtube.com时,它会回答这个标题:
HTTP/1.1 200 OK
X-GData-User-Country: FR
Access-Control-Allow-Origin: http://fiddle.jshell.net
Content-Type: text/xml; charset=UTF-8
Expires: Fri, 01 Jun 2012 19:41:43 GMT
Date: Fri, 01 Jun 2012 19:41:43 GMT
Cache-Control: private, max-age=1800, no-transform
Vary: *
GData-Version: 1.0
Last-Modified: Fri, 01 Jun 2012 19:41:43 GMT
Content-Encoding: gzip
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
所以你看到你被授权嵌入内容(这里我要求一个小提琴因此http://fiddle.jshell.net,但服务器可能只回答'*'意味着所有起源而不打扰个性化这部分标题)。
结论是合乎逻辑的:如果服务允许,您可以包含跨域部分。
请记住,它主要是一个浏览器侧锁,可以保护您作为用户(以及您的数据)免受注射。
答案 1 :(得分:0)
回答你的问题:
您提出了一个有趣的观点,即某些浏览器确实会加载该文件(由Fiddler确认)。相比之下,IE根本不加载文件。我不知道答案,但听到对这一点的解释会很有趣。