嵌套的页面——自适应高度与跨越操作DOM

Posted wheatcatcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌套的页面——自适应高度与跨越操作DOM相关的知识,希望对你有一定的参考价值。

<div id="myIframeId">  
<iframe ref="myIframe" name="odpIframeName" :src="iframeUrl" frameborder="0" align="middle" width="100%" height="100%" />
</div>

背景:

frame嵌套的页面:高度默认很小,而且如果不在相同域名,无法访问内部的DOM元素

1.如果设置固定的高度,部分屏幕部分满足需求,这里使用动态获取浏览器屏幕高度的方法设置:这里去除顶栏100px高度,自适应屏幕

autoheight () 
    let winHeight = 0
    if (window.innerHeight)  winHeight = window.innerHeight  else if ((document.body) && (document.body.clientHeight)) 
    winHeight = document.body.clientHeight 
    if (document.documentElement && document.documentElement.clientHeight)  winHeight =
    document.documentElement.clientHeight 
    document.getElementById(‘myIframeId‘).style.height = winHeight - 100 + ‘px‘
  mounted () 
    this.autoheight()
    window.onresize = () => 
      return (() => 
        this.autoheight()
      )()
    
  

2.如何操作iframe内部的DOm:

<iframe src ="/index.html" id="ifr1" name="ifr1" scrolling="yes">
  <p>Your browser does not support iframes.</p>
</iframe>
var iframe = document.getElementById("iframe1");
var iwindow = iframe.contentWindow;
var idoc = iwindow.document;
console.log("window",iwindow);//获取iframe的window对象
console.log("document",idoc); //获取iframe的document
console.log("html",idoc.documentElement);//获取iframe的html
console.log("head",idoc.head); //获取head
console.log("body",idoc.body); //获取body

更简单的方法:通过name获取

console.log(window.frames[‘ifr1‘].window);
console.dir(document.getElementById("ifr1").contentWindow);

也可以获取父元素的Dom

window.parent 获取上一级的window对象,如果还是iframe则是该iframe的window对象
window.top 获取最顶级容器的window对象,即,就是你打开页面的文档
window.self 返回自身window的引用。可以理解 window===window.self(脑残)

推荐参考:http://caibaojian.com/js-get-iframe.html

<template>
  <iframe :src="urlPath" class="iframe" ref="iframe"></iframe>
</template>

<script>
import NProgress from ‘nprogress‘ // progress bar
import ‘nprogress/nprogress.css‘ // progress bar style
export default 
  name: ‘nxframe‘,
  data() 
    return 
      urlPath: this.getUrlPath() // iframe src 路径
    
  ,
  created() 
    NProgress.configure( showSpinner: false )
  ,
  mounted() 
    this.load()
    this.resize()
  ,
  watch: 
    $route: function() 
      this.load()
    ,
    routerPath: function(val) 
      // 监听routerPath变化,改变src路径
      this.urlPath = this.getUrlPath()
    
  ,
  methods: 
    // 显示等待框
    show() 
      NProgress.start()
    ,
    // 隐藏等待狂
    hide() 
      NProgress.done()
    ,
    // 加载浏览器窗口变化自适应
    resize() 
      window.onresize = () => 
        this.iframeInit()
      
    ,
    // 加载组件
    load() 
      this.show()
      var flag = true // URL是否包含问号
      if (this.$route.query.src.indexOf(‘?‘) === -1) 
        flag = false
      
      var list = []
      for (var key in this.$route.query) 
        if (key !== ‘src‘ && key !== ‘name‘) 
          list.push(`$key= this.$route.query[key]`)
        
      
      list = list.join(‘&‘).toString()
      if (flag) 
        this.$route.query.src = `$this.$route.query.src$
          list.length > 0 ? `&list` : ‘‘
        `
       else 
        this.$route.query.src = `$this.$route.query.src$
          list.length > 0 ? `?list` : ‘‘
        `
      
      // 超时3s自动隐藏等待狂,加强用户体验
      let time = 3
      const timeFunc = setInterval(() => 
        time--
        if (time === 0) 
          this.hide()
          clearInterval(timeFunc)
        
      , 1000)
      this.iframeInit()
    ,
    // iframe窗口初始化
    iframeInit() 
      const iframe = this.$refs.iframe
      const clientHeight = document.documentElement.clientHeight - 200
      iframe.style.height = `$clientHeightpx`
      if (iframe.attachEvent) 
        iframe.attachEvent(‘onload‘, () => 
          this.hide()
        )
       else 
        iframe.onload = () => 
          this.hide()
        
      
    ,
    getUrlPath: function() 
      // 获取 iframe src 路径
      let url = window.location.href
      url = url.replace(‘/myiframe‘, ‘‘)
      return url
    
  

</script>

<style lang="scss">
.iframe 
  width: 100%;
  height: 100%;
  border: 0;
  overflow: hidden;
  box-sizing: border-box;

</style>

 

以上是关于嵌套的页面——自适应高度与跨越操作DOM的主要内容,如果未能解决你的问题,请参考以下文章

iframe标签嵌套页面时,如何让页面内的高度自适应

iframe 高度设置iframe 自适应高度方法总结

怎么将iframe框设置自适应

iframe的跨域高度自适应(通过跨域页面中嵌套本域页面)

vue iframe嵌套页面高度自适应 (ios 宽度扩大的bug , ios展示比例问题)

解决 niceScroll 自适应DOM 高度变化