vue组件和iframe页面的相互传参问题及解决

 更新时间:2022年05月31日 15:48:03   作者:weixin_42108617  
这篇文章主要介绍了vue组件和iframe页面的相互传参问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue组件和iframe页面相互传参

目前网上大多关于iframe父子传参的博客都是在叙述父页面是html文件,子iframe文件也是html文件,涉及到父页面是vue组件子iframe页面是html的博客多数讲的不是很明白;

而最近我在项目中碰到了这种需求:在vue组件中嵌入iframe页面,并实现父子传参;

vue组件调用iframe页面方法和参数

下面是在 vue组件中(父组件) 一个通过点击按钮触发的方法:

 sentToIframe() {
      let childFrameObj = document.getElementById("unityiframe");
      console.log("childFrameObj", childFrameObj);
      // childFrameObj.contentWindow.getMessageFromParent(this.tData); //第一种向子iFrame传参方式,调用iframe的methods达到传参的目的
      this.$refs.unity.contentWindow.getMessageFromParent(this.tData); // 这样也是可以调用子iframe的方法
      // childFrameObj.contentWindow.frameData = "这是vue组件给你的参数!" // 传参成功
      this.$refs.unity.contentWindow.frameData =
        "这是vue组件给你的第二个参数!"; //传参成功
      console.log("发送完成");
      //此外,还可以通过DOM操作,操作子iframe的DOM
      var t = document
        .getElementById("unityiframe")
        .contentWindow.document.getElementById("dd");
      console.log(t);
      //
      console.log("frameData?", unityiframe.window.frameData); //利用id可以调用到iframe里的变量
      // console.log("frameData?",this.$refs.unity.window.frameData) //利用ref调用不到iframe里的变量
    },

子组件 iframe页面 中有一个被调用的方法及变量:

  var frameData = "别喊我!" //此变量用于测试 vue组件是否能调用此变量
  function getMessageFromParent(value){
    // 接受从vue组件中传过来的参数
    console.log(`我接收到parent传过来的参数了:${value}`)
  }

点击按钮的结果是:

iframe页面向vue组件传参

vue组件中有一个供iframe页面调用的方法:

    getFromIframe(value) {
      console.log(`我是iframe传过来的参数:${value}`);
      console.log("我被iframe调用了!");
      console.log(this.vueData);
      console.log(`改变前是:你是否能够改变我;改变后是:${this.isChangeMe}`);
    }

iframe调用vue组件方法的代码:

  function Obj(res){
  // Obj通过按钮点击触发
    console.log(parent)
        // 调用vue组件方法
      parent.getFromIframe("我叫iframe")
      // 向vue组件发送参数 && 改变vue组件的参数
      parent.isChangeMe = "你已经被我iframe改变了"
  }

但是 !!!!!!!!!!!!!!!

只这么做是不够的,会报错,如下:

个人猜想: 问题的原因是 iframe的parent并不是vue实例!

目前只找到了一个办法来解决这个问题:

就是在created钩子里加上这两句,

  created() {
    window.getFromIframe = this.getFromIframe; //把vue实例中的方法引用给window对象
  },

在调用的vue实例的方法中 加上对vue内变量的改变

    getFromIframe(value) {
      console.log(`我是iframe传过来的参数:${value}`);
      console.log("我被iframe调用了!");
      console.log(this.vueData);
      this.isChangeMe = window.isChangeMe;// 把window变量 赋值给 vue 实例变量;使得在iframe中能够改变vue实例中变量
      console.log(`改变前是:你是否能够改变我;改变后是:${this.isChangeMe}`);
    }

最终的运行结果是:

bingo!!!!! 问题暂时得到了解决。

小结一下:vue组件iframe 的嵌入麻烦多多,且目前还没还没找到正统的方法;此外,还有很多坑我还没踩到,如果后续这方面有什么问题 以及 其他的解决方案,我会继续更新到这上面来的!

内嵌iframe页面并进行传值

需求是把两个单独的系统在一个总的系统作为菜单进行免密登录,由于时间还有跨域和不同的token等问题,就使用了内嵌iframe,因为是不同的域名进入子系统也要本地存储一下(获取的user信息以及token传入到iframe子系统)

<template>
  <div class="hello">
    <div>
      <iframe src="http://xxxxxxxxxxxxxx" frameborder="0"  id="myIframe" ref="myIframe"></iframe>
    </div>
  </div>
</template>
export default {
  mounted() {
    this.iframeWin = this.$refs.myIframe.contentWindow;
    //最开始做的是点击事件是没有问题的  后面需要自动传值就不行  也试了模拟点击还是不行
    //原因是iframe还没加载完  所以使用onload
    document.getElementById("myIframe").onload=function(){
      this.fatherpost()
    };
  }
  methods:{
    fatherpost(e){//iframe传值
         this.iframeWin.postMessage({
             params:{
               data:data//传的数据
             }
         },'http://xxxxxxxxxxxxxx')
    },
  }
}
//iframe接收
export default {
  mounted() {
     window.addEventListener('message',function(e){
       console.log(e.data)
     },false)
  }
}
//子传父的话   挂载和接收的方式都是差不多
window.parent.postMessage(message, targetOrigin, [transfer])

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue Class Component类组件用法

    Vue Class Component类组件用法

    这篇文章主要介绍了Vue Class Component类组件用法,组件 (Component) 是 Vue.js 最强大的功能之一,它是html、css、js等的一个聚合体,封装性和隔离性非常强
    2022-12-12
  • vue3如何使用vant-picker封装省市二级联动

    vue3如何使用vant-picker封装省市二级联动

    这篇文章主要介绍了vue3如何使用vant-picker封装省市二级联动,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 浅谈VUE uni-app 自定义组件

    浅谈VUE uni-app 自定义组件

    这篇文章主要介绍了uni-app 的自定义组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • axios简单实现小程序延时loading指示

    axios简单实现小程序延时loading指示

    这篇文章主要介绍了axios简单实现小程序延时loading指示,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • vue写一个全局弹窗组件通过js调用的方法

    vue写一个全局弹窗组件通过js调用的方法

    弹窗效果是在Web开发中经常用到的一种交互效果,它可以在用户点击某个按钮或者触发某个事件时显示一个悬浮框,提供用户与页面进行交互的机会,这篇文章主要给大家介绍了关于vue写一个全局弹窗组件通过js调用的方法,需要的朋友可以参考下
    2024-06-06
  • Vue使用Vuex一步步封装并使用store全过程

    Vue使用Vuex一步步封装并使用store全过程

    这篇文章主要介绍了Vue使用Vuex一步步封装并使用store全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue下使用fullcalendar案例讲解

    vue下使用fullcalendar案例讲解

    这篇文章主要介绍了vue下使用fullcalendar及简单案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Vue子组件内的props对象参数配置方法

    Vue子组件内的props对象参数配置方法

    这篇文章主要介绍了 Vue 子组件内的  props 对象里的 default 参数是如何定义Array、 Object 、或 Function 默认值的正确写法说明,感兴趣的朋友跟随小编一起看看吧
    2022-08-08
  • Vue2的路由和异步请求方式

    Vue2的路由和异步请求方式

    这篇文章主要介绍了Vue2的路由和异步请求方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • vue如何解决el-select下拉框显示ID不显示label问题

    vue如何解决el-select下拉框显示ID不显示label问题

    这篇文章主要介绍了vue如何解决el-select下拉框显示ID不显示label问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论