如何設(shè)置iframe高度自適應(yīng)在跨域情況下的可用方法
更新時(shí)間:2013年09月06日 18:26:50 作者:
iframe的高度需要根據(jù)子頁面的實(shí)際高度來進(jìn)行調(diào)整,但是如果子頁面不在同一域中怎么辦?這時(shí)候腳本沒有辦法獲取到子頁面的高度,存在JavaScript跨域的問題
在頁面上使用iframe來動(dòng)態(tài)加載頁面內(nèi)容是網(wǎng)頁開發(fā)中比較常見的方法。在父頁面中給定一個(gè)不帶滾動(dòng)條的iframe,然后對(duì)屬性src指定一個(gè)可加載的頁面,這樣當(dāng)父頁面被訪問的時(shí)候,子頁面可以被自動(dòng)加載。iframe的高度需要根據(jù)子頁面的實(shí)際高度來進(jìn)行調(diào)整。如果iframe的高度小于子頁面的實(shí)際高度,超出的部分無法顯示;相反,如果iframe的高度過高,則頁面上會(huì)出現(xiàn)大量的空白區(qū)域。我們可以通過屬性或者CSS來設(shè)置iframe的高度,當(dāng)不確定子頁面內(nèi)容的高度時(shí),也可以通過腳本來進(jìn)行動(dòng)態(tài)指定。但是如果子頁面不在同一域中怎么辦?這時(shí)候腳本沒有辦法獲取到子頁面的高度,存在JavaScript跨域的問題!
如題所述,本文在介紹可用方法的同時(shí),也向大家詢問除下文列出來的方法之外是否還有其它方法可尋?
通過屬性或CSS來設(shè)置iframe的高度這里就不再具體介紹了。首先來看看如何通過腳本進(jìn)行設(shè)置。
function ChangeFrameHeight(id) {
var count = 1;
(function() {
var frm = document.getElementById(id);
var subWeb = document.frames ? document.frames[id].document : frm.contentDocument;
if (subWeb != null) {
var height = Math.max(subWeb.body.scrollHeight, subWeb.documentElement.scrollHeight);
frm.height = height;
}
if (count < 3) {
count = count + 1;
window.setTimeout(arguments.callee, 2000);
}
})();
}
假設(shè)iframe子頁面和父頁面都在同一域內(nèi),通過該腳本可以對(duì)給定id的iframe高度進(jìn)行動(dòng)態(tài)調(diào)整。為了防止父頁面在子頁面之前加載完成,該函數(shù)會(huì)每隔2秒重新執(zhí)行一次,一共執(zhí)行3次。極端情況下子頁面的加載速度會(huì)慢于父頁面,可適當(dāng)對(duì)執(zhí)行次數(shù)和時(shí)間做調(diào)整。
<iframe frameborder="0" width="450" marginheight="0" marginwidth="0" scrolling="no" id="frm1" name="frm1" src="abc.html" onload="ChangeFrameHeight('frm1')"></iframe>
如果遇到子頁面跨域的問題,可通過HTML5的postMessage來實(shí)現(xiàn),但前提是子頁面需要主動(dòng)向父頁面發(fā)送信息。下面是子頁面部分:
<!DOCTYPE html>
<head>
</head>
<body onload="parent.postMessage(document.body.scrollHeight, 'http://target.domain.com');">
<h3>Got post?</h3>
<p>Lots of stuff here which will be inside the iframe.</p>
</body>
</html>
在父頁面中獲取到子頁面?zhèn)鬟f過來的信息,然后對(duì)iframe的高度進(jìn)行調(diào)整。
<script type="text/javascript">
function resizeCrossDomainIframe(id, other_domain) {
var iframe = document.getElementById(id);
window.addEventListener('message', function(event) {
if (event.origin !== other_domain) return; // only accept messages from the specified domain
if (isNaN(event.data)) return; // only accept something which can be parsed as a number
var height = parseInt(event.data) + 32; // add some extra height to avoid scrollbar
iframe.height = height + "px";
}, false);
}
</script>
<iframe src='abc.html' id="frm1" onload="resizeCrossDomainIframe('frm1', 'http://example.com');">
</iframe>
有關(guān)如何使用HTML5的postMessage()方法可以查看這篇文章http://dev.w3.org/html5/postmsg/#web-messaging
但是在大多數(shù)情況下,iframe中所引用的子頁面除了和父頁面不在同一域之外,我們可能根本無法對(duì)子頁面進(jìn)行任何操作,或者說子頁面根本沒有提供Corss-document messaging功能。在這種情況下,通過postMessage()方法也無法獲取到子頁面的任何信息。由于無法和子頁面進(jìn)行任何交互,也就沒有辦法得知子頁面的document對(duì)象,從未無法根據(jù)子頁面的實(shí)際高度來調(diào)整父頁面iframe的height屬性了。
目前沒有其它實(shí)際有效的方法來處理上面遇到的問題。默認(rèn)情況下可以給iframe指定一個(gè)比較大的高度,這樣假設(shè)所引用的子頁面內(nèi)容不會(huì)超出范圍,除了在頁面上會(huì)留下部分空白區(qū)域外,內(nèi)容顯示基本不會(huì)有問題。
那是否還存在其它比較有效的解決方法呢?期待!
如題所述,本文在介紹可用方法的同時(shí),也向大家詢問除下文列出來的方法之外是否還有其它方法可尋?
通過屬性或CSS來設(shè)置iframe的高度這里就不再具體介紹了。首先來看看如何通過腳本進(jìn)行設(shè)置。
復(fù)制代碼 代碼如下:
function ChangeFrameHeight(id) {
var count = 1;
(function() {
var frm = document.getElementById(id);
var subWeb = document.frames ? document.frames[id].document : frm.contentDocument;
if (subWeb != null) {
var height = Math.max(subWeb.body.scrollHeight, subWeb.documentElement.scrollHeight);
frm.height = height;
}
if (count < 3) {
count = count + 1;
window.setTimeout(arguments.callee, 2000);
}
})();
}
假設(shè)iframe子頁面和父頁面都在同一域內(nèi),通過該腳本可以對(duì)給定id的iframe高度進(jìn)行動(dòng)態(tài)調(diào)整。為了防止父頁面在子頁面之前加載完成,該函數(shù)會(huì)每隔2秒重新執(zhí)行一次,一共執(zhí)行3次。極端情況下子頁面的加載速度會(huì)慢于父頁面,可適當(dāng)對(duì)執(zhí)行次數(shù)和時(shí)間做調(diào)整。
復(fù)制代碼 代碼如下:
<iframe frameborder="0" width="450" marginheight="0" marginwidth="0" scrolling="no" id="frm1" name="frm1" src="abc.html" onload="ChangeFrameHeight('frm1')"></iframe>
如果遇到子頁面跨域的問題,可通過HTML5的postMessage來實(shí)現(xiàn),但前提是子頁面需要主動(dòng)向父頁面發(fā)送信息。下面是子頁面部分:
復(fù)制代碼 代碼如下:
<!DOCTYPE html>
<head>
</head>
<body onload="parent.postMessage(document.body.scrollHeight, 'http://target.domain.com');">
<h3>Got post?</h3>
<p>Lots of stuff here which will be inside the iframe.</p>
</body>
</html>
在父頁面中獲取到子頁面?zhèn)鬟f過來的信息,然后對(duì)iframe的高度進(jìn)行調(diào)整。
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function resizeCrossDomainIframe(id, other_domain) {
var iframe = document.getElementById(id);
window.addEventListener('message', function(event) {
if (event.origin !== other_domain) return; // only accept messages from the specified domain
if (isNaN(event.data)) return; // only accept something which can be parsed as a number
var height = parseInt(event.data) + 32; // add some extra height to avoid scrollbar
iframe.height = height + "px";
}, false);
}
</script>
<iframe src='abc.html' id="frm1" onload="resizeCrossDomainIframe('frm1', 'http://example.com');">
</iframe>
有關(guān)如何使用HTML5的postMessage()方法可以查看這篇文章http://dev.w3.org/html5/postmsg/#web-messaging
但是在大多數(shù)情況下,iframe中所引用的子頁面除了和父頁面不在同一域之外,我們可能根本無法對(duì)子頁面進(jìn)行任何操作,或者說子頁面根本沒有提供Corss-document messaging功能。在這種情況下,通過postMessage()方法也無法獲取到子頁面的任何信息。由于無法和子頁面進(jìn)行任何交互,也就沒有辦法得知子頁面的document對(duì)象,從未無法根據(jù)子頁面的實(shí)際高度來調(diào)整父頁面iframe的height屬性了。
目前沒有其它實(shí)際有效的方法來處理上面遇到的問題。默認(rèn)情況下可以給iframe指定一個(gè)比較大的高度,這樣假設(shè)所引用的子頁面內(nèi)容不會(huì)超出范圍,除了在頁面上會(huì)留下部分空白區(qū)域外,內(nèi)容顯示基本不會(huì)有問題。
那是否還存在其它比較有效的解決方法呢?期待!
您可能感興趣的文章:
- 使用postMesssage()實(shí)現(xiàn)iframe跨域頁面間的信息傳遞
- 使用postMesssage()實(shí)現(xiàn)跨域iframe頁面間的信息傳遞方法
- js iframe跨域訪問(同主域/非同主域)分別深入介紹
- 跨域傳值即主頁面與iframe之間互相傳值
- 利用iframe實(shí)現(xiàn)ajax跨域通信的實(shí)現(xiàn)原理(圖解)
- IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼
- 關(guān)于Iframe如何跨域訪問Cookie和Session的解決方法
- js跨域問題之跨域iframe自適應(yīng)大小實(shí)現(xiàn)代碼
- iframe跨域與session失效問題的解決辦法
- 關(guān)于iframe跨域POST提交的方法示例
相關(guān)文章
JS 新增Cookie 取cookie值 刪除cookie 舉例詳解
cookie很實(shí)用的一個(gè)功能,可以判斷某個(gè)狀態(tài),下面與大家分享下JS 如何新增Cookie 取cookie值 刪除cookie,感興趣的朋友可以參考下2014-10-10
Javascript-Mozilla和IE中的一個(gè)函數(shù)直接量的問題分析
Javascript-Mozilla和IE中的一個(gè)函數(shù)直接量的問題分析...2007-08-08
小程序點(diǎn)餐界面添加購(gòu)物車左右擺動(dòng)動(dòng)畫
這篇文章主要介紹了小程序點(diǎn)餐界面添加購(gòu)物車左右擺動(dòng)動(dòng)畫,當(dāng)用戶點(diǎn)擊添加到購(gòu)物車后會(huì)有一個(gè)左右擺動(dòng)的購(gòu)物車提示效果,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09
小程序?qū)崿F(xiàn)按下錄音松開識(shí)別語音
這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)按下錄音松開識(shí)別語音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Javascript中八種遍歷方法的執(zhí)行速度深度對(duì)比
關(guān)于數(shù)組或?qū)ο蟊闅v,相信很多人都沒有深入觀察過執(zhí)行效率。這是一個(gè)曾在群里吵翻天的話題,讀懂后你將成為遍歷效率話題的大師。下面這篇文章主要介紹了Javascript中八種遍歷方法執(zhí)行速度深度對(duì)比的相關(guān)資料,需要的朋友可以參考下。2017-04-04

