【发布时间】:2009-10-25 20:49:01
【问题描述】:
目前我依靠代理脚本来处理单源策略的这个问题。它很慢,并且会产生开销。更何况,没有渲染 javascript。
有没有可行的替代方案?
【问题讨论】:
标签: javascript proxy cross-domain
目前我依靠代理脚本来处理单源策略的这个问题。它很慢,并且会产生开销。更何况,没有渲染 javascript。
有没有可行的替代方案?
【问题讨论】:
标签: javascript proxy cross-domain
如果您可以将回调名称作为参数提供给提供相关 JavaScript 代码的服务,那么您可以将脚本标记附加到您的文档中,并使用指向服务调用的 src 属性。否则,你就不走运了。
【讨论】:
对所有最新的主流浏览器(Firefox、IE、Safari、Chrome 等)使用 iframe 并尝试使用 window.postMessage(message, origin)(iframe 中的 parent.postMessage 和首页中的 iframeElement.contentWindow.postMessage)和为旧浏览器更改/轮询window.name。
【讨论】:
天哪,我认为您正在寻找的解决方案是使用 IFRAME。然而,iframe 方法既是一项精神任务,也是一项技术任务。我建议您从本指南开始:
Cross-Domain Communication with IFrames
另一种方法是使用脚本标签和 json 从另一台服务器异步获取数据:
<script src="http://remotesite.com/path/to/script/blah.js"></script>
您可以创建一个新的 SCRIPT 标记元素来传递和加载数据并附加到 DOM 或将标记插入到元素 innerHTML。
我相信您可以找到一些详细的示例和实现方法,但是您应该使用新的 SCRIPT 方法跟踪的一件事是向 DOM 添加如此多的内容。这可能会有所帮助并为您提供一个起点:
function require (url, callback) {
if (!isScriptLoaded(url)) {
document.write('<script src="' + url + '" type="text/javascript" charset="utf-8"><\/script>');
if (callback) {
callback();
}
}
}
function isScriptLoaded(src) {
var scriptsLoaded = {};
var scriptTags = document.getElementsByTagName("script");
for (var i = 0, script; script = scriptTags[i]; i++) {
if (script.src) {
scriptsLoaded[script.src] = 1;
}
};
if (scriptsLoaded[src]) {
return true;
}
return false;
}
(未经测试,但应该工作!)
无论如何 - 祝你好运。
【讨论】:
JSON-P 非常适合这种事情。如果您使用 jQuery 或类似的 JavaScript 库,您的工作会变得更加轻松:
http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback
当然,这将取决于您尝试执行的具体操作,这将决定是否使用 JSON-P、隐藏 iframe、postMessage、Flash 代理或任何其他奇特的解决方案。
【讨论】:
如果您控制这两个域并且只关心 Firefox 3.5+,则可以使用 XMLHttpRequest 对象并使用Access Control 设置权限。
【讨论】: