如何設(shè)置iframe高度自適應(yīng)在跨域情況下的可用方法
如題所述,本文在介紹可用方法的同時(shí),也向大家詢(xún)問(wèn)除下文列出來(lái)的方法之外是否還有其它方法可尋?
通過(guò)屬性或CSS來(lái)設(shè)置iframe的高度這里就不再具體介紹了。首先來(lái)看看如何通過(guò)腳本進(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子頁(yè)面和父頁(yè)面都在同一域內(nèi),通過(guò)該腳本可以對(duì)給定id的iframe高度進(jìn)行動(dòng)態(tài)調(diào)整。為了防止父頁(yè)面在子頁(yè)面之前加載完成,該函數(shù)會(huì)每隔2秒重新執(zhí)行一次,一共執(zhí)行3次。極端情況下子頁(yè)面的加載速度會(huì)慢于父頁(yè)面,可適當(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>
如果遇到子頁(yè)面跨域的問(wèn)題,可通過(guò)HTML5的postMessage來(lái)實(shí)現(xiàn),但前提是子頁(yè)面需要主動(dòng)向父頁(yè)面發(fā)送信息。下面是子頁(yè)面部分:
<!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>
在父頁(yè)面中獲取到子頁(yè)面?zhèn)鬟f過(guò)來(lái)的信息,然后對(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中所引用的子頁(yè)面除了和父頁(yè)面不在同一域之外,我們可能根本無(wú)法對(duì)子頁(yè)面進(jìn)行任何操作,或者說(shuō)子頁(yè)面根本沒(méi)有提供Corss-document messaging功能。在這種情況下,通過(guò)postMessage()方法也無(wú)法獲取到子頁(yè)面的任何信息。由于無(wú)法和子頁(yè)面進(jìn)行任何交互,也就沒(méi)有辦法得知子頁(yè)面的document對(duì)象,從未無(wú)法根據(jù)子頁(yè)面的實(shí)際高度來(lái)調(diào)整父頁(yè)面iframe的height屬性了。
目前沒(méi)有其它實(shí)際有效的方法來(lái)處理上面遇到的問(wèn)題。默認(rèn)情況下可以給iframe指定一個(gè)比較大的高度,這樣假設(shè)所引用的子頁(yè)面內(nèi)容不會(huì)超出范圍,除了在頁(yè)面上會(huì)留下部分空白區(qū)域外,內(nèi)容顯示基本不會(huì)有問(wèn)題。
那是否還存在其它比較有效的解決方法呢?期待!
- 使用postMesssage()實(shí)現(xiàn)iframe跨域頁(yè)面間的信息傳遞
- 使用postMesssage()實(shí)現(xiàn)跨域iframe頁(yè)面間的信息傳遞方法
- js iframe跨域訪問(wèn)(同主域/非同主域)分別深入介紹
- 跨域傳值即主頁(yè)面與iframe之間互相傳值
- 利用iframe實(shí)現(xiàn)ajax跨域通信的實(shí)現(xiàn)原理(圖解)
- IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼
- 關(guān)于Iframe如何跨域訪問(wèn)Cookie和Session的解決方法
- js跨域問(wèn)題之跨域iframe自適應(yīng)大小實(shí)現(xiàn)代碼
- iframe跨域與session失效問(wèn)題的解決辦法
- 關(guān)于iframe跨域POST提交的方法示例
相關(guān)文章
詳解bootstrap-fileinput文件上傳控件的親身實(shí)踐
這篇文章主要介紹了詳解bootstrap-fileinput文件上傳控件的親身實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
javascript中Date對(duì)象的使用總結(jié)
本文介紹了Date對(duì)象的使用方法,清晰明了,實(shí)現(xiàn)方法有多種,僅供大家參考,希望對(duì)大家有所幫助,下面就跟小編一起來(lái)看看吧2016-11-11
javascript+HTML5 canvas繪制時(shí)鐘功能示例
這篇文章主要介紹了javascript+HTML5 canvas繪制時(shí)鐘功能,結(jié)合實(shí)例形式分析了javascript+HTML5 canvas數(shù)值運(yùn)算、圖形繪制與時(shí)間顯示相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
js實(shí)現(xiàn)select跳轉(zhuǎn)功能代碼
實(shí)現(xiàn)select跳轉(zhuǎn)的方法有很多,本例為大家介紹的是js實(shí)現(xiàn)的,通過(guò)location.href獲取跳轉(zhuǎn)地址,需要的朋友可以看看2014-10-10
JS彈出對(duì)話框?qū)崿F(xiàn)方法(三種方式)
這篇文章主要介紹了JS彈出對(duì)話框?qū)崿F(xiàn)方法,結(jié)合實(shí)例形式分析了三種方式,包括alert、confirm及prompt,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12
nullJavascript中創(chuàng)建對(duì)象的五種方法實(shí)例
今天上午,非常郁悶,有很多簡(jiǎn)單基礎(chǔ)的問(wèn)題搞得我有些迷茫,哎,代碼幾天不寫(xiě)就忘。目前又不當(dāng)COO,還是得用心記代碼哦!2013-05-05
electron-builder 的基本使用及electron打包步驟
electron-builder 作為一個(gè)用于 Electron 應(yīng)用程序打包的工具,需要下載并使用 Electron 運(yùn)行時(shí)來(lái)創(chuàng)建可執(zhí)行文件,這篇文章主要介紹了electron-builder 的基本使用,需要的朋友可以參考下2023-12-12
不用AI也能實(shí)現(xiàn)的文字自動(dòng)播報(bào)(SpeechSynthesis文本實(shí)例合成)
SpeechSynthesis是HTML5的一個(gè)新特性,基于SpeechSynthesis可以實(shí)現(xiàn)在客戶(hù)瀏覽器端進(jìn)行動(dòng)態(tài)文本的語(yǔ)音合成播放,這篇文章主要介紹了不用AI也能實(shí)現(xiàn)的文字自動(dòng)播報(bào)(SpeechSynthesis文本實(shí)例合成),需要的朋友可以參考下2023-03-03

