使用混合iframe-proxy / xsl / jsonp概念使用Javascript加载跨域XML?

时间:2009-12-09 17:11:32

标签: javascript xml cross-domain cross-site

在我们的网站www.foo.com,我们想要使用Javascript下载并使用http://feeds.foo.com/feed.xml。我们显然会使用Access-Control,但对于不支持它的浏览器,我们会将以下内容视为后备:

www.foo.com ,我们设置document.domain,提供回调函数并将Feed加载到(隐藏)iframe中:

document.domain = 'foo.com';
function receive_data(data) {
 // process data
};

var proxy = document.createElement('iframe');
proxy.src = 'http://feeds.foo.com/feed.xml';
document.body.appendChild(proxy);

feeds.foo.com 上,向feed.xml添加一个XSL并使用它将Feed转换为也设置document.domain并调用回调函数的html文档在其父级中,Feed数据为json:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:template match="ROOT">
  <html><body>
   <script type="text/javascript">
    document.domain = 'foo.com';
    parent.receive_data([<xsl:apply-templates/>]);
   </script>
  </body></html>
 </xsl:template>
 <!-- templates that transform data into json objects go here -->
</xsl:stylesheet>

有没有更好的方法从feeds.foo.com加载XML,这个iframe-proxy / xslt / jsonp技巧的后果是什么? (..在什么情况下会失败?)


说明

  • 这在Safari&amp; Chrome,但由于两者都支持Access-Control,这很好。
  • 我们希望对feeds.foo.com
  • 进行很少或不做任何更改
  • 我们知道(但不感兴趣)服务器端代理解决方案
  • 更新: wrote about it

2 个答案:

答案 0 :(得分:2)

您可以使用yahoo apis(YQL)..只需指定网址,格式和回调

这是一种服务器端解决方案,但不在您的服务器上:)

答案 1 :(得分:1)

如果您可以控制这两个域,则可以尝试使用EasyXDM等跨域脚本库,它包含跨浏览器的怪癖,并提供易于使用的API,以便在不同域之间的客户端脚本中进行通信使用该浏览器的最佳可用机制(如果可用,例如postMessage,否则使用其他机制)。

警告:您需要控制两个域才能使其工作(“控制”意味着您可以在两个域上放置静态文件)。但是您不需要任何服务器端代码更改。

另一个警告:这里有安全隐患 - 请确保您信任其他域的脚本!