前言
最近,别人的系统通过iframe嵌套引用我们系统页面出现的一个bug引发了我对框架嵌套及框架各个对象关系的深思...
window对象
BOM的核心对象是window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色:
- 通过javascript访问浏览器窗口的一个接口
- ECMAScript规定的Global对象
location对象
location对象既是window对象的属性,又是document对象的属性,换句话说,window.location和document.location引用的是同一个对象。
- location的href属性返回当前加载页面的完整url。
框架(iframe/frameset)
如果页面中包含框架,则每个框架都拥有自己的window对象,window对象中又包含top、parent、self属性,可以通过window.parent、window.top等形式访问,那这三个属性之间有什么联系呢?
- top对象:始终指向最高(最外)层的框架,也就是浏览器窗口。对于在一个框架中编写的任何代码来说,其中windows对象指向的都是那个框架的特定实例,而非最高层框架;
- parent对象:始终指向当前框架的直接上层框架。parent不一定等于top,但在没有框架的情况下,parent=top;
- self对象:它始终指向当前框架window,可以和window的对象互换使用。
那么问题来了,对于浏览器窗口(最外层框架)或没有框架嵌套的页面呢?
是的,你没猜错,此时:top=parent=self=window
总结
- top.location.href = "www.xxx.com" —— 在浏览器窗口打开该链接
- parent.location.href = "www.xxx.com" —— 在当前框架的直接上层框架(父框架)打开该链接
- self.location.href = "www.xxx.com" —— 在当前框架打开该链接
- window.location.href = "www.xxx.com" —— 在当前框架打开该链接
应用
- 禁止frame引用
if(window.top !==window.self) {
//若当前window对象和浏览器窗口对象不一致,则使用当前框架的url替换掉浏览器窗口的url
window.top.location.href=window.self.location.href;
//或者: top.location.href=self.location.href;
//或者: top.location.href=location.href;
}
框架嵌套存在跨域问题,若在跨域的子框架中访问父框架,是存在问题的。网上有很多相关文章,有需要的小伙伴可以自行查阅,这里不再赘述。
PS:本人才疏学浅,若有错误或考虑不周之处,欢迎大家留言指正和探讨!