使用iframe遇到的问题及解决

记录一下使用iframe遇到的bug

动态的iframe src与返回的bug

场景:iframe嵌入页面,有多个tab,切换tab修改iframe的src,显示不同的页面

    <ul>
      <li
        v-for="tab in tabList"
        :key="tab.tabName"
        class="tab-item"
        :class="{ activeTab: activeTabName === tab.tabName }"
        @click="changeTab(tab)"
      >
        {{ tab.tabName }}
      </li>
    </ul>
    <iframe
      :src="iframePath"
      frameborder="0"
      width="100%"
      height="600"
      id="iframe"
   </iframe>

  data() {
    return {
      tabList: [
        {
          path: "http://www.test.com/firstPage.html",
          tabName: "hover页面",
        },
        {
          path: "http://www.test.com/secondPage.html",
          tabName: "关系图谱",
        },
        {
          path: "http://www.test.com/thirdPage.html",
          tabName: "echart页面 ",
        },
      ],
      activeTabName: "hover页面",
      iframePath: "http://www.test.com/firstPage.html",
    };
  },
  methods: {
    changeTab(tab) {
       if(this.iframePath===tab.path) return
      this.activeTabName = tab.tabName;
      this.iframePath = tab.path;
    },
  },

操作步骤:切换tab,然后点击浏览器的返回,就会出现tab与页面内容对不上的情况

原因:修改iframe的src,window.history历史记录中也会添加一条记录(动态切换iframe的src会导致增加一条iframe的历史浏览记录)

解决方案:在切换src的时候把iframe给销毁再重新创建就行了。这样就是一个新的iframe,不会触发他的变更操作,也就不会往window.history中存入记录

这种写法不太优雅,但是可以实现不添加历史记录:

      let parent = document.querySelector(".iframe-parent");

      let child = document.getElementById("iframe");

      let newElement = document.createElement("iframe");

      newElement.src = tab.path;

      newElement.id = "iframe";

      parent.replaceChild(newElement, child);

由于vue中的key更改时会重新渲染这个组件,给iframe添加一个key,这样每次切换时,key不一样就会重新创建一个iframe,销毁原来的iframe,这样也能做到不添加历史记录:

    <!-- 加了key会重新渲染iframe,不会往history中添加记录了 -->

    <iframe

      :src="iframePath"

      frameborder="0"

      width="100%"

      height="600"

      id="iframe"

      :key="iframePath"

    ></iframe>

http与https的嵌入的问题

将已开发好的页面资源(http)通过iframe嵌入https的协议下,内容没有加载出来,结果发现控制台报错

Mixed Content: The page at 'https://' was loaded over HTTPS, but requested an insecure frame 'http://'. This request has been blocked; the content must be served over HTTPS.

混合内容:在某些情况下,HTTPS 站点也可能包含一些使用明文 HTTP 协议加载的元素,这将形成一个称为混合内容的情形,有时也称为“HTTP over HTTPS”

1》主动混合内容:通过 HTTP 提供的元素或依赖项能够与整个网页交互并对网页进行更改,如js或api请求

2》被动混合内容(显示混合内容):未加密的 HTTP 内容仅限于站点上封装的并且无法与页面其余部分交互的元素,如图片与视频;攻击者可以阻止或替换通过 HTTP 加载的图片,但无法修改页面的其余部分

大多数现代 Web 浏览器都在开发者控制台中提供针对混合内容的警告,并且阻止危险程度较高的混合内容类型。各种浏览器都有自己的一套规则,但一般而言,主动混合内容更有可能会被阻止,被动混合内容仅在开发者控制台中向用户提供混合内容警告

解决方案:

方案1:将外壳链接降为http

方案2:将iframe的内容升级成https协议

方案3:nginx代理

第一种和第二种很容易被否决,因为要申请,流程比较麻烦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在网页中嵌套使用iframe时,可能遇到一些问题,如样式冲突、无法调整大小、页面加载速度慢等。下面介绍一些解决iframe嵌套页面问题的方法。 首先,针对样式冲突问题,可以使用CSS命名空间(CSS Namespaces)来解决。通过添加命名空间前缀,可以确保不同iframe中的元素样式不相互冲突。这样可以避免样式被覆盖,保证每个iframe中的样式独立。 其次,针对调整iframe大小问题,可以使用JavaScript来动态调整iframe的大小。通过监听iframe内部内容的高度变化,并将高度值传递给父页面,从而实现自适应调整iframe的大小。这样可以确保iframe始终能够显示完整的内容,提高用户体验。 另外,针对页面加载速度慢的问题,可以通过延迟加载或者懒加载来提升性能。即在页面初次加载时,只加载展示iframe的占位符,并不加载真正的内容。当用户需要查看或者操作iframe时,再加载对应的内容。这样可以减少初次加载的数据量,提高页面加载速度。 此外,还可以考虑使用无需iframe的其他技术来实现类似的功能,如Ajax、Vue.js等。这些技术可以通过异步加载内容或者组件来避免使用iframe,从而减少了嵌套页面问题。 综上所述,处理iframe嵌套页面问题需要使用CSS命名空间、动态调整大小、延迟加载或懒加载等方法。同时也可以考虑使用其他技术来避免使用iframe带来的问题。通过采取这些方法,可以更好地解决iframe嵌套页面问题,提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值