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])
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
原文出处:https://blog.csdn.net/weixin_42108617/article/details/103924
相关文章
- 这篇文章主要介绍了Vue组件跨层级获取组件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-28
- 今天我们来给大家介绍下在Vue开发中我们经常会碰到的一种需求场景,本文主要介绍了Vue动态查询规则生成组件,需要的朋友们下面随着小编来一起学习学习吧...2021-05-27
- 这篇文章主要介绍了js组件SlotMachine实现图片切换效果制作抽奖系统的相关资料,需要的朋友可以参考下...2016-04-19
- 这篇文章主要介绍了vue中如何使用element的日历组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-30
- 这篇文章主要介绍了Vue多选列表组件深入详解,这个是vue的基本组件,有需要的同学可以研究下...2021-03-03
- 这篇文章主要介绍了Vue 过渡(动画)transition组件案例详解,非常不错,具有参考借鉴价值,需要的朋友参考下...2017-01-26
- 在网页中,经常见到进度条效果,那么这些个性的进度条组件效果是怎么实现的呢,下面脚本之家小编给大家分享Bootstrap进度条组件知识详解,感兴趣的朋友要求学习吧...2016-05-04
- 这篇文章主要为大家详细介绍了vue递归实现自定义tree组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-20
- 这篇文章主要介绍了Vue父子组件传值的一些坑,帮助大家更好的理解和使用vue父子组件,感兴趣的朋友可以了解下...2020-09-16
- 这篇文章主要介绍了vue 中的动态传参和query传参操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-09
- 这篇文章主要为大家详细介绍了Bootstarp创建可折叠组件的对应方法,以实例为大家分享了Bootstrap折叠组件,感兴趣的小伙伴们可以参考一下...2016-02-26
使用Angular CDK实现一个Service弹出Toast组件功能
本文主要写用cdk实现一个简单的Toast组件,使用的是cdk中的overlay模块,需要手动安装环境,具体安装方法及相关实现代码跟随小编一起看看吧...2021-07-28- Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架,主要基于 HTML、CSS、JAVASCRIPT 的。接下来通过本文给大家介绍BootStrap 附加导航组件的知识,感兴趣的朋友一起学习吧...2016-07-29
- 这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
- 这篇文章主要为大家详细介绍了C#控制台程序使用Log4net日志组件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 高阶组件就是接受一个组件作为参数并返回一个新组件(功能增强的组件)的函数。这里需要注意高阶组件是一个函数,并不是组件,这一点一定要注意,本文给大家分享React 高阶组件HOC使用小结,一起看看吧...2021-06-13
- 这篇文章主要给大家介绍了关于vue打开新窗口并实现传参的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-04
- 这篇文章主要介绍了vue实现从外部修改组件内部的变量的值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-31
解析element-ui中upload组件传递文件及其他参数的问题
这篇文章主要介绍了element-ui中upload组件如何传递文件及其他参数,分析一下我使用element-ui遇到的问题以及解决方法,需要的朋友可以参考下...2021-11-10- 本篇文章主要介绍了AngularJS的ng-click传参的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-06-24