这是这样的:
页面A包含iframe B,B包含iframe C,A和B在同一域下,C包含另一个. C尝试使用“#”后面的额外信息重置父B的位置,以使用Fragment Id Messaging解决跨域通信. IE6 / 7/8在这种情况下工作正常,而Firefox阻止parent.location设置,错误消息[访问属性被拒绝“代码:”1010].
但是如果B是顶级窗口,意思是没有A,Firefox也是一样.
对我来说很奇怪,请问你们可以帮忙吗?
页面A包含iframe B,B包含iframe C,A和B在同一域下,C包含另一个. C尝试使用“#”后面的额外信息重置父B的位置,以使用Fragment Id Messaging解决跨域通信. IE6 / 7/8在这种情况下工作正常,而Firefox阻止parent.location设置,错误消息[访问属性被拒绝“代码:”1010].
但是如果B是顶级窗口,意思是没有A,Firefox也是一样.
对我来说很奇怪,请问你们可以帮忙吗?
谢谢!
解决方法
历史上,任何窗口都可以改变任何其他窗口的位置.原来这是一个问题,因为其中包括嵌入一个登录iframe在窗口是不安全的(因为那时恶意网站可以用欺骗版本替换登录的iframe).随着时间的推移,更多的限制已被应用于浏览器窗口的位置更改,直到现在,HTML5和大多数浏览器在
the ancestor policy达成了共同的协议.简而言之,释义HTML5规范,窗口A可以更改另一个窗口B的位置iff :
> 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实施的政策.