iframe說明與用法

一、記錄說明

  • 事先說一點(diǎn),iframe不常用,是個(gè)快被淘汰的東西還是已經(jīng)淘汰了,我也說不清楚。至少17年底看html5的書的時(shí)候,書上就說這個(gè)不怎么用了,理解一下就行。
  • 但是那時(shí)候進(jìn)公司后,發(fā)現(xiàn)公司用的bootstrap框架,然后多tab頁那種全部寫在同一個(gè)jsp中,測試的人說頁面太大剛開始加載很慢。后面項(xiàng)目經(jīng)理就說把子tab那些頁面需要時(shí)再用iframe加載進(jìn)來吧,后面就改成這種開發(fā)多tab頁的模式了。雖然知道可以這樣做,但是還是怪怪的。
  • 反正已經(jīng)用了,就順便記下來用法吧。

二、iframe說明
<iframe></iframe>標(biāo)簽用于定義一個(gè)頁面的內(nèi)聯(lián)框架。就是在一個(gè)html頁面中分出小塊,然后用iframe把其他網(wǎng)頁嵌入進(jìn)來,這小塊就會(huì)顯示其他html頁面的內(nèi)容了。

  • 缺點(diǎn)很明顯。耗能高,相當(dāng)于重新打開了一個(gè)瀏覽器頁面;會(huì)產(chǎn)生很多子頁面不好管理;還有一個(gè)坑,就是不適用響應(yīng)式布局(需要自己判斷修改),iframe必須指定高度寬度,這相當(dāng)于在主頁面開了一個(gè)固定大小的小窗口,然后會(huì)通過這個(gè)窗口顯示其他頁面的信息,這時(shí)候老是會(huì)出現(xiàn)其他頁面比iframe高度大而顯示不全;還有其他缺點(diǎn)等等。。。
  • 有點(diǎn)也有。嵌入頁面簡單,用于多個(gè)網(wǎng)頁的共有部分復(fù)用代碼,如導(dǎo)航欄、廣告欄等;重載頁面不需要重載整個(gè)頁面只需要框架頁。

三、iframe標(biāo)簽常用屬性

  • name,名稱。
  • width,寬度。
  • height,高度。
  • src,嵌入頁面的url。
  • frameborder,是否顯示邊框,0無邊框,1有邊框。
  • align,如何根據(jù)周圍元素來對(duì)其iframe(left、rigth、top、middle、bottom)。
  • scrolling,是否顯示滾動(dòng)條(yes、no、auto)。

四、父、子頁面常用方法
1、父頁面

var iframe = document.getElementById("id");   //獲取iframe標(biāo)簽
var iwindow = iframe.contentWindow;   //獲取iframe的window對(duì)象
var idoc = iwindow.document;   //獲取iframe的document對(duì)象
//注意:如果是jquery抓取的iframe,$('#id')是一個(gè)對(duì)象組,不能直接像原生一樣獲取window對(duì)像。
//需要加上"[0]"或".eq(0)"來取得對(duì)象。
//即
var iwindow = $('#iframeId')[0].contentWindow;
iwindow.func();   //執(zhí)行子頁面的方法,常用
iwindow.attr;   //獲取子頁面全局window變量

注意:iframe加載也需要時(shí)間(相當(dāng)于重新打開一個(gè)頁面),需要在父頁面操作子頁面,要等子頁面加載完成,iframe常加上onload事件,jq常加上$('#iframeId').load(function(){});再開始操作子頁面。
2、子頁面

//parent即父頁面window對(duì)象
(window.)parent.Func();   //執(zhí)行父頁面方法,常用
(window.)parent.Attr;   //獲取父頁面全局window變量
//我常用來取父頁面操作后改變的狀態(tài),判斷進(jìn)入的這個(gè)子頁面是新增、修改還是詳細(xì)頁面

五、實(shí)例
這里也包含了項(xiàng)目中寫的常用的公共函數(shù)。為了方便js直接嵌入html中。因?yàn)閖query很方便,也引入了。

  • 工程


  • 父頁面parentPage.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>主頁面</title>
    </head>
    <body>
        <div style="height: 100%;width: 1200px;border: 2px solid blue;margin: 0 auto;padding: 20px;box-sizing: border-box;">
            <h1>我是父頁面</h1>
            <input type="button" value="加載子頁面" id="addBtn"/>
            <div id="iframeDiv" style="margin-top:10px ;"></div>
        </div>

        <script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
        <script>
            var STAT = 'add';   
            $('#addBtn').click(function(){
                ifr('iframeDiv','http://127.0.0.1:8848/iframeTest/childPage.html');
                $('#iframeDiv').find('iframe').load(function(){
                    $(this)[0].contentWindow.setHText('我是子頁面');   //父頁面調(diào)用子頁面方法
                });
                
            });
            
            // 父頁面中增加iframe
            function ifrPoint(Id, Src) {
                $("#" + Id).find('iframe').remove();
                var tag = "<iframe style='width: 100%;height:100%;' frameborder='0' scrolling='auto'></iframe>";
                $("#" + Id).append(tag).find('iframe').attr('src', Src);
            }
            // 給增加的iframe根據(jù)內(nèi)容設(shè)置多余高度
            function setIfrHeight(Id, num) {
                $("#" + Id).find('iframe').on('load', function() {
                    var Num = 0;
                    if (num != undefined) {
                        Num = num;
                    }
                    $(this).height($(this).contents().find('body').height() + Num); //contents,jq方法,返回所有子節(jié)點(diǎn),也能訪問iframe中的html
                });
            }
            // 父頁面增加iframe節(jié)點(diǎn)并自適應(yīng)
            function ifr(Id, Src, num) {
                ifrPoint(Id, Src);
                setIfrHeight(Id, num);
            }
        </script>
    </body>
</html>
  • 子頁面childPage.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
        </style>
    </head>
    <body>
        <div style="height: 200px;width: 1000px;border: 2px solid red;margin: 0 auto;padding: 20px;box-sizing: border-box;">
            <h2></h2>
            <input type="button" value="我要變大"/>
        </div>

        <script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
        <script>
            console.log(parent.STAT); //可以根據(jù)父頁面來判斷當(dāng)前頁面的操作

            $('input').click(function(){
                $('div').height(500);   //單獨(dú)用,頁面會(huì)超過iframe的高度,顯示不全或者出現(xiàn)滾動(dòng)條
                //自適應(yīng)
                ifrChildAut('iframeDiv',0);
            });

            //設(shè)置子頁面h2標(biāo)簽內(nèi)容的方法,讓父頁面調(diào)用
            function setHText(Text) {
                console.log("父頁面調(diào)用設(shè)置標(biāo)簽內(nèi)容");
                $('h2').text(Text);
            }

            // ifr子頁面自適應(yīng)高度
            function ifrChildAut(Id, Num) {
                var num = 200;
                if (undefined != Num) {
                    num = Num;
                }
                var Height = $(document.body).height();
                $(window.parent.document).find("#" + Id).find('iframe').height(
                    Height  + num);
                $(window.parent.document).scrollTop(0);
            }
            //也可以自適應(yīng)的方法寫在父頁面,然后子頁面 parent.方法 調(diào)用
        </script>
    </body>
</html>
  • 實(shí)際效果




六、替換方法
1、ajax獲取頁面操作DOM加載。jquery也有提供$('divId').load('.html')直接加載的方法。
2、vue等框架,組件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容