JavaScript操作iframe

隨着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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章