iframe实现高度自适应小程序web-view方案

 更新时间:2023年01月11日 11:10:55   作者:念念不忘  
这篇文章主要为大家介绍了iframe实现高度自适应小程序web-view方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

最近在项目开发中,遇到一种场景:H5的页面展示的有服务端返回的页面展示,所以考虑的iframe 引入对应的页面展示,在浏览器是可以正常设置 iframe 的高度,可以正常展示,但是在小程序的的 web-view 展示是不生效的。

关于 contentWindow, contentDocument

定义和用法

用iframe嵌套页面时,如果父页面要获取子页面里面的内容,可以使用contentWindow或者contentDocument,其区别如下:

contentWindow:是用来获取iframe的window对象的,只读属性,兼容各大浏览器,用法如下:

document.getElementById("iframeId").contentWindow 

这样简单的一句就得到了iframe包含页面的window对象;

contentDocument:是用来获取子窗口的document对象的,主流浏览器都支持和ie8+支持,用法如下

document.getElementById("iframeId").contentDocument

这样简单的一句就得到了iframe包含页面的document对象;

以上两种方法是在父窗口中获取到子窗口,既然我们都能拿到子窗口window对象和document对象了,那么子窗口内其他的操作就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对象转换为DOM对象,或者使用get()方法转换;

3、("#myiframe")[0].contentWindow.("#dd").val(),可以在得到iframe的window对象后接着使用jquery选择器进行页面操作;

4、 $("#myiframe")[0].contentWindow.username="zhangsan" ; 可以通过这种方式向iframe页面传递参数,在iframe页面window.username就可以获取到值,username是自定义的全局变量;

5、在iframe页面通过parent可以获得主页面的window,接着就可以正常访问父亲页面的元素了;

6、parent.$("#frame_A")[0].contentWindow.document.getElmentById("#frame_B"); 同级iframe页面之间调用,需要先得到父亲的window,然后调用同级的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对象,所以后面可以接着调用document方法,再接着调用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)
      } 
    },

注意:本地开发时,若存在src跨域问题,高度自适应不起作用,打包部署之后高度会自适应。

以上就是iframe实现高度自适应小程序web-view方案的详细内容,更多关于iframe高度自适应web-view的资料请关注脚本之家其它相关文章!

相关文章

  • JS触摸与手势事件详解

    JS触摸与手势事件详解

    这篇文章主要为大家详细介绍了JS触摸与手势事件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 可以将word转成html的js代码

    可以将word转成html的js代码

    这段很短的代码,可以将word转出html格式的代码,当然word自己也带的,另存为里面就有的,喜欢的朋友可以试试。
    2010-04-04
  • TypeScript调整数组元素顺序算法

    TypeScript调整数组元素顺序算法

    数组类型在TS中可以使用多种方式,比较灵活,下面这篇文章主要给大家介绍了关于TypeScript调整数组元素顺序算法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • [JSF]使用DataModel处理表行事件的实例代码

    [JSF]使用DataModel处理表行事件的实例代码

    在使用JSF中,最常用的恐怕就要属于表格的处理了。使用DataModel可以方便地进行对表行的处理:
    2013-08-08
  • 基于javascript实现动态时钟效果

    基于javascript实现动态时钟效果

    这篇文章主要为大家详细介绍了基于javascript实现动态时钟效果的相关资料,动态显示系统当前时间,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • JavaScript原型对象、构造函数和实例对象功能与用法详解

    JavaScript原型对象、构造函数和实例对象功能与用法详解

    这篇文章主要介绍了JavaScript原型对象、构造函数和实例对象功能与用法,结合实例形式分析了javascript面向对象相关原型对象、构造函数及实例对象的概念、功能与相关使用技巧,需要的朋友可以参考下
    2018-08-08
  • JavaScript格式化json和xml的方法示例

    JavaScript格式化json和xml的方法示例

    这篇文章主要介绍了JavaScript格式化json和xml的方法,结合实例形式分析了javascript格式化json及格式化xml数据的具体操作技巧,需要的朋友可以参考下
    2019-01-01
  • 动态创建按钮的JavaScript代码

    动态创建按钮的JavaScript代码

    本文给大家分享一段JS实例代码介绍动态创建按钮的方法,需要的朋友参考下本文
    2016-01-01
  • display和visibility的区别示例介绍

    display和visibility的区别示例介绍

    这篇文章主要介绍了display和visibility的区别,需要的朋友可以参考下
    2014-02-02
  • layui使用templet格式化表格数据的方法

    layui使用templet格式化表格数据的方法

    今天小编就为大家分享一篇layui使用templet格式化表格数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09

最新评论