vue内嵌iframe并跨域通信

7 篇文章 0 订阅

[转载博客地址 https://blog.csdn.net/weixin_44242600/article/details/89248049]
1、Vue引入iframe: 直接通过添加iframe标签,src属性绑定data中的src。
            <template>
              <div class="act-form">
                <iframe :src="src"></iframe>
              </div>
            </template>
            <script>
            export default {
              data () {
                return {
                  src: 'src地址'
                }
              }
            }
            </script>
2、vue获取iframe对象以及iframe内的window对象: 通过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)
            // iframe的window对象
            console.log(this.$refs.iframe.contentWindow)
          }
        }
        </script>
3、vue向iframe内传送信息: 通过postMessage
        <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', event => {
                 // 根据上面制定的结构来解析iframe内部发回来的数据
                const data = event.data
                switch (data.cmd) {
                  case 'returnFormJson':
                    // 业务逻辑
                    break
                  case 'returnHeight':
                    // 业务逻辑
                    break
                }
            });
            this.iframeWin = this.$refs.iframe.contentWindow
          }
        }
        </script>
4、iframe内向外部vue发送信息:
        <!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>

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值