Vue 中使用 iframe

Vue 中使用 iframe

业余生活要有意义,不要越轨。——华盛顿

  • Vue 组件如何引入 iframe

  • Vue 如何获取 iframe 对象以及 iframe 内的 window 对象

  • Vue 如何向 ifrmae 内传送信息

  • iframe 内如何向外部 vue 发送消息

(1)Vue 组件中如何引入 iframe

<template>
  <div style="overflow:hidden;" ref="wrapdiv">
    <button @click="sendmessage">发送数据</button>
    <div>子页面给父页面的数据:{{sondata}}</div>
    <iframe
      ref="iframe"
      id="iframe"
      scrolling="no"
      width="100%"
      :height="height"
      frameborder="0"
      :src="url"
    />
  </div>
</template>

<!-- 然后data中绑定src要引入的目录,那么第一步就完成了 -->

(2)Vue 如何获取 iframe 对象以及 iframe 内的 window 对象

  • 通过 ref
export default {
  data() {
    return {
      message: '首页',
      url: 'http://www.textiframe.com/',
      iframeWin: {},
      sondata: ' ',
      height: ''
    }
  },
  mounted() {
    let _this = this
    //获取到了iframe的对象
    console.log(this.$refs.iframe)
    //获取到了iframe的window对象
    //赋值
    this.iframeWin = this.$refs.iframe.contentWindow
    this.height = document.documentElement.clientHeight
  }
}

(3)Vue 如何向 ifrmae 内传送信息

同过 postMessage 来传递,里面的数据可以自己定义,例如

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

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

具体代码

<template>
  <div style="overflow:hidden;" ref="wrapdiv">
    <button @click="sendmessage">发送数据</button>
    <div>子页面给父页面的数据:{{sondata}}</div>
    <iframe
      ref="iframe"
      id="iframe"
      scrolling="no"
      width="100%"
      :height="height"
      frameborder="0"
      :src="url"
    />
  </div>
</template>

<script>
  export default {
    data() {
      return {
        message: '首页',
        url: 'http://www.textiframe.com/',
        iframeWin: {},
        sondata: ' ',
        height: ''
      }
    },
    mounted() {
      let _this = this
      //获取到了iframe的对象
      console.log(this.$refs.iframe)
      //获取到了iframe的window对象
      //赋值
      this.iframeWin = this.$refs.iframe.contentWindow
      this.height = document.documentElement.clientHeight //设置高度
      //监听加载
      // 处理兼容行问题
      //在外部Vue的window上添加postMessage的监听,并且绑定处理函数handleMessage
      window.addEventListener('message', _this.handleMessage) //监听子页面返回来的信息
    },
    methods: {
      sendmessage() {
        console.log('执行了')
        //外部Vue想iframe内部传数据
        this.iframeWin.postMessage(
          {
            cmd: 'createJson', //名称 告诉子页面对应的接口名称
            params: {
              success: true,
              result: {
                name: '我是子页面'
              }
            }
          },
          '*'
        )
      },
      handleMessage(event) {
        console.log('监听了')
        //依据上面的结构来解析iframe内部发回的数据
        const data = event.data
        let _this = this
        switch (data.cmd) {
          case 'returnFormJson':
            //业务逻辑
            break
          case 'returnHeight':
            //业务逻辑
            console.log('收到了子页面传递过来的数据,子页面数据格式如下')
            console.log(data.params)
            _this.sondata = data.params.result.message
            break
        }
      }
    }
  }
</script>

<style lang="less" scoped></style>

(4)子页面 iframe 内部如何接收信息并发送信息

  • 必须在元素上绑定 onclick

  • window.addEventListener(‘message’)来接收

  • window.parent.postMessage 来发送数据

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>测试Index</title>
    <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
  </head>
  <body>
    为了测试是否能接受到数据
    <button id="button1" onclick="callParent()">
      点击跳转
    </button>
    <div>父页面给子页面的数据:<span id="result_name"></span></div>
    <div style="width:100%;height:1000px;background:blue"></div>
  </body>
  <style>
    html {
      width: 100%;
      height: 100%;
    }
    * {
      padding: 0px;
      margin: 0px;
    }
    body {
      width: 100%;
      height: 100%;
      background: red;
    }
  </style>
  <script>
    //接受父页面发来的信息
    window.addEventListener('message', function(event) {
      let data = event.data
      switch (data.cmd) {
        case 'createJson':
          console.log('收到父页面发送过来的数据了,数据如下')
          console.log(data.params)
          let value = data.params.result.name //名称
          console.log(value)
          $('#result_name').html(value)
      }
    })

    function callParent() {
      window.parent.postMessage(
        {
          cmd: 'returnHeight',
          params: {
            success: true,
            result: {
              message: '我是子页面给父页面的数据哈哈'
            }
          }
        },
        '*'
      )
    }
  </script>
</html>

总结

  • 父页面接收数据
window.addEventListener('message', function(event) {})
  • 父页面发送数据,postMessage
this.iframeWin = this.$refs.iframe.contentWindow
this.iframeWin.postMessage(
  {
    cmd: 'createJson', //名称 告诉子页面对应的接口名称
    params: {
      success: true,
      result: {
        name: '我是子页面'
      }
    }
  },
  '*'
)
  • 子页面接收数据 window.addEventListener(‘message’, function(event) {})
//接受父页面发来的信息
window.addEventListener('message', function(event) {
  let data = event.data
  switch (data.cmd) {
    case 'createJson':
      console.log('收到父页面发送过来的数据了,数据如下')
      console.log(data.params)
      let value = data.params.result.name //名称
      console.log(value)
      $('#result_name').html(value)
  }
})
  • 子页面发送数据 window.parent.postMessage()
<button id="button1" onclick="callParent()">
  点击跳转
</button>
<script>
  function callParent() {
    window.parent.postMessage(
      {
        cmd: 'returnHeight',
        params: {
          success: true,
          result: {
            message: '我是子页面给父页面的数据哈哈'
          }
        }
      },
      '*'
    )
  }
</script>

文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录