代码之家  ›  专栏  ›  技术社区  ›  Peeja

为什么iframe不能设置其父级的location.hash?

  •  5
  • Peeja  · 技术社区  · 17 年前

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

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

    我想让Inner改变Middle的哈希值。Middle将读取其哈希值并通知Top,它有权直接与Top通话。

    location.href 引发权限错误。

    仅订购一对

    为什么Inner不能写入Middle的哈希值?


    postMessage() .

    裁判: http://softwareas.com/cross-domain-communication-with-iframes

    6 回复  |  直到 17 年前
        1
  •  7
  •   jpillora    13 年前

    父框架可以使用以下命令设置子框架的iframe“src”属性(此处使用jquery):

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

    window.top.location.href = "http://<PARENT URL>/#hello"
    

    在父级和/或子级中,您需要轮询更改,

    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和hash)

    11月3日在chrome、ie6/7/9、firefox 3.6/4上进行了测试

    edit1:如果人们愿意,可以现场演示

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

    http://ternarylabs.com/2011/03/27/secure-cross-domain-iframe-communication/ 目前由Google JavaScript API使用

        2
  •  1
  •   Quentin    17 年前

    要设置location.hash,您必须首先获取位置。同源策略禁止您获取该位置。

        3
  •  1
  •   Peeja    16 年前

        4
  •  0
  •   olliej    17 年前

    所有帧都包含具有相同原点的位置吗?(例如,相同的协议、相同的域、相同的端口)。如果它们不是,如果一个框架可以修改另一个框架,这就是一个潜在的安全漏洞——谷歌同源策略。但如果没有更多的细节,很难提供更好的答案。

        5
  •  0
  •   Dan F    17 年前

    我无法回答哈希的原因,但你看过John Resig的吗 work postMessage ?您在使用FF3时遇到了问题,FF3恰好是支持的浏览器之一 发送消息 ,宾果游戏:-)

    如果做不到这一点,还有 xssinterface 图书馆。看起来很稳定,但我还没有亲自尝试过。

        6
  •  -1
  •   Rui Carneiro    16 年前

    正如亚历克斯所说,这是一个安全问题。如果Inner位于其他域中,则无法访问顶层。这是为了避免 Cross-site Scripting .