iframe實(shí)現(xiàn)高度自適應(yīng)小程序web-view方案
前言
最近在項(xiàng)目開(kāi)發(fā)中,遇到一種場(chǎng)景:H5的頁(yè)面展示的有服務(wù)端返回的頁(yè)面展示,所以考慮的iframe 引入對(duì)應(yīng)的頁(yè)面展示,在瀏覽器是可以正常設(shè)置 iframe 的高度,可以正常展示,但是在小程序的的 web-view 展示是不生效的。
關(guān)于 contentWindow, contentDocument
定義和用法
用iframe嵌套頁(yè)面時(shí),如果父頁(yè)面要獲取子頁(yè)面里面的內(nèi)容,可以使用contentWindow或者contentDocument,其區(qū)別如下:
contentWindow:是用來(lái)獲取iframe的window對(duì)象的,只讀屬性,兼容各大瀏覽器,用法如下:
document.getElementById("iframeId").contentWindow
這樣簡(jiǎn)單的一句就得到了iframe包含頁(yè)面的window對(duì)象;
contentDocument:是用來(lái)獲取子窗口的document對(duì)象的,主流瀏覽器都支持和ie8+支持,用法如下
document.getElementById("iframeId").contentDocument
這樣簡(jiǎn)單的一句就得到了iframe包含頁(yè)面的document對(duì)象;
以上兩種方法是在父窗口中獲取到子窗口,既然我們都能拿到子窗口window對(duì)象和document對(duì)象了,那么子窗口內(nèi)其他的操作就easy了 !
contentDocument 屬性能夠以 HTML 對(duì)象來(lái)返回 iframe 中的文檔, 可以通過(guò)所有標(biāo)準(zhǔn)的 DOM 方法來(lái)處理被返回的對(duì)象。
語(yǔ)法:frameObject.contentWindow,或者 iframeObject.contentWindow(不是jquery對(duì)象)
兼容獲取document對(duì)象:
var getIFrameDoc = function(){
var iobj = document.createElement("iframe");
document.getElementsByTagName("body")[0].appendChild(iobj);
return iobj.contentDocument || iobj.contentWindow.document;
}
基本使用:
1、document.getElementById("myiframe").contentWindow,得到iframe對(duì)象后,就可以通過(guò)contentWindow得到iframe包含頁(yè)面的window對(duì)象,然后就可以正常訪問(wèn)頁(yè)面元素了;
2、$("#myiframe")[0].contentWindow,jquery選擇器獲得iframe,先把jquery對(duì)象轉(zhuǎn)換為DOM對(duì)象,或者使用get()方法轉(zhuǎn)換;
3、("#myiframe")[0].contentWindow.("#dd").val(),可以在得到iframe的window對(duì)象后接著使用jquery選擇器進(jìn)行頁(yè)面操作;
4、 $("#myiframe")[0].contentWindow.username="zhangsan" ; 可以通過(guò)這種方式向iframe頁(yè)面?zhèn)鬟f參數(shù),在iframe頁(yè)面window.username就可以獲取到值,username是自定義的全局變量;
5、在iframe頁(yè)面通過(guò)parent可以獲得主頁(yè)面的window,接著就可以正常訪問(wèn)父親頁(yè)面的元素了;
6、parent.$("#frame_A")[0].contentWindow.document.getElmentById("#frame_B"); 同級(jí)iframe頁(yè)面之間調(diào)用,需要先得到父親的window,然后調(diào)用同級(jí)的iframe得到window進(jìn)行操作;
//在子級(jí)iframe設(shè)置 父級(jí) iframe ,或 孫級(jí) iframe 高度。
function showIframeH(){
var parentWin = parent.document.getElementById("test");
if(!parentWin) return false;
var sub = parentWin.contentWindow.document.getElementById("test2");
if(!sub) return false;
var thirdHeight = sub.contentWindow.document.body.offsetHeight; //第三層 body 對(duì)象
sub.height = thirdHeight; //設(shè)置第二層 iframe 的高度
var secondHeight = parentWin .contentWindow.document.body.offsetHeight; //第二層 body 對(duì)象
parentWin .height = secondHeight; //設(shè)置第一層 iframe 的高度
}
- 一、在使用iframe的頁(yè)面時(shí),要操作這個(gè)iframe里面的DOM元素可以用:contentWindow、contentDocument
1、先獲取iframe里面的window對(duì)象,再通過(guò)這個(gè)對(duì)象,獲取到里面的DOM元素
例子:
var ifr = document.getElementById("iframe"); ifr.contentWindow.document.getElementById("XXXXX") <iframe src="a.html" id=""></iframe>
ifr.contentWindow 這里,返回的是iframe的window對(duì)象,所以后面可以接著調(diào)用document方法,再接著調(diào)用getElementByTagName。那么就可以對(duì)iframe里面的元素進(jìn)行操作了。
- 二、在iframe本頁(yè)面,要操作這個(gè)iframe的父頁(yè)面的DOM元素(即嵌套這個(gè)iframe的頁(yè)面)可以用:
window.parent、window.top(這里的TOP是獲取的頂層,即有多層嵌套iframe的時(shí)候使用)
var ifr = document.getElementByTagName("iframe"); ifr.parent.document.getElementById("XXXXX") <iframe src="a.html" id=""></iframe>
解決方案
使用 Vue 寫的項(xiàng)目,原生的可以直接使用 window.onload = function(){}
<iframe
ref="iframe"
frameborder="no"
scrolling="auto"
class="iframe-wrap"
id="iframeWrap"
:src="context_url"
:height="loadHeight"
@load.once="setIframeHeight">
</iframe>
setIframeHeight(){
const ifm= document.getElementById('iframeWrap');
try {
const bodyDom = ifm.contentWindow || ifm.contentDocument.parentWindow;
const height = bodyDom.document.body.scrollHeight || bodyDom.document.documentElement.scrollHeight
this.loadHeight = height
} catch (error) {
console.log(error)
}
},
注意:本地開(kāi)發(fā)時(shí),若存在src跨域問(wèn)題,高度自適應(yīng)不起作用,打包部署之后高度會(huì)自適應(yīng)。
以上就是iframe實(shí)現(xiàn)高度自適應(yīng)小程序web-view方案的詳細(xì)內(nèi)容,更多關(guān)于iframe高度自適應(yīng)web-view的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Javascript檢查圖片大小不要讓大圖片撐破頁(yè)面
用Javascript判斷圖片大小,其實(shí)只要寫一個(gè)簡(jiǎn)單的函數(shù)就可以了,使用其他語(yǔ)言進(jìn)行判斷,過(guò)程比較復(fù)雜,用 Javascript 判斷輕松搞定2014-11-11
javascript禁制后退鍵(Backspace)實(shí)例代碼
這篇文章介紹了javascript禁制后退鍵(Backspace)實(shí)例代碼,有需要的朋友可以參考一下2013-11-11
原生JS實(shí)現(xiàn)簡(jiǎn)單的倒計(jì)時(shí)功能示例
這篇文章主要介紹了原生JS實(shí)現(xiàn)簡(jiǎn)單的倒計(jì)時(shí)功能,涉及javascript基于定時(shí)器的日期時(shí)間運(yùn)算與頁(yè)面元素屬性動(dòng)態(tài)修改相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
點(diǎn)擊進(jìn)行復(fù)制的JS代碼實(shí)例
這篇文章介紹了點(diǎn)擊進(jìn)行復(fù)制的JS代碼實(shí)例,有需要的朋友可以參考一下2013-08-08
three.js中3D視野的縮放實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了three.js中3D視野的縮放實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

