2009-07-21 54 views
10

这里是案例:
page A包含iframe B,B包含iframe C,A和B在同一个域下,C在另一个下。
C尝试使用“#”后面的额外信息重置父B的位置,以使用分段ID消息传递来解决跨域通信。

IE6/7/8在这种情况下正常工作,而Firefox阻止parent.location设置错误消息[访问被拒绝的财产“代码:”1010]。 但是,如果B是顶层窗口,意味着没有A,Firefox也会活着。

这对我来说很奇怪......你们能帮忙吗?

谢谢!跨域JavaScript父级位置设置火狐错误

回答

15

从历史上看,任何窗口可以改变任何其他窗口的位置。原来这是一个问题,因为除此之外,这意味着在窗口中嵌入登录iframe是不安全的(因为然后恶意网站可能会用欺骗版本替换登录iframe)。随着时间的推移,对浏览器窗口的位置更改进一步加以限制,直到现在,当HTML5和大多数浏览器已在the ancestor policy上达成共识时。概括地说,释义HTML5规范,一个窗口中的可以改变另一个窗口乙当且仅当的位置:

  • A和B的位置具有相同的原点,这是说它们具有相同的模式,主机,端口(例如http,stackoverflow.com,80)或
  • B是顶层窗口,A是嵌套在B中某个深度的框架中的窗口(直接子节点,子节点子节点,等等)或
  • B是使用window.open打开的窗口,A可以更改打开B的窗口的位置(因此B是由A打开的弹出窗口,通过A打开的弹出窗口或更深的窗口) ,或
  • B不是顶层窗口,但是它的父窗口,或它的父的父窗口,或在亲本的一些类似量的窗口和A的位置是同源

(同原点比这更复杂,但是上面的嵌入描述捕捉了它的本质并且涵盖了最常见的情况。)

在这个策略下,C可以改变A的位置,并且A可以改变B或C的位置,但是C可能不会改变B的位置。如果你需要解决这个问题,那么你应该改变你的页面A的位置以适当地改变B;或者,您可以ask your page B to change its own location

希望这是丰富的,如果不一定有帮助。浏览器安全模型并非如此设计演变,只有最近在HTML5中的工作是真正精确地确定,以解决这些跨浏览器的不一致。

所有这一切说,我很惊讶IE7和IE8为你工作 - 这是我的理解上述政策主要是基于政策IE7实施。

+0

感谢您的清晰和美丽的答案,我会重新考虑我的解决方案。 – 2009-07-22 10:44:21

0

从C可以使用window.top访问B的窗口。

尝试,var B = window.top; B.location = "...";

+0

如果使用window.top从C,我得到了A而不是B,但我不想重置A的位置... – 2009-07-21 04:33:14