vue3使用iframe引入其他网站,vue-router路由跳转后页面空白,刷新之后才展示页面内容乌龙事件

问题描述:vue3项目的页面A跳转到页面B时,页面B页面是空白的,需要手动刷新一下才能恢复正常,在页面A中用iframe引入了别的网站(后续事实证明,跟iframe没一毛钱的关系)。着急的童鞋可以直接拉到底部看看解决方案,不着急的童鞋可以看看自己的问题和文章中的是不是一样的。

最近做了一个新需求,就是在使用vue3做的项目中,使用iframe引入一个别的网站。这本来也没什么难的,就是新写了一个页面A,在页面A中增加以下代码:

// html (自行在css中给 iframe-container 设置高度)
<template>
  <!--  <div class="container">
          注释的内容
        </div> -->
  <div class="iframe-container">
    <iframe
      :src="data.externalUrl"
      width="100%"
      height="100%"
      frameborder="0"
      target="_top"
    ></iframe>
  </div>
</template>

    // ts(使用了 setup 语法糖), reactive 自行引入即可
const data = reactive({
  externalUrl: 'https://blog.csdn.net/'   // 这里的地址自行替换成自己的
})

这个时候发现在页面A中引入的网站内容正常,但是从页面A跳转到vue3项目的页面B时,页面B页面是空白的,需要手动刷新一下才能恢复正常。发现问题第一时间检查有没有报错,发现没有报错;第二时间去问chatgpt,它给出了3个解决方案,都没能解决问题:
在这里插入图片描述
后来发现把iframe-container注释掉,用原来的container内容也不行了(iframe-container是刚加的,用来测试的),在增加测试代码 iframe-container之前是没问题的。然后就把iframe-container注释也删掉了,发现就正常了…

后来发现问题原因是:在 Vue 模板中,最外层的 标签中第一级不能有注释

对此,chatgpt的解释是(不保真,毕竟chatgpt也有一本正经地胡说八道的时候,参考上图):
在这里插入图片描述
网上没精准地搜出真正的原因,可能是我检索的关键词不对。

所以最终解决办法是:删掉最外层的 标签中第一级的注释,跟 iframe 没有关系。

希望本文对您有所帮助,也请路过的大佬不吝赐教!

以下是一个示例代码,其中包含了如何在Vue3 TypeScript中给iframe地图组件添加点击事件: ``` <template> <div> <h2>My Map</h2> <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3976.885323754285!2d-74.0059416857297!3d40.71278474330322!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c24fa5d33f083b%3A0xc80b8f06e177fe62!2sStatue%20of%20Liberty%20National%20Monument!5e0!3m2!1sen!2sus!4v1622681835423!5m2!1sen!2sus" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy" ref="myMap" ></iframe> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; export default defineComponent({ mounted() { const myMap = this.$refs.myMap as HTMLIFrameElement; const mapDoc = myMap.contentDocument; mapDoc.addEventListener('click', () => { console.log('Map clicked!'); }); }, }); </script> ``` 在这个示例中,我们首先在模板中定义了一个iframe元素,它包含了一个Google地图的嵌入式链接。我们为这个iframe元素添加了一个ref属性,以便我们可以在组件的mounted钩子中访问它。 在mounted钩子中,我们首先使用this.$refs.myMap来获取刚刚定义的iframe元素,并将其转换为HTMLIFrameElement类型。接下来,我们使用myMap.contentDocument来获取嵌入的Google地图的文档对象,然后添加一个点击事件监听器,当地图被点击时,它将在控制台上输出“Map clicked!”。 请注意,由于Google地图是在iframe中嵌入的,因此我们需要使用contentDocument属性来访问它的文档对象。如果我们直接使用myMap.document来访问文档对象,它将返回iframe元素的文档对象,而不是嵌入的Google地图的文档对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值