使用混合 iframe-proxy/xsl/jsonp 概念使用 Javascript 加载跨域 XML?
在我们的网站 www.foo.com
上,我们希望通过 Javascript 下载并使用 http://feeds.foo.com/feed.xml
。显然我们会使用 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
上,将 XSL 添加到 feed.xml
并使用它将 feed 转换为 html 文档,该文档还设置 document.domain
并使用 json 形式的 feed 数据调用其父级中的回调函数:
<?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>
是否有更好的方法来加载 XML来自 feeds.foo.com 以及这个 iframe-proxy/xslt/jsonp 技巧的后果是什么? (..在什么情况下会失败?)
备注
- 这在 Safari 和 Safari 中不起作用。 Chrome,但由于两者都支持Access-Control,所以没问题。
- 我们不希望对
feeds.foo.com
进行任何更改。 - 我们了解(但不感兴趣)服务器端代理解决方案
- 更新: 写过它
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用 yahoo api (YQL).. 只需指定 url、格式和回调
这是一种服务器端解决方案,但不在您的服务器上:)
You can use yahoo apis (YQL).. Just specify url, format and callback
It's kind of server-side solution, however not on your server :)
如果您可以控制两个域,则可以尝试跨域脚本库,例如 EasyXDM,它包装了跨浏览器怪癖并提供了一个易于使用的 API,用于使用该浏览器的最佳可用机制在不同域之间的客户端脚本中进行通信(例如 postMessage 如果可用,则其他机制如果没有)。
警告:您需要控制两个域才能使其正常工作(其中“控制”意味着您可以在这两个域上放置静态文件)。但您不需要更改任何服务器端代码。
另一个警告:这里存在安全隐患 - 确保您信任其他域的脚本!
If you have control over both domains, you can try a cross-domain scripting library like EasyXDM, which wraps cross-browser quirks and provides an easy-to-use API for communicating in client script between different domains using the best available mechanism for that browser (e.g. postMessage if available, other mechanisms if not).
Caveat: you need to have control over both domains in order to make it work (where "control" means you can place static files on both of them). But you don't need any server-side code changes.
Another Caveat: there are security implications here-- make sure you trust the other domain's script!