以前,Google的Friend Connect要求用户将几个文件上传到他们的网站以启用跨域通信,而Facebook Connect仍然需要您上传单个文件才能启用它。
现在,Friend Connect不需要任何文件上传......我想知道他们是如何实现这一目标的。
答案 0 :(得分:6)
在不同域上的文档之间有多种通信方式,其中包括HTML5 postMessage,NIX,FIM(散列/片段),frameElement以及使用window.name属性。
这些可在不同的浏览器和不同的版本中使用,但它们共同允许您进行可靠的XDM(跨域消息传递)。
之前完成此项目的一个项目是Apache Shindig,它可能开创了其中的一部分,最近,项目easyXDM已经出现,通过一个通用的API统一所有这些方法,使其变得简单使用XDM和RPC创建复杂的应用程序。
您可以在this article at Script Junkie中深入了解传输数据的各种方法。
现在,为了直接回答你的问题,早些时候很容易相信只有postMessage,FIM(片段标识符消息)可用,而后者有效工作,通常需要上传一个特殊的文件到你的域名。随着越来越多的方法被发现,许多方法已被弃用作为一种技术,因此;不再需要该文件。
仅供记录;我是Script Junkie文章和easyXDM库的作者(就像Twitter,Disqus和其他一些人正在使用的那样)。
答案 1 :(得分:4)
< edit>现在很难记住/验证,但我相信我的答案可能不正确。 Sean Kinsey上面的答案应该是这个问题的明确答案。如果您正在阅读此内容,请提出他的回答并忽略我的回答。< / edit>
Google Friend Connect小部件与大多数广告/小工具一样,使用HTML的复制/粘贴代码段来引用主机服务器上的JavaScript包含,然后创建包含所需内容的iframe。通过在网址中打开包含您网站ID的iframe,Google的服务器可以生成相应的HTML文档,以代表您特定网站/设置的Google朋友群小工具。
除了使用适当的URL目标创建iframe的初始步骤之外,没有任何跨站点通信发生。小工具动态生成的iframe中的所有内容更像是用户访问了Google服务器上的单独页面,但是显示的内容会嵌入/隔离在您网页上的某个块中。
答案 2 :(得分:0)
我不确定它在这个特定实例中是如何工作的,但是跨域消息传递可以通过postMessage()API完成,也可以通过更改URL的哈希部分并监视它来实现。
散列更改方法有效,因为封闭页面和封闭页面都可以访问随附页面的URL。
当然,希望postMessage()API调用随着时间的推移变得更加标准化。
答案 3 :(得分:0)
JSON允许跨域javascript。
答案 4 :(得分:0)
除了使用somewindow.postMessage();
进行跨域iframe之间的通信之外,没有其他方法。
在somewindow.postMessage()
之前,您必须上传文件,以确保您可以在iframe之间建立通信。
示例:
<html>
<!-- this is main domain www.example.com -->
<head>
</head>
<body>
<iframe src="http://www.exampleotherdomain.com/">
<script>
function sendMsg(a) {
var f = document.createElement('iframe'),
k = document.getElementById('ifr');
f.setAttribute('src', 'http://www.example.com/xdreciver.html#myValueisSent');
k.appendChild(f);
k.removeChild(f);
}
</script>
<div id="ifr"></div>
</iframe>
</body>
</html>
现在是http://www.example.com/xdreciver.html html内容:
<html>
<!-- this is http://www.example.com/xdreciver.html -->
<head>
<script>
function getMsg() {
return window.location.hash;
}
</script>
</head>
<body onload="var msg = getMsg(); alert(msg);">
</body>
</html>
至于使用.postMessage();足以使用top.postMessage('my message to other domain document, which is also the main document', 'http://www.theotherdomain.com');