饥人谷技术博客

vue+webpack+postMessage+iframe双标

2019-10-21  本文已影响0人  凛冬已至_123

  1. 了解一下postMessage:MDN-postMessage
    主要是下面2个API
window.onmessage = e =>{
  console.log(e.data) //接收到的信息在e.data里
}
window.postMessage({event:'changePoroject',data:{name:'小强'}},location.origin)

注意点说明:
1.window-指的是需要传递消息页面的引用
2.传递的第二个参数官方说明是-可以接收消息的页面(一般指url)

  1. iframe
<iframe src='baidu.com' ref='iframe1' id='iframe><iframe>

获取iframewindow对象

this.$refs.iframe1.contentWindow
  1. 下面来聊一下两个Tab页通信的实现方式和注意点
{event:'changePoroject',data:{name:'小强'}}

event为我要传递的事件,data我要传递的参数,这样就能像监听事件一样来交互

下面是两个页面交互的部分代码

//打开分屏页面
this.childPage = window.open(this.secondUrl,‘child’)
let loop = setInterval(()=>{
  if(this.childPage.closed){
   clearInterval(loop) 
    .... //监听子页面关闭,父页面做出相应的改动
  }  
},1000)
//主页面
mounted(){
 window.onmessage = e => {
  if(typeof e.data === 'string'){
   console.log('传递无效信息')
 }else {
  if(e.data.event){
    console.log('正常发送数据')
    swith(e.data.event){
       case 'getData':
       //子页面初始化获取数据
     } 
      ....//其他事件
   }  
  }
 }
}
//向子页面发送数据
this.childPage.postMessage({event:'initData',data:this.transforData},location.origin)
//子页面初始化
mounted(){
 window.onmessage = e => {
  if(typeof e.data === 'string'){
   console.log('传递无效信息')
 }else {
  if(e.data.event){
    console.log('正常发送数据')
    swith(e.data.event){
       case 'initData':
        this.initial(e.data.data)
       //子页面响应父页面数据变化
     } 
      ....//其他事件
   }  
  }
 }
 window.opener.postMessage({event:'getData'})//初始化向父页面索取数据
 window.opener.onunload = () => {
    window.close()//监听到父页面关闭后,子页面自动关闭 
 }
}

下面是每个页面的iframe交互-两个页面间的iframe交互只是需要本页面监听iframe事件后,向另一个页面发送数据

<iframe :src='/model/ppt.htm' ref='iframe' id='iframe><iframe>
//向iframe发送数据

this.$refs.iframe.contentWindow.postMessage({event:'onSelectDate',data:this.date},this.$refs.iframe1.src)

//监听iframe的事件也放在mounted的onmessage里

本文正在参加“写编程博客瓜分千元现金”活动,关注公众号“饥人谷”回复“编程博客”参与活动。

上一篇 下一篇

猜你喜欢

热点阅读