前言
最近粹庞,別人的系統(tǒng)通過iframe嵌套引用我們系統(tǒng)頁面出現(xiàn)的一個bug引發(fā)了我對框架嵌套及框架各個對象關(guān)系的深思...
window對象
BOM的核心對象是window酌住,它表示瀏覽器的一個實例弦疮。在瀏覽器中圆兵,window對象有雙重角色:
- 通過javascript訪問瀏覽器窗口的一個接口
- ECMAScript規(guī)定的Global對象
location對象
location對象既是window對象的屬性骇陈,又是document對象的屬性托慨,換句話說葵孤,window.location和document.location引用的是同一個對象担钮。
- location的href屬性返回當(dāng)前加載頁面的完整url。
框架(iframe/frameset)
如果頁面中包含框架尤仍,則每個框架都擁有自己的window對象箫津,window對象中又包含top、parent、self屬性苏遥,可以通過window.parent饼拍、window.top等形式訪問,那這三個屬性之間有什么聯(lián)系呢暖眼?
- top對象:始終指向最高(最外)層的框架惕耕,也就是瀏覽器窗口。對于在一個框架中編寫的任何代碼來說诫肠,其中windows對象指向的都是那個框架的特定實例司澎,而非最高層框架;
- parent對象:始終指向當(dāng)前框架的直接上層框架栋豫。parent不一定等于top挤安,但在沒有框架的情況下,parent=top丧鸯;
- self對象:它始終指向當(dāng)前框架window蛤铜,可以和window的對象互換使用。
那么問題來了丛肢,對于瀏覽器窗口(最外層框架)或沒有框架嵌套的頁面呢围肥?
是的,你沒猜錯蜂怎,此時:top=parent=self=window
總結(jié)
- top.location.href = "www.xxx.com" —— 在瀏覽器窗口打開該鏈接
- parent.location.href = "www.xxx.com" —— 在當(dāng)前框架的直接上層框架(父框架)打開該鏈接
- self.location.href = "www.xxx.com" —— 在當(dāng)前框架打開該鏈接
- window.location.href = "www.xxx.com" —— 在當(dāng)前框架打開該鏈接
應(yīng)用
- 禁止frame引用
if(window.top !==window.self) {
//若當(dāng)前window對象和瀏覽器窗口對象不一致穆刻,則使用當(dāng)前框架的url替換掉瀏覽器窗口的url
window.top.location.href=window.self.location.href;
//或者: top.location.href=self.location.href;
//或者: top.location.href=location.href;
}
框架嵌套存在跨域問題,若在跨域的子框架中訪問父框架杠步,是存在問題的氢伟。網(wǎng)上有很多相關(guān)文章,有需要的小伙伴可以自行查閱幽歼,這里不再贅述朵锣。
PS:本人才疏學(xué)淺,若有錯誤或考慮不周之處甸私,歡迎大家留言指正和探討诚些!