3

在我们的网站上www.foo.com,我们想下载并使用http://feeds.foo.com/feed.xmlJavascript。我们显然会使用Access-Control,但对于不支持它的浏览器,我们正在考虑以下作为后备:

在 上www.foo.com,我们设置document.domain,提供回调函数并将提要加载到(隐藏)中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,添加一个 XSLfeed.xml并将其用于将提要转换为 html 文档,该文档还设置document.domain和调用其父级中的回调函数,提要数据为 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 和 Chrome 中不起作用,但由于两者都支持访问控制,所以很好。
  • 我们希望很少或根本没有改变feeds.foo.com
  • 我们知道(但不感兴趣)服务器端代理解决方案
  • 更新: 写了关于它
4

2 回答 2

2

您可以使用 yahoo api ( YQL ).. 只需指定 url、格式和回调

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

于 2010-02-11T21:30:15.647 回答
1

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

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

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

于 2010-05-04T18:06:37.603 回答