兼容多瀏覽器的iframe自適應(yīng)高度(ie8 、谷歌瀏覽器4.0和 firefox3.5.3)
更新時(shí)間:2009年11月04日 23:54:46 作者:
iframe在ie8 、谷歌瀏覽器4.0和 firefox3.5.3均成功自適應(yīng)高度.
小項(xiàng)目龍里中學(xué)多媒體教室管理系統(tǒng)中后臺(tái)管理用到了iframe.由于要?jiǎng)討B(tài)載入內(nèi)容,所以需要iframe自適應(yīng)內(nèi)容頁(yè)的高度.用谷歌搜索到很多答案,其中成功的是這段代碼
<script type="text/javascript">
function SetCwinHeight() {
var iframeid = document.getElementById("maincontent1"); //iframe id
if (document.getElementById) {
if (iframeid && !window.opera) {
if (iframeid.contentDocument && iframeid.contentDocument.body.offsetHeight) {
iframeid.height = iframeid.contentDocument.body.offsetHeight;
} else if (iframeid.Document && iframeid.Document.body.scrollHeight) {
iframeid.height = iframeid.Document.body.scrollHeight;
}
}
}
}
</script>
iframe代碼:
<iframe style="z-index: 1; visibility: inherit; width: 100%;" name="maincontent1"
onload="Javascript:SetCwinHeight()" height="1" id="maincontent1" src="<%=ResolveClientUrl("~/message")%>"
marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe>
在IE8下成功實(shí)現(xiàn)自適應(yīng)高度,但在谷歌瀏覽器高度只會(huì)增加,不會(huì)減少,也就是說(shuō),長(zhǎng)高后就縮不回來(lái).
那么各個(gè)瀏覽器的表現(xiàn)不太相同,單取哪個(gè)值都不對(duì)。但可以找到了一條規(guī)律,那就是取兩個(gè)值得最大值可以兼容各瀏覽器。所以我們的主頁(yè)面代碼就要改造成這樣了:
function reinitIframe(){var iframe = document.getElementById("frame_content");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height = height;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
這樣子,基本解決了兼容性問(wèn)題。順便說(shuō)下,不光絕對(duì)定位的層會(huì)影響到值,float也會(huì)導(dǎo)致兩個(gè)值的差異。
如果你演示Demo后,會(huì)發(fā)現(xiàn),除了IE,其他瀏覽器中,當(dāng)層展開(kāi)后再隱藏,取到的高度值還是維持在展開(kāi)的高度303,而非隱藏回去的真正值184,就是說(shuō)長(zhǎng)高了之后縮不回去了。這個(gè)現(xiàn)象在不同被包含頁(yè)面之間做切換也會(huì)發(fā)生,當(dāng)從高的頁(yè)面切換到矮頁(yè)面的時(shí)候,取到的高度還是那個(gè)高的值。
可以歸納為,當(dāng)iframe窗體高度高于文檔實(shí)際高度的時(shí)候,高度取的是窗體高度,而當(dāng)窗體高度低于實(shí)際文檔高度時(shí),取的是文檔實(shí)際高度。因此,要想辦法在同步高度之前把高度設(shè)置到一個(gè)比實(shí)際文檔低的值。所以,在iframe的添加 onload=”this.height=100″,讓頁(yè)面加載的時(shí)候先縮到足夠矮,然后再同步到一樣的高度。
這個(gè)值,在實(shí)際應(yīng)用中決定,足夠矮但又不能太矮,否則在FF等瀏覽器里會(huì)有很明顯的閃爍。DOM操作的時(shí)候主頁(yè)面無(wú)法監(jiān)聽(tīng)到,只能DOM操作完了之后把高度變小了。
在我的一個(gè)實(shí)際項(xiàng)目中,在成本和收益之間權(quán)衡,我并沒(méi)有做這個(gè)事情,因?yàn)槊總€(gè)DOM函數(shù)中都要插入這個(gè)代碼,代價(jià)太高,其實(shí)層縮回去不縮掉也不是那么致命。包括Demo里,也沒(méi)有去做這個(gè)事情。如果讀者有更好的方法,請(qǐng)告訴我。
/**********************************原文引用結(jié)束***************************** /
請(qǐng)注意紅色的這句.讀到這里,我想在改變iframe.height之前可否先給 iframe.height賦一個(gè)夠小的初始值,如iframe.height="10px",然后再改變?nèi)鏸frame.height.這樣就解決了原文紅色部分的問(wèn)題。
最終代碼如下:
<script type="text/javascript">
function SetCwinHeight() {
var iframeid = document.getElementById("maincontent1"); //iframe id
iframeid.height = "10px";//先給一個(gè)夠小的初值,然后再長(zhǎng)高.
if (document.getElementById) {
if (iframeid && !window.opera) {
if (iframeid.contentDocument && iframeid.contentDocument.body.offsetHeight) {
iframeid.height = iframeid.contentDocument.body.offsetHeight;
} else if (iframeid.Document && iframeid.Document.body.scrollHeight) {
iframeid.height = iframeid.Document.body.scrollHeight;
}
}
}
}
</script>
iframe代碼仍然不變:
<iframe style="z-index: 1; visibility: inherit; width: 100%;" name="maincontent1"
onload="Javascript:SetCwinHeight()" height="1" id="maincontent1" src="<%=ResolveClientUrl("~/message")%>"
marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe>
經(jīng)測(cè)試,iframe在ie8 、谷歌瀏覽器4.0和 firefox3.5.3均成功自適應(yīng)高度.
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function SetCwinHeight() {
var iframeid = document.getElementById("maincontent1"); //iframe id
if (document.getElementById) {
if (iframeid && !window.opera) {
if (iframeid.contentDocument && iframeid.contentDocument.body.offsetHeight) {
iframeid.height = iframeid.contentDocument.body.offsetHeight;
} else if (iframeid.Document && iframeid.Document.body.scrollHeight) {
iframeid.height = iframeid.Document.body.scrollHeight;
}
}
}
}
</script>
iframe代碼:
復(fù)制代碼 代碼如下:
<iframe style="z-index: 1; visibility: inherit; width: 100%;" name="maincontent1"
onload="Javascript:SetCwinHeight()" height="1" id="maincontent1" src="<%=ResolveClientUrl("~/message")%>"
marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe>
在IE8下成功實(shí)現(xiàn)自適應(yīng)高度,但在谷歌瀏覽器高度只會(huì)增加,不會(huì)減少,也就是說(shuō),長(zhǎng)高后就縮不回來(lái).
那么各個(gè)瀏覽器的表現(xiàn)不太相同,單取哪個(gè)值都不對(duì)。但可以找到了一條規(guī)律,那就是取兩個(gè)值得最大值可以兼容各瀏覽器。所以我們的主頁(yè)面代碼就要改造成這樣了:
復(fù)制代碼 代碼如下:
function reinitIframe(){var iframe = document.getElementById("frame_content");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height = height;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
這樣子,基本解決了兼容性問(wèn)題。順便說(shuō)下,不光絕對(duì)定位的層會(huì)影響到值,float也會(huì)導(dǎo)致兩個(gè)值的差異。
如果你演示Demo后,會(huì)發(fā)現(xiàn),除了IE,其他瀏覽器中,當(dāng)層展開(kāi)后再隱藏,取到的高度值還是維持在展開(kāi)的高度303,而非隱藏回去的真正值184,就是說(shuō)長(zhǎng)高了之后縮不回去了。這個(gè)現(xiàn)象在不同被包含頁(yè)面之間做切換也會(huì)發(fā)生,當(dāng)從高的頁(yè)面切換到矮頁(yè)面的時(shí)候,取到的高度還是那個(gè)高的值。
可以歸納為,當(dāng)iframe窗體高度高于文檔實(shí)際高度的時(shí)候,高度取的是窗體高度,而當(dāng)窗體高度低于實(shí)際文檔高度時(shí),取的是文檔實(shí)際高度。因此,要想辦法在同步高度之前把高度設(shè)置到一個(gè)比實(shí)際文檔低的值。所以,在iframe的添加 onload=”this.height=100″,讓頁(yè)面加載的時(shí)候先縮到足夠矮,然后再同步到一樣的高度。
這個(gè)值,在實(shí)際應(yīng)用中決定,足夠矮但又不能太矮,否則在FF等瀏覽器里會(huì)有很明顯的閃爍。DOM操作的時(shí)候主頁(yè)面無(wú)法監(jiān)聽(tīng)到,只能DOM操作完了之后把高度變小了。
在我的一個(gè)實(shí)際項(xiàng)目中,在成本和收益之間權(quán)衡,我并沒(méi)有做這個(gè)事情,因?yàn)槊總€(gè)DOM函數(shù)中都要插入這個(gè)代碼,代價(jià)太高,其實(shí)層縮回去不縮掉也不是那么致命。包括Demo里,也沒(méi)有去做這個(gè)事情。如果讀者有更好的方法,請(qǐng)告訴我。
/**********************************原文引用結(jié)束***************************** /
請(qǐng)注意紅色的這句.讀到這里,我想在改變iframe.height之前可否先給 iframe.height賦一個(gè)夠小的初始值,如iframe.height="10px",然后再改變?nèi)鏸frame.height.這樣就解決了原文紅色部分的問(wèn)題。
最終代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function SetCwinHeight() {
var iframeid = document.getElementById("maincontent1"); //iframe id
iframeid.height = "10px";//先給一個(gè)夠小的初值,然后再長(zhǎng)高.
if (document.getElementById) {
if (iframeid && !window.opera) {
if (iframeid.contentDocument && iframeid.contentDocument.body.offsetHeight) {
iframeid.height = iframeid.contentDocument.body.offsetHeight;
} else if (iframeid.Document && iframeid.Document.body.scrollHeight) {
iframeid.height = iframeid.Document.body.scrollHeight;
}
}
}
}
</script>
iframe代碼仍然不變:
復(fù)制代碼 代碼如下:
<iframe style="z-index: 1; visibility: inherit; width: 100%;" name="maincontent1"
onload="Javascript:SetCwinHeight()" height="1" id="maincontent1" src="<%=ResolveClientUrl("~/message")%>"
marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe>
經(jīng)測(cè)試,iframe在ie8 、谷歌瀏覽器4.0和 firefox3.5.3均成功自適應(yīng)高度.
您可能感興趣的文章:
- iframe自適應(yīng)高度的多種方法方法小結(jié)
- Iframe自適應(yīng)高度兼容ie,firefox多瀏覽器
- Iframe 自適應(yīng)高度并實(shí)時(shí)監(jiān)控高度變化的js代碼
- javascript 裝載iframe子頁(yè)面,自適應(yīng)高度
- Iframe自適應(yīng)高度絕對(duì)好使的代碼 兼容IE,遨游,火狐
- iframe跨域通信封裝詳解
- 通過(guò)偽協(xié)議解決父頁(yè)面與iframe頁(yè)面通信的問(wèn)題
- 嵌入式iframe子頁(yè)面與父頁(yè)面js通信的方法
- iframe子頁(yè)面與父頁(yè)面在同域或不同域下的js通信
- 利用iframe實(shí)現(xiàn)ajax跨域通信的實(shí)現(xiàn)原理(圖解)
- JS解決iframe之間通信和自適應(yīng)高度的問(wèn)題
相關(guān)文章
egg.js的基本使用和調(diào)用數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了egg.js的基本使用和調(diào)用數(shù)據(jù)庫(kù)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05javascript實(shí)現(xiàn)九宮格相加數(shù)值相等
這篇文章主要介紹了javascript實(shí)現(xiàn)九宮格相加數(shù)值相等的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例
這篇文章主要介紹了javascript移動(dòng)設(shè)備Web開(kāi)發(fā)中對(duì)touch事件的封裝實(shí)例,分別對(duì)tap事件、doubleTap事件、longTap事件、swipe事件做了封裝,需要的朋友可以參考下2014-06-06最全面的百度地圖JavaScript離線版開(kāi)發(fā)
最全面的百度地圖JavaScript離線版開(kāi)發(fā),這篇文章主要為大家詳細(xì)介紹了JavaScript離線版開(kāi)發(fā)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09JavaScript中的undefined學(xué)習(xí)總結(jié)
這篇文章主要是對(duì)JavaScript中的undefined進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11微信小程序?qū)崿F(xiàn)添加手機(jī)聯(lián)系人功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)添加手機(jī)聯(lián)系人功能,結(jié)合實(shí)例形式分析了微信小程序添加聯(lián)系人的具體步驟,包括布局與邏輯實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11JS 實(shí)現(xiàn)BASE64_ENCODE和BASE64_DECODE(實(shí)例代碼)
JS 實(shí)現(xiàn)BASE64_ENCODE和BASE64_DECODE(實(shí)例代碼)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11