我有一个包含iframe和iframe的窗口,如下所示:

+---------------+
|      Top      |
| +-----------+ |
| |   Middle  | |
| | +-------+ | |
| | | Inner | | |
| | +-------+ | |
| +-----------+ |
+---------------+

“顶部”和“中间”位于同一域中,而“内部”位于不同域中。我需要Inner与Top交流。我知道做到这一点的唯一方法是IE7(我需要支持)支持该方法,即更改窗口位置的哈希值。但是,我不希望信息在位置栏中闪烁,因此,我介绍了Middle iframe。

我希望Inner更改Middle的哈希。 Middle将读取其哈希值,并通知Top,它有权直接与谁交谈。

但是,在Firefox 3中,我无法从Inner写入Middle的哈希。不会引发任何错误,但是散列看起来没有变化。写入其location.href会引发权限错误。

Top可以写Middle的哈希值,而Middle可以写Inner的哈希值,Top可以写Inner的哈希值,Inner和Middle都可以写Top的哈希值,所以唯一不起作用的对是我想! (我已经为此工作了一段时间。)

我已经在一个最小的测试案例中重现了这一点。最初,我在同一个域中为所有三个页面提供服务。当我将Inner放在其他域上时,会出现有问题的行为。当我将Middle放在第二个域时,每个人都可以再次写信给每个人。

为什么Inner无法写Middle的哈希值?

附录:许多人建议,由于同源政策,这应该是不可能的。这正是我正在努力解决的政策。这种确切的情况-设置(但不读取)另一个窗口的位置-应该可以跨域使用。我还没有找到达到这种效果的浏览器文档,但是我发现了很多文章和演示。从本质上讲,这是HTML 5的postMessage()的前身。

引用:http://softwareas.com/cross-domain-communication-with-iframes

最佳答案

父框架可以使用以下方法设置子项的iframe'src'属性(此处为jquery):

$("#iframeWindow").attr('src', "http://<CHILD URL>/#hello");

子iframe可以使用以下方法设置父窗口的href(地址栏内容):
window.top.location.href = "http://<PARENT URL>/#hello"

在 parent 和/或 child 中,您需要轮询更改,
var last = "";
setInterval(function() {
    if(last == window.location.href) return;
    last = window.location.href;

    //do stuff with 'window.location.hash'
}, 1000);

请注意,如果可以的话
window.top.location.href = window.top.location.href + "#hello"

但不允许读取位置对象(href和哈希)

已于11月3日在chrome(即6/7/9,firefox 3.6/4)上进行了测试

edit1:如果人们愿意,可以进行演示

edit2:http://dl.dropboxusercontent.com/u/14376395/html/xdomain.html :)

edit3:当心:如果您使用的是这种方法,请确保您对所有iframe的页面都具有控制权,否则邪恶的第3方网站可能会使用哈希标签来控制您的页面

edit4:Google JavaScript API当前正在使用的更好的解决方案http://ternarylabs.com/2011/03/27/secure-cross-domain-iframe-communication/

edit5:投递箱域名更改为“dl.dropboxusercontent.com”

09-25 18:20
查看更多