您应该使用一个对其进行抽象的库(例如 http://easyxdm.net/wp/ ,未经测试)。 Fragment ID 消息传递可能不适用于所有浏览器,有更好的方法,例如postMessage。
但是,您的示例 (Clipper) 使用了一个名为 fragment id messaging 的 hack。这可以是跨浏览器的,前提是包含您的 iframe 的页面是顶层。换句话说,总共有两个级别。基本上,孩子设置了父母的片段,父母对此进行监视。
这与 Clipper 的方法类似:
父.html
<html>
<head>
<script type="text/javascript">
function checkForClose()
{
if(window.location.hash == "#close_child")
{
var someIframe = document.getElementById("someId");
someIframe.parentNode.removeChild(someIframe);
}
else
{
setTimeout(checkForClose, 1000)
}
}
setTimeout(checkForClose, 1000);
</script>
</head>
<body>
<iframe name="someId" id="someId" src="child.html" height="800" width="600">foo</iframe>
</body>
</html>
child.html:
<html>
<head>
<script type="text/javascript">
setTimeout(function(){window.parent.location.hash = "close_child";}, 5000);
</script>
<body style="background-color: blue"></body>
</html>
EDIT2:跨域和独立控制是不同的。我深入研究了(高度缩小/混淆的)Polyvore 代码,看看它是如何工作的(顺便说一下,它在 Firefox 中没有)。首先要记住,诸如 Clipper 之类的小书签在它们启动时存在于打开的页面的上下文中。在这种情况下,小书签会加载 a script ,然后运行一个生成 an iframe 的 init 函数,但也会运行:
Event.addListener(Event.XFRAME, "done", cancel);
如果您深入了解 addListener,您会发现 (beautified):
if (_1ce2 == Event.XFRAME) {
if (!_1cb3) {
_1cb3 = new Monitor(function () {
return window.location.hash;
},
100);
Event.addListener(_1cb3, "change", onHashChange);
}
}
取消包括:
removeNode(iframe);
现在,剩下的唯一部分是 iframe page 使用 ClipperForm.init 函数加载 another script,其中包括:
Event.addListener($("close"), "click", function () {
Event.postMessage(window.parent, _228d, "done");
});
所以我们清楚地看到他们正在使用片段 ID 消息传递。