麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

如何設置iframe高度自適應在跨域情況下的可用方法

2019-11-20 22:19:28
字體:
來源:轉載
供稿:網友
在頁面上使用iframe來動態加載頁面內容是網頁開發中比較常見的方法。在父頁面中給定一個不帶滾動條的iframe,然后對屬性src指定一個可加載的頁面,這樣當父頁面被訪問的時候,子頁面可以被自動加載。iframe的高度需要根據子頁面的實際高度來進行調整。如果iframe的高度小于子頁面的實際高度,超出的部分無法顯示;相反,如果iframe的高度過高,則頁面上會出現大量的空白區域。我們可以通過屬性或者CSS來設置iframe的高度,當不確定子頁面內容的高度時,也可以通過腳本來進行動態指定。但是如果子頁面不在同一域中怎么辦?這時候腳本沒有辦法獲取到子頁面的高度,存在JavaScript跨域的問題!

如題所述,本文在介紹可用方法的同時,也向大家詢問除下文列出來的方法之外是否還有其它方法可尋?

通過屬性或CSS來設置iframe的高度這里就不再具體介紹了。首先來看看如何通過腳本進行設置。
復制代碼 代碼如下:

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);
}
})();
}

假設iframe子頁面和父頁面都在同一域內,通過該腳本可以對給定id的iframe高度進行動態調整。為了防止父頁面在子頁面之前加載完成,該函數會每隔2秒重新執行一次,一共執行3次。極端情況下子頁面的加載速度會慢于父頁面,可適當對執行次數和時間做調整。
復制代碼 代碼如下:

<iframe frameborder="0" width="450" marginheight="0" marginwidth="0" scrolling="no" id="frm1" name="frm1" src="abc.html" onload="ChangeFrameHeight('frm1')"></iframe>

如果遇到子頁面跨域的問題,可通過HTML5的postMessage來實現,但前提是子頁面需要主動向父頁面發送信息。下面是子頁面部分:
復制代碼 代碼如下:

<!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>

在父頁面中獲取到子頁面傳遞過來的信息,然后對iframe的高度進行調整。
復制代碼 代碼如下:

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

有關如何使用HTML5的postMessage()方法可以查看這篇文章http://dev.w3.org/html5/postmsg/#web-messaging

但是在大多數情況下,iframe中所引用的子頁面除了和父頁面不在同一域之外,我們可能根本無法對子頁面進行任何操作,或者說子頁面根本沒有提供Corss-document messaging功能。在這種情況下,通過postMessage()方法也無法獲取到子頁面的任何信息。由于無法和子頁面進行任何交互,也就沒有辦法得知子頁面的document對象,從未無法根據子頁面的實際高度來調整父頁面iframe的height屬性了。

目前沒有其它實際有效的方法來處理上面遇到的問題。默認情況下可以給iframe指定一個比較大的高度,這樣假設所引用的子頁面內容不會超出范圍,除了在頁面上會留下部分空白區域外,內容顯示基本不會有問題。

那是否還存在其它比較有效的解決方法呢?期待!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 综合网天天色 | 久久精品国产久精国产 | 日本黄色免费片 | 久久久久久久久久美女 | 4399一级成人毛片 | 欧美中文字幕一区二区 | 国产毛片网 | 精品一区二区三区在线观看视频 | 成人午夜免费观看 | 精品一区二区免费视频视频 | 国产91对白叫床清晰播放 | 国产交换3p国产精品 | 性欧美大战久久久久久久免费观看 | 精品乱码久久久久 | 99视频网址 | 免费在线观看成人网 | 国产亚洲精品久久久久婷婷瑜伽 | 精品国产一区二区三区久久久蜜月 | 黄色片视频观看 | 小雪奶水翁胀公吸小说最新章节 | 99国产精品国产免费观看 | 久久99国产精品免费网站 | 国产亚洲美女精品久久久2020 | 国产一区二区三区四区五区在线 | 91精品国产刺激国语对白 | 鲁丝一区二区二区四区 | 国产视频第一区 | 主播粉嫩国产在线精品 | 国产精品久久久麻豆 | 夜夜b| 综合图区亚洲 | 色播视频网站 | 在线观看免费污视频 | 欧美性生活视频免费 | 午夜视频久久久 | 成人午夜视频免费看 | 久久久大片 | 哪里可以看免费的av | 日本在线视频免费 | 色玖玖综合 | 精品成人免费视频 |