iframe實現(xiàn)高度自適應小程序web-view方案
前言
最近在項目開發(fā)中,遇到一種場景:H5的頁面展示的有服務端返回的頁面展示,所以考慮的iframe 引入對應的頁面展示,在瀏覽器是可以正常設置 iframe 的高度,可以正常展示,但是在小程序的的 web-view 展示是不生效的。
關于 contentWindow, contentDocument
定義和用法
用iframe嵌套頁面時,如果父頁面要獲取子頁面里面的內(nèi)容,可以使用contentWindow或者contentDocument,其區(qū)別如下:
contentWindow
:是用來獲取iframe的window對象的,只讀屬性,兼容各大瀏覽器,用法如下:
document.getElementById("iframeId").contentWindow
這樣簡單的一句就得到了iframe包含頁面的window對象;
contentDocument
:是用來獲取子窗口的document對象的,主流瀏覽器都支持和ie8+支持,用法如下
document.getElementById("iframeId").contentDocument
這樣簡單的一句就得到了iframe包含頁面的document對象;
以上兩種方法是在父窗口中獲取到子窗口,既然我們都能拿到子窗口window對象和document對象了,那么子窗口內(nèi)其他的操作就easy了 !
contentDocument 屬性能夠以 HTML 對象來返回 iframe 中的文檔, 可以通過所有標準的 DOM 方法來處理被返回的對象。
語法:frameObject.contentWindow,或者 iframeObject.contentWindow(不是jquery對象)
兼容獲取document對象:
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對象后,就可以通過contentWindow得到iframe包含頁面的window對象,然后就可以正常訪問頁面元素了;
2、$("#myiframe")[0].contentWindow,jquery選擇器獲得iframe,先把jquery對象轉(zhuǎn)換為DOM對象,或者使用get()方法轉(zhuǎn)換;
3、("#myiframe")[0].contentWindow.("#dd").val(),可以在得到iframe的window對象后接著使用jquery選擇器進行頁面操作;
4、 $("#myiframe")[0].contentWindow.username="zhangsan" ; 可以通過這種方式向iframe頁面?zhèn)鬟f參數(shù),在iframe頁面window.username就可以獲取到值,username是自定義的全局變量;
5、在iframe頁面通過parent可以獲得主頁面的window,接著就可以正常訪問父親頁面的元素了;
6、parent.$("#frame_A")[0].contentWindow.document.getElmentById("#frame_B"); 同級iframe頁面之間調(diào)用,需要先得到父親的window,然后調(diào)用同級的iframe得到window進行操作;
//在子級iframe設置 父級 iframe ,或 孫級 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 對象 sub.height = thirdHeight; //設置第二層 iframe 的高度 var secondHeight = parentWin .contentWindow.document.body.offsetHeight; //第二層 body 對象 parentWin .height = secondHeight; //設置第一層 iframe 的高度 }
- 一、在使用iframe的頁面時,要操作這個iframe里面的DOM元素可以用:contentWindow、contentDocument
1、先獲取iframe里面的window對象,再通過這個對象,獲取到里面的DOM元素
例子:
var ifr = document.getElementById("iframe"); ifr.contentWindow.document.getElementById("XXXXX") <iframe src="a.html" id=""></iframe>
ifr.contentWindow 這里,返回的是iframe的window對象,所以后面可以接著調(diào)用document方法,再接著調(diào)用getElementByTagName。那么就可以對iframe里面的元素進行操作了。
- 二、在iframe本頁面,要操作這個iframe的父頁面的DOM元素(即嵌套這個iframe的頁面)可以用:
window.parent、window.top(這里的TOP是獲取的頂層,即有多層嵌套iframe的時候使用)
var ifr = document.getElementByTagName("iframe"); ifr.parent.document.getElementById("XXXXX") <iframe src="a.html" id=""></iframe>
解決方案
使用 Vue 寫的項目,原生的可以直接使用 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) } },
注意:本地開發(fā)時,若存在src跨域問題,高度自適應不起作用,打包部署之后高度會自適應。
以上就是iframe實現(xiàn)高度自適應小程序web-view方案的詳細內(nèi)容,更多關于iframe高度自適應web-view的資料請關注腳本之家其它相關文章!
相關文章
JavaScript實現(xiàn)輸入框(密碼框)出現(xiàn)提示語
有時候我們需要在登陸表單有一些提示語言,比如“請輸入用戶名”和“請輸入密碼”等語言,通過本文給大家介紹JavaScript實現(xiàn)輸入框(密碼框)出現(xiàn)提示語的相關知識,對js實現(xiàn)輸入框提示相關知識感興趣的朋友一起學習吧2016-01-01javascript 構(gòu)造函數(shù)強制調(diào)用經(jīng)驗總結(jié)
本文將介紹javascript構(gòu)造函數(shù)調(diào)用方面的案例應用,需要了解的朋友可以參考下2012-12-12JavaScript實現(xiàn)簡單的Markdown語法解析器
Markdown 是一種輕量級標記語言, 它允許人們使用易讀易寫的純文本格式編寫文檔,然后轉(zhuǎn)換成有效的 XHTML(或者HTML)文檔。本文將利用JavaScript實現(xiàn)簡單的Markdown語法解析器,感興趣的可以了解一下2023-03-03JavaScript實現(xiàn)多維數(shù)組的方法
這篇文章主要介紹了JavaScript實現(xiàn)多維數(shù)組的方法,有需要的朋友可以參考一下2013-11-11