嵌套的页面——自适应高度与跨越操作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 = `${clientHeight}px`
      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>

原文地址:https://www.cnblogs.com/wheatCatcher/p/11269256.html

时间: 2024-08-29 03:15:48

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

跨域IFRAME自适应高度(子页面TAB切换不同的高度,主页面IFRAME嵌套子页面自适应高度)

1.pinganproxy.html <!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8"><title></title></head><body><script type="text/javascript">eval(function(p,a,c,k,e,r){e=fu

初试swiper插件(一)-让页面自适应高度

当我使用这个插件时发现不可以在每一节上写上height:auto或者height:100%,如果使用这样的确可以让页面自适应高度,但是分页器会不显示在页面的的中间,而且并不是每一页的显示. 如: 此时应该要给swiper-container类  设置如下即可. .swiper-container { width: 100%; height: 100%; } 完成! 原文地址:https://www.cnblogs.com/ZwjFronTend/p/broken_life.html

解决div嵌套时IE8和FF无法自适应高度

解决div嵌套时IE8和FF无法自适应高度 还是做类似新浪评论回复的时候,将回复的DIV嵌套在一个DIV中,然后点击回复的时候显示子DIV,这是父DIV的高度是会变化的,于是我将父DIV的高度设置为height:auto;可是问题就出现了,在IE6和IE7下父DIV的高度可以自适应而在IE8和FF下却不可以,于是我开始在网上搜索,嘿嘿,现在的网络知识共享真好,让我找到解决办法了! 在父DIV的CSS中添加两个属性值 clear:both; overflow:auto; OK啦!希望对遇到同样问题

javascript实现页面自适应reset可见区域高度

1.该功能只适用于需要页面自动撑满或缩小到可见区域,并且只对单个主体改变高度的需求. var ResetControl = function (pTask) { var _task = pTask || [], _isLock = false, bindEvent = function(){ var me = this; $(window).bind('resize.reset', function (event) { fire.call(me); if (_task.length === 0)

iframe自适应高度,以及一个页面加载多个iframe

<iframe id="iframepage" src="Index.html" name="iframepage" frameborder="0" width="1349" scrolling="no" ></iframe> <a href="aboutUs.html" ; target="iframepage" &

jquery iframe取得元素与自适应高度

总结一下iframe在jquery中怎么操作的,下面我来给各位介绍jquery 获取iframe子/父页面的元素及iframe在jquery高度自适应实现方法,各位朋友可参考. jquery方法: 在iframe子页面获取父页面元素 $('#objId', parent.document); 在iframe子页面获取父页面元素 代码如下:  代码如下 复制代码 $('#objId', parent.document); // 搞定... 在父页面 获取iframe子页面的元素代码如下:  代码如

网页制作技巧:iframe自适应高度

转自:http://www.enet.com.cn/article/2012/0620/A20120620126237.shtml 通过Google搜索iframe 自适应高度,结果5W多条,搜索iframe 高度自适应,结果2W多条. 我翻了前面的几十条,刨去大量的转载,有那么三五篇是原创的.而这几篇原创里面,基本上只谈到如何自适应静的东西,就是没有考虑到JS操作DOM之后,如何做动态同步的问题.另外,在兼容性方面,也研究的不彻底. 这篇文章,希望在这两个方面再做一些深入. 可能有人还没接触到

iOS 【终极方案】精准获取webView内容高度,自适应高度

前言:是这样的,刚写完上一篇文章还没缓过神来,上一篇文章我还提到了,想和大家聊聊原生+H5如何无缝连接的故事.结果我朋友就给我发了两篇他的作品.他的做法也都有独到之处.好的文章都是这样,让你每次看都能有新的收获,我们也都致力于写一些能帮别人解决问题的文章,下面我用另一种方式来完美实现这个问题.毕竟之前大家都是根据UIWebView写的,我来说说换成WK之后的区别,主题思路也不同哦~ 插两个链接,是我朋友的大家也可以做个对比 iOS [终极方案]精准获取webView内容高度,自适应高度 iOS

跨域下iframe自适应高度

最近在做一个需求,需求大致背景:页面中iframe嵌入另一家公司的列表页 博主的第一反应就是“very easy!”,so,挽起双袖开始敲代码 结果出现问题了,iframe跨域,无法获得内嵌页面的高度,因此出现的上下滚动条,so难看! 于是上网找大神,皇天不负有心人啊,终于找到了,激动之情无以言表.... 故事背景交代完毕 /******************************华丽的分割线,哈哈****************************/ 大神的例子大致是这样的: 假设ww