国产午夜精品一区二区三区不-国产午夜精品一区二区三区不卡-国产午夜精品一区二区三区极品-国产午夜精品一区二区三区老-国产午夜精品一区二区三区漫-国产午夜精品一区二区三区嫩草

聊城網(wǎng)站制作公司,聊城網(wǎng)站建設(shè),聊城網(wǎng)站優(yōu)化,聊城網(wǎng)絡(luò)公司,聊城網(wǎng)站推廣,聊城網(wǎng)站運營,聊城網(wǎng)絡(luò)運營,聊城搜索引擎優(yōu)化,聊城網(wǎng)頁設(shè)計,聊城網(wǎng)站制作
 
 
公司擁有五年的網(wǎng)站建設(shè)經(jīng)驗,專業(yè)網(wǎng)站制作,推廣及網(wǎng)站優(yōu)化,有大量優(yōu)秀客戶案例
網(wǎng)站建設(shè) | 設(shè)為首頁 | 加入收藏 | 聯(lián)系我們  
公告:熱烈慶祝聊城精英網(wǎng)絡(luò)2010版官方網(wǎng)站改版成功!
當(dāng)前位置 :首頁 > 網(wǎng)頁知識  

網(wǎng)站制作中如何讓frame自適應(yīng)高度

http://m.zjgjyh.cn   2010-11-24 21:47:57 來源:聊城網(wǎng)站建設(shè) 作者:精英網(wǎng)絡(luò)   人氣:

同域、子頁面高度不會動態(tài)增加

這種情況最簡單,直接通過腳本獲取字頁面實際高度,修改iframe元素高度即可。但有二點必須注意:

如果頁面內(nèi)有絕對定位或者沒有清浮動的元素,情況有些復(fù)雜,不同瀏覽器處理結(jié)果不同,甚至包括Webkit內(nèi)核的瀏覽器,具體請看這個Demo。所以你要么進行瀏覽器檢測,要么用Math.max計算一個最大值,要么你想別的方法。

iframe所包含頁面可能非常大,需要很長的加載時間,為此直接計算高度的時候,很可能頁面還沒下載完,高度計算就會有問題。所以最好在iframe的onload事件中計算高度。這里還要注意的是,IE下必須使用微軟事件模型obj.attachEvent來綁定onload事件。而別的瀏覽器直接obj.onload = function(){}也可以。

(function(){
    var _reSetIframe = function(){
        var frame = document.getElementById("frame_content_parent")
        try {
            var frameContent = frame.contentWindow.document,
                bodyHeight = Math.max
(frameContent.body.scrollHeight,
frameContent.documentElement.scrollHeight);
            if (bodyHeight != frame.height){
                frame.height = bodyHeight;
            }
        }
        catch(ex) {
            frame.height = 1800;
        }
    }
    if(frame.addEventListener){
        frame.addEventListener
("load",function(){setInterval(_reSetIframe,200);},false);
    }else{
        frame.attachEvent("onload",function(){setInterval(_reSetIframe,200);});
    }
})();

從上面這個Demo可以看到,除IE瀏覽器外,別的瀏覽器計算出來的都是iframe的高度,即CSS里設(shè)置的#frame_content_parent{ height:1800px; }。而IE計算出來的是iframe所引用頁面的實際高度。

#frame_content_parent{ height:1800px; }
(function(){
    var $ = YAHOO.util.Dom,
        frame = $.get("frame_content_parent");
    function reSetIframe(){
        var frameContent = frame.contentWindow.document,
            bodyHeight = Math.max
(frameContent.documentElement.scrollHeight,
frameContent.body.scrollHeight);
        if (bodyHeight != $.getStyle(frame, "height")){
            $.setStyle(frame, "height", bodyHeight + "px");
        }
    }
    if(frame){
        $.setStyle(frame,"height","auto");
        setInterval(reSetIframe,300);
    }
})();

跨域

這里提供一個Iframe代理的方法,簡單地說一下原理。假設(shè)有3個頁面,分別是主頁面A.html,字頁面B.html,代理頁面C.html。其中A與B是跨域的,而A和C是同域的。它們的關(guān)系:A包含B,B包含C。很顯然A和B,以及B和C,因為跨域不能相互通信,而A和C同域,可以相互通信。為此我們就想到讓C頁面告訴A頁面,B頁面到底有多少高。因為B和C也是跨域的不能相互通信,所以想在C頁面中,直接window.parent.document.body.scrollHeight這樣是行不通的,所以我們只能讓B頁面自己計算自身的高度,然后通過某種方法告訴C頁面,再由C頁面告訴A頁面。這里的一個方法就是在B頁面生成一個Iframe節(jié)點,然后設(shè)置它的src屬性,在這個地址上附加一個參數(shù),即B頁面計算出來的高度,然后C頁面就可以通過window.location獲取這個地址欄中的地址,提取出高度值,通過window.top找到A頁面,設(shè)置A頁面的Iframe的高度。基本的原理就是這樣,看代碼吧:

DEMO

//B頁面腳本
//任務(wù):計算其實際高度,然后生成一個iframe節(jié)點,將高度作為代理頁面C的地址的一部分賦值給Src屬性
(function(){
    var agent_iframe = document.createElement("iframe"),
        b_height = Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
    agent_iframe.src = "
http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe_once.html
#" + b_height;
    document.body.appendChild(agent_iframe);
    agent_iframe.style.display = "none";
})();

//C頁面腳本
//任務(wù):獲取請求地址中的高度值,將其賦值給A頁面的Iframe的高度
window.top.document.getElementById("frame_content_parent").height = parseInt(window.location.hash.substring(1),10);

跨域、字頁面高度動態(tài)變化

這里結(jié)合了第2、第4兩種方法,我的想法是在B頁面通過一個計時器,不停計算B頁面的高度,一但變化,馬上修改iframe標(biāo)簽的src屬性,而C頁面也有計時器不斷監(jiān)聽src的變化,改變Aiframe標(biāo)簽的高度。需要注意的是僅僅修改src屬性后面的錨點值(如“#1234”),頁面并不會刷新,不會重新請求,這也是在C頁面增加計時器的原因。

DEMO

//B頁面腳本
(function(){
    var getHeight = function(){
        return Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
    };
    var preHeight = getHeight(),
        agent_iframe;
    var createIframe = function(height){
        agent_iframe = document.createElement("iframe");
        agent_iframe.style.height = "0";
        agent_iframe.style.width = "0";
        agent_iframe.style.border = "none";
        agent_iframe.src = "
http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html#" + height;
        document.body.appendChild(agent_iframe);
    }
    createIframe(preHeight);
    var checkHeight = function(){
        var currentHeight = getHeight();
        if(currentHeight != preHeight){
            agent_iframe.src = "
http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html
#" + currentHeight;
            preHeight = currentHeight;
        }
        setTimeout(checkHeight,500);
    }
    setTimeout(checkHeight,500);
})();

//C頁面腳本
(function(){
    var preHeight = parseInt(window.location.hash.substring(1),10),
        ifrmae = window.top.document.getElementById("frame_content_parent");
    ifrmae.height = preHeight;
    setInterval(function(){
        var newHeight = parseInt(window.location.hash.substring(1),10);
        if (newHeight !== preHeight){
            ifrmae.height = newHeight;
            preHeight = newHeight;
        }
    },500);
})();

這里還有另一種方案,就是讓iframe每一次都重新請求,這樣C頁面就不需要計時器了,但是如果2次計算高度重復(fù)的話,就會導(dǎo)致src屬性的值相同,這樣瀏覽器就很可能不重新請求該頁面了,那么C頁面中的腳本也就不運行了。要修復(fù)這個問題很簡單,只要在每次計算出來的src屬性上增加一個隨機數(shù)的參數(shù)就行了。比如http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html?temp=123123423712937#1563

//B頁面關(guān)鍵腳本
agent_iframe.src = "
http://demo.zhouqicf.com/js/2010/iframe_height/agent_iframe.html?a
=" + Math.random() + "#" + currentHeight;

//C頁面腳本
window.top.document.getElementById("frame_content_parent").height = parseInt(window.location.hash.substring(1),10);

專業(yè)設(shè)計團隊
滿足您的各種設(shè)計要求
實力程序開發(fā)團隊
為您定制各種程序模塊
后臺管理高效安全
方便更新上傳網(wǎng)站資料
全球高速訪問
無盲區(qū)、定制異地備份
專業(yè)客服團隊
解決一切使用難題
贈送大容量空間郵箱
免費優(yōu)化推廣
   
關(guān)于我們 | 工作機會 | 付款方式 | 網(wǎng)站制作 | 網(wǎng)頁制作 | 網(wǎng)頁設(shè)計 | 網(wǎng)絡(luò)公司 | 聯(lián)系我們 | 網(wǎng)站地圖
版權(quán)所有:聊城精英網(wǎng)絡(luò)科技有限公司 © 2005-2010 All Rights Reserved.
咨詢專線:0635-6950368 技術(shù)專線:15192175820 在線QQ:312817927 1485871644
地址:聊城市閘口科技市場 郵編:252000 蘇ICP備10112026號
主站蜘蛛池模板: 国产日产欧美 | 亚洲精品久久无码一区二区大长腿 | 亚洲AV在线无码播放毛片浪潮 | 纯肉小黄文高H | 午夜福利理论片高清在线观看 | 亚洲视频一区二区三区 | 国产精品毛片无遮挡 | 亚洲国产欧美另类 | 人妻丝袜av中文系列先锋影音 | 欧美日韩不卡视频一区二区三区 | 亚洲国产精久久久久久久软件 | 亚洲国产一成久久精品国产成人综合 | 精品日韩欧美国产一区 | 亚洲国产av无码片一区二区 | 国产v亚洲v欧美v专区无码av人妻久久传媒男人 国产v视频一区二区三区亚洲不卡在线网站天堂 | 国产美女被遭强高潮免费网站 | 亚洲制服师生无码成人免费不卡hd亚洲 | 911在线无码精品秘 9191精品国产产免费久久 | 国产成人亚洲精品无码av大片 | 国产午夜男女爽爽爽爽爽 | 午夜短视频日韩免费 | 午夜精品一区二区三区在线视 | 久久精品丝袜高跟鞋 | 久久精品韩国日本国产 | 色片在线观看视频 | 日本无码一二三区别免费 | 亚洲av无码久久精品成人 | 97色伦久久视频在观看 | 一本道一本道高清视频在线观看 | 9I精品福利一区二区三区精华液 | 亚洲av无码一区二区不卡 | 国产超碰人人做人人爱ⅴA 国产超碰人人做人人爽av大片 | 国产成人久久精品77777综合 | 91精品欧美综合在线观看 | 性爱视频在线观看51 | 亚洲电影激情五月激情 | 亚洲国产中文在线精品一区 | 国产精品女同一区二区久久 | 国产成人无码区免费内射一片 | 人妻激情乱偷一区二 | 国产精品欧美日韩精品 |