使用混合iframe-proxy / xsl / jsonp概念使用Javascript加载跨域XML?
作者:互联网
我们希望在我们的网站www.foo.com上下载并使用带有Javascript的http://feeds.foo.com/feed.xml.我们显然会使用Access-Control,但对于不支持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并在其父级中使用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&中无法使用Chrome,但由于两者都支持Access-Control,所以很好.
>我们希望feeds.foo.com几乎没有变化
>我们知道(但不感兴趣)服务器端代理解决方案
>更新:wrote about it
解决方法:
如果您可以同时控制两个域,则可以尝试使用跨域脚本库(例如EasyXDM),该库包装了跨浏览器的怪癖,并提供了一种易于使用的API,可以使用针对该域的最佳可用机制在客户端脚本中进行通信.浏览器(例如,如果有postMessage,则没有其他机制).
注意:您需要同时控制两个域才能使其正常工作(“控制”意味着您可以在两个域上都放置静态文件).但是您不需要任何服务器端代码更改.
另一个警告:这里涉及安全性-确保您信任另一个域的脚本!
标签:cross-site,cross-domain,xml,javascript 来源: https://codeday.me/bug/20191210/2101313.html