zoukankan      html  css  js  c++  java
  • vue内嵌iframe跨域通信

    最近的vue3项目,使用了百度地图,发现用iframe导.html文件到vue里做开发更加便捷,于是借鉴网上的相关资料总结如下。

    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>

    至此内部的收发信息已经解决了,外部的收发也已经解决了,快去解决你的问题吧。

     
  • 相关阅读:
    HDU1875——畅通工程再续(最小生成树:Kruskal算法)
    CodeForces114E——Double Happiness(素数二次筛选)
    POJ3083——Children of the Candy Corn(DFS+BFS)
    POJ3687——Labeling Balls(反向建图+拓扑排序)
    SDUT2157——Greatest Number(STL二分查找)
    UVA548——Tree(中后序建树+DFS)
    HDU1312——Red and Black(DFS)
    生活碎碎念
    SQL基础四(例子)
    Linux系统中的一些重要的目录
  • 原文地址:https://www.cnblogs.com/apex-wzw/p/12586164.html
Copyright © 2011-2022 走看看