vue内嵌iframe跨域通信的实例代码

发布时间:2022-11-09 10:03

这篇文章主要介绍了vue内嵌iframe跨域通信,主要介绍了Vue组件中如何引入iframe,vue如何获取iframe对象以及iframe内的window对象,结合实例代码给大家介绍的非常详细需要的朋友可以参考下!

vue内嵌iframe跨域通信

1、Vue组件中如何引入iframe?

<template>
  <div class="act-form">
<iframe :src="src"></iframe>
  </div>
</template>
 
<script>
 
export default {
  data () {
return {
  src: '你的src'
}
  }
}
</script>

如上,直接通过添加iframe标签,src属性绑定data中的src,第一步引入就完成了

2、vue如何获取iframe对象以及iframe内的window对象?

在vue中,dom操作比不上jquery的$('#id')来的方便,但是也有办法,就是通过ref

<template>
  <div class="act-form">
<iframe :src="src" ref="iframe"></iframe>
  </div>
</template>
 
<script>
 
export default {
  data () {
return {
  src: '你的src'
}
  },
  mounted () {
// 这里就拿到了iframe的对象
console.log(this.$refs.iframe)
  }
}
</script>

然后就是获取iframe的window对象,因为只有拿到这个对象才能向iframe中传东西

<template>
  <div class="act-form">
<iframe :src="src" ref="iframe"></iframe>
  </div>
</template>
 
<script>
 
export default {
  data () {
return {
  src: '你的src'
}
  },
  mounted () {
// 这里就拿到了iframe的对象
console.log(this.$refs.iframe)
// 这里就拿到了iframe的window对象
console.log(this.$refs.iframe.contentWindow)
  }
}
</script>

3、vue如何向iframe内传送信息?

通过postMessage,具体关于postMessage是什么,自己去google, 我的理解postMessage是有点类似于UDP协议,就像短信,是异步的,你发信息过去,但是没有返回值的,只能内部处理完成以后再通过postMessage向外部发送一个消息,外部监听message 为了让postMessage像TCP,为了体验像同步的和实现多通信互不干扰,特别制定的message结构如下

{
  cmd: '命令',
  params: {
'键1': '值1',
'键2': '值2'
  }
}

通过cmd来区别这条message的目的

具体代码如下

<template>
  <div class="act-form">
<iframe :src="src" ref="iframe"></iframe>
<div @click="sendMessage">向iframe发送信息</div>
  </div>
</template>
 
<script>
 
export default {
  data () {
return {
  src: '你的src',
  iframeWin: {}
}
  },
  methods: {
sendMessage () {
  // 外部vue向iframe内部传数据
  this.iframeWin.postMessage({
cmd: 'getFormJson',
params: {}
  }, '*')
},
  },
  mounted () {
// 在外部vue的window上添加postMessage的监听,并且绑定处理函数handleMessage
window.addEventListener('message', this.handleMessage)
this.iframeWin = this.$refs.iframe.contentWindow
  },
  handleMessage (event) {
// 根据上面制定的结构来解析iframe内部发回来的数据
const data = event.data
switch (data.cmd) {
  case 'returnFormJson':
// 业务逻辑
break
  case 'returnHeight':
// 业务逻辑
break
}
  }
}
</script>

4、iframe内如何向外部vue发送信息?

现在通过点击“向iframe发送信息”这个按钮,从外部vue中已经向iframe中发送了一条信息

{
  cmd: 'getFormJson',
  params: {}
}

那么iframe内部如何处理这个信息呢?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>iframe Window</title>
<style>
body {
background-color: #D53C2F;
color: white;
}
</style>
</head>
<body>
 
<h1>Hello there, i'm an iframe</h1>
 
<script>
// 向父vue页面发送信息
window.parent.postMessage({
cmd: 'returnHeight',
params: {
  success: true,
  data: document.body.scrollHeight + 'px'
}
}, '*');
 
// 接受父页面发来的信息
window.addEventListener("message", function(event){
  var data = event.data;
  switch (data.cmd) {
case 'getFormJson':
// 处理业务逻辑
break;
}
});
</script>
</body>
</html>

文档下载:vue内嵌iframe跨域通信的实例代码.doc文档

THE END
喜欢就支持一下吧