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

发布于 2024-08-14 06:49:07 字数 1776 浏览 7 评论 0 原文

在我们的网站 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 进行任何更改。
  • 我们了解(但不感兴趣)服务器端代理解决方案
  • 更新: 写过它

On our site www.foo.com we want to download and use http://feeds.foo.com/feed.xml with Javascript. We'll obviously use Access-Control but for browsers that don't support it we are considering the following as a fallback:

On www.foo.com, we set document.domain, provide a callback function and load the feed into a (hidden) 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);

On feeds.foo.com, add an XSL to feed.xml and use it to transform the feed into an html document that also sets document.domain and calls the callback function in its parent with the feed data as 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>

Is there a better way to load XML from feeds.foo.com and what are the ramifications of this iframe-proxy/xslt/jsonp trick? (..and in what cases will it fail?)


Remarks

  • This does not work in Safari & Chrome but since both support Access-Control it's fine.
  • We want little or no change to feeds.foo.com
  • We are aware of (but not interested in) server-side proxy solutions
  • update: wrote about it

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

老娘不死你永远是小三 2024-08-21 06:49:07

您可以使用 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 :)

涫野音 2024-08-21 06:49:07

如果您可以控制两个域,则可以尝试跨域脚本库,例如 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!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文