隨着W3C一聲令下,幾年前使用非常頻繁的frameset + frame已完成使命,光榮退伍。作爲frameset的替代方案(姑且這麼稱吧),iframe的使用也多了起來。較frameset方案,iframe在使用上更加靈活,文檔結構更加友好。
本文就js操作iframe在不同瀏覽器(沒錯,又是瀏覽器兼容…)的差異性做一些說明,力求總結出一個適應於所有主流瀏覽器的方案,筆者只測試了IE 6/7/8(以下簡稱IE)和FireFox 5.0(以下簡稱FF)。
約定與定義
iframeElement:指的是iframe的DOM元素表示,即用document.getElemenetById()等方法獲取的DOM對象
iframeId: 指iframe的屬性id,如<iframe id=”someid”>
iframeName:指iframe的屬性name,如<iframe name=”somename”>
iframeIndex:從0開始編號的iframe索引,若頁面中有N個frame,則其值範圍爲0 – n-1
iframeWindow:指的是iframe的window對象
標準瀏覽器:符合W3C標準的瀏覽器的統稱,如FireFox
一、 在父頁面中獲取iframe的window對象
獲得了window對象後,就可以調用iframe頁面中定義的方法等。
IE:可以通過iframeId、window.iframeId、window.iframeName、window.frames[iframeId]、window.frames[iframeName]、window.frames[iframeIndex]和iframeElement.contentWindow這6種方法來獲取iframe的window對象。
FF:可以通過window.iframeName、window.frames[iframeName]和iframeElement.contentWindow這3種方法獲取window對象。
總結:爲了兼容大多數瀏覽器,應使用iframeElement.contentWindow來獲取。見如下代碼:
<iframe id="iframe1" name=”iframe1” src="frame1.html"></iframe>
<script type="text/javascript">
//獲取iframe的window對象
var iframe = document.getElementById('iframe1').contentWindow;
</script>
二、 在父頁面中獲取iframe的document對象
標準瀏覽器可以通過iframeElement.contentDocument來引用iframe的doument對象,但是IE瀏覽器(又是這斯…)不支持,確切說應該是IE 6/7,筆者發現在IE8中已經可以用此方法來獲取了。
當然,因爲document是window的一個子對象,你也可以先獲取iframe的window對象,再通過window.document來引用。
總結:應使用以下兩方法來獲取,見代碼:
<iframe id="iframe1" src="frame1.html"></iframe>
<script type="text/javascript">
//獲取iframe的document對象
//方法1
var iframe = document.getElementById('iframe1').contentWindow.document;
//方法2
function getIframeDom(iframeId) {
return document.getElementById(iframeId).contentDocument || window.frames[iframeId].document;
}
</script>
三、 iframe頁面獲取父頁面的window對象
parent:父頁面window對象
top:頂層頁面window對象
self:始終指向當前頁面的window對象(與window等價)
適用於所有瀏覽器,當拿到了父頁面的window對象後,就可以訪問父頁面定義的全局變量和函數,這在iframe交互裏經常用到。
後記
iframe使用起來其實還有其它一些問題,如跨域訪問、父容器高度自適應等,這些問題有時間再補充了。
參考資料:
使用JavaScript在IE和Firefox下進行iframe的DOM操作
JS操作iframe