vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

news2024/11/27 4:18:40

什么是postMessage

postMessagehtml5引入的API,它允许来自不同源的脚本采用异步方式进行有效的通信,可以实现跨文本文档,多窗口,跨域消息传递.多用于窗口间数据通信,这也使它成为跨域通信的一种有效的解决方案.

vue父页面(嵌入iframe的页面)

在vue中要使用iframe上的postMessage,首先应该获取到iframe实例,有以下几种方式

<iframe :src=“flowSrc” name=“myiframe” ref=“myiframe” id=“myiframe” style=“min-height:800px; width:100%;margin:0;border:0;”> </iframe>

   let iframeWin1 = window.frames["myiframe"];
   let iframeWin2 = this.$refs.myiframe.contentWindow;
   let iframeWin3 = document.getElementById("myiframe").contentWindow;

重点: 将iframe的window窗体存储至data对象中会出现跨域报错
重点: 将iframe的window窗体存储至data对象中会出现跨域报错
重点: 将iframe的window窗体存储至data对象中会出现跨域报错
重要的事情说三遍!!!!
也不要用这个方式刷新iframe
let iframeWin2 = this.$refs.myiframe.contentWindow;
iframeWin2.location.reload()
这样操作也会导致跨域
在这里插入图片描述
在这里踩坑了,明明postMessage是支持跨域通信的,但是我在用的时候还是报跨域了,原因就是上述所说的。

父页面传递数据给子页面(vue->iframe)

<template>
  <div class="home">
    <div class="search-container">
      <el-input placeholder="请输入内容" v-model="inputValue" clearable class="mind-input">
      </el-input>
      <div class="search-btn">

        <el-button type="primary" @click="search">搜索</el-button>
      </div>
    </div>
    <div class="ifarm-container">
      <iframe :src="flowSrc" name="myiframe" ref="myiframe" id="myiframe" style="min-height:800px; width:100%;margin:0;border:0;"> </iframe>
    </div>

  </div>
</template>

<script>


export default {
  name: 'HomeView',
  data() {
    return {
      inputValue: '',
      flowSrc: null,
    }
  },
  created() {
    this.flowSrc = 'http://localhost/login';  //直接给flowSrc赋值链接
  },
  mounted() {
    // this.passOnIframeData()
  },
  methods: {
    search() {
      this.sendMessage(this.inputValue)
    },
    // 给iframe传递数据
    sendMessage(msg){
        let iframeWin = window.frames["myiframe"];
        //将iframe的window窗体存储至data对象中会出现跨域报错
        iframeWin.postMessage(msg,"*");
    },
   
  }
}
</script>
<style lang="less" scoped>
.home {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;

  .search-container {
    display: flex;
    align-items: center;
    justify-content: space-between;

    .mind-input {
      width: 500px;
    }

    .search-btn {
      flex: 1;
      margin-left: 20px;
    }
  }

  .ifarm-container {
    width: 98%;
    min-height: 800px;
    margin-top: 20px;
    border: 1px solid rgb(175, 171, 171);
  }
}
</style>


子页面接收父页面数据(iframe接收vue传递过来的数据)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>iframe跨域子页面</title>
</head>
<body>
    <div id="mydiv">
        vue、iframe、postMessage跨域子页面
    </div>
</body>
<script>
    //监听message事件,采用冒泡传递方式
    window.addEventListener("message",receiveMessage,false);
    function receiveMessage(event){
        let data = event.data
        console.log('我是父页面传递过来的', data)
        document.getElementById("mydiv").innerHTML = data;
    }
</script>
</html>

子页面向父页面传递数据
在子页面中使用parent.postMessage或者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>iframe跨域子页面</title>
</head>
<body>
    <div id="mydiv">
       <button onClick="sendMessage">回传数据</button>
    </div>
</body>
<script>
    function sendMessage(data){
        let data = event.data
        console.log('我是父页面传递过来的', data)
        window.parent.postMessage("回传数据----哈哈哈哈", "*")
    }
</script>
</html>

父页面接收子页面的数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>跨域父页面</title>
</head>
<body>
    <div id="app">
        <iframe name="myiframe" ref="myiframe" id="myiframe" src="http://www.a.com/index.html"></iframe>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                msg: '跨域父页面',
                iframeWin: null, 
            },
            methods: {
                //处理接收的消息
                receiveMessage(event){
                    let data = event.data;
                    console.log('子组件传递过来的数据', data)
                }
            },
            created(){
                window.addEventListener("message",this.receiveMessage,false);
            },
            //vue实例销毁时销毁一些监听事件
            destroyed(){
                window.removeEventListener("message",this.receiveMessage);

            }
        })
    </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文心一言】文心一言最近这么火,它到底是什么

前言 文心一言&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;是百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。文心一…

网工容易混淆的三种网线类型:直连线、交叉线和反转线

网线是计算机网络中最常见的传输介质之一&#xff0c;它能够将数据快速而可靠地传输到各个网络设备中。在实际的网络应用中&#xff0c;我们常常需要使用到不同类型的网线&#xff0c;包括直连线、交叉线和反转线。本文将介绍这三种网线的定义、应用场景和注意事项。 直连线 …

Tailwind CSS入门(二)——基本介绍和特性

上一篇文章简要的介绍了原子类CSS&#xff0c;以及个人对语义化、原子化的一些经验和理解。从这篇文章开始&#xff0c;正式开始分享Tailwind CSS的特性、使用和技巧。 Tailwind CSS是一个为快速开发而精心设计的原子类CSS框架&#xff0c;在此我们将搭建一个Vite项目来配合讲…

力扣---LeetCode21. 合并两个有序链表(链表经典题)

文章目录 前言21. 合并两个有序链表链接&#xff1a;方法一&#xff1a;取小尾插1.1代码&#xff1a;1.2 流程图&#xff1a;1.3 注意&#xff1a; 方法二&#xff1a;带哨兵位2.1代码&#xff1a;2.2流程图&#xff1a; 总结 前言 焦虑不会消除明天的悲伤 只会让你今天的力量…

springboot概述

脚手架: 因为创建的为web项目&#xff0c;有这两个文件夹 在idea中也可以使用脚手架 会直接或间接包含依赖 启动类 单一模块: 启动类要放在根包下边&#xff0c;其他的业务放在根包或者根包的子包 多个模块: restController包含controller且每个方法都包含responseBody注解&…

这可能是你看过最详细的Java集合篇【二】—— LinkedList

文章目录 LinkedList继承关系数据结构变量构造方法添加元素相关方法查找元素相关方法删除元素相关方法清空方法遍历方法其它方法常见面试题 LinkedList LinkedList底层数据结构是双向链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访…

10年+工作经验总结:测试工程师职业成长路线图

一、功能测试工程师必备技能 1. 功能测试理论 主要包括&#xff1a; 软件测试流程 需求理解 测试用例设计&#xff08;编写测试用例的策略&#xff09; 执行测试用例 提交bug(bug是由什么组成&#xff0c;bug处理流程&#xff0c;bug优先级&#xff0c;bug的定位等) 回归…

基于Vue的web设计打印方案

企业信息化例如ERP,OA等等都会存在纸质单据打印的情况&#xff0c;需要在企业内部流转&#xff0c;打印设计也有很多方案&#xff0c;例如fastReport,bartender等等&#xff0c;今天要说的是 vue-plugin-hiprint&#xff0c;开源的web打印插件&#xff0c;基于此插件可以集成模…

SpringBoot 中如何正确的实现模块日志入库?

目录 1.简述2.踩坑记录3.LoginController4.LoginService5.LoginLogService5.1 Async实现异步5.2 自定义线程池实现异步1&#xff09;自定义线程池2&#xff09;复制上下文请求3&#xff09;自定义线程池实现异步 6.补充&#xff1a;LoginService 手动提交事务 背景&#xff1a;…

并发编程之可重入锁ReentrantLock

文章目录 前言ReentrantLock原理ReentrantLock VS Synchronized源码解析ReentrantLock同步机制ReentrantLock可重入机制ReentrantLock可中断机制ReentrantLock超时机制条件变量Condition 写在最后 前言 大家都知道在并发编程中一般会用到多线程技术&#xff0c;多线程技术可以…

2023年主流的选择仍是Feign, http客户端Feign还能再战

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 微服务组件之http客户端Feign 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 …

UE4 架构初识(三)

UE4仿真引擎学习 一、架构基础 1. PlayerController PlayerController&#xff08;玩家控制器&#xff09; 是Pawn和控制它的人类玩家间的接口。PlayerController本质上代表了人类玩家的意愿。当设置PlayerController时&#xff0c;您需要考虑的一个事情就是您想在PlayerCont…

太阳辐射预报模式WRF-SOLAR在农业生态领域中的实践技术应用

太阳能是一种清洁能源&#xff0c;合理有效开发太阳能资源对减少污染、保护环境以及应对气候变化和能源安全具有非常重要的实际意义&#xff0c;为了实现能源和环境的可持续发展&#xff0c;近年来世界各国都高度重视太阳能资源的开发利用&#xff1b;另外太阳辐射的光谱成分、…

Navicat15数据库导表及乱码问题解决

本地环境 Win10 PHPstudy_Pro(小皮) PHP5.6 MySQL5.7 连接MySQL数据库 1.启动Navicat15 2.点击连接按钮,并选择MySQL子项 3.连接对话框 连接名:自己分的清的名字即可 主机:数据的地址 若连接非本地mysql只需将主机localhost换成需要连接数据的ip地址即可&#xff0c;输入数…

Linux下一切皆文件与指令的本质(可执行程序),which指令等

Linux下一切皆文件 在Linux下的话&#xff0c;一切皆文件。主要是看待诸如软硬件设备与磁盘文件的看法&#xff1a;一切皆文件&#xff0c;比如说显示器它也是文件&#xff0c;键盘也是文件&#xff0c;普通文件肯定是文件。首先就是显示器这个东西&#xff0c;它其实就是可以打…

Rancher 部署 Elasticsearch 8.5.1 版本服务

前言 从 es7 升级到 es8 之后&#xff0c;启动容器默认启用了 ssl 安全传输配置&#xff0c;但是在 Rancher 中部署的话&#xff0c;需要挂载 pvc 实现 data、logs 等目录持久化&#xff0c;启用 ssl 需要对证书等进行操作&#xff0c;非常麻烦&#xff0c;非常坑。 本文以启…

深度解析LED显示屏SMD封装

LED器件占LED显示屏成本约40%&#xff5e;70%&#xff0c;LED显示屏成本的大幅下降得益于LED器件的成本降低。5分钟带你了解SMD LED。LED封装质量的好坏对LED显示屏的质量影响较大。封装可靠性的关键包括芯片材料的选择、封装材料的选择及工艺管控。另外&#xff0c;严格的可靠…

SpringBoot - 事件机制使用详解(ApplicationEvent、ApplicationListener)

Spring 事件机制使用观察者模式来传递事件和消息。我们可以使用 ApplicationEvent 类来发布事件&#xff0c;然后使用 ApplicationListener 接口来监听事件。当事件发生时&#xff0c;所有注册的 ApplicationListener 都会得到通知。事件用于在松散耦合的组件之间交换信息。由于…

移动端网页特效

文章目录 一、触屏事件&#xff08;一&#xff09;触屏事件概述&#xff08;二&#xff09; 触摸事件对象&#xff08;TouchEvent&#xff09;&#xff08;三&#xff09; 移动端拖动元素 二、移动端常见特效&#xff08;一&#xff09;案例&#xff1a;移动端轮播图&#xff0…

Windows安装Docker

目录 一.启用Hyper-V和容器特性 1.右键Windows点击应用和功能 2.点击程序和功能​编辑 3.启用或关闭Windows功能​编辑 4.开启 Hyper-V 和容器特性 二.下载安装Docker 1.下载Docker &#xff08;Download Docker Desktop | Docker&#xff09; 2.点击安装 3.把第一个选…