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

2023-11-04

什么是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>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 如何在react-native中获取Text组件的onPress值

    我是一名新的 React Native 开发人员 我想使用 onPress 获取 Text 组件的值并将其传递给函数
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js)Vue Js

    我从 GitHub 下载了一个我和我的朋友正在开发的项目 但是当我尝试运行时 npm run serve 我收到这个错误 src main js 中的错误 Module build failed from node modules babe
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • 简单的 Vue.js 计算属性说明

    我对 Vue js 并不陌生 但我会再次浏览文档 试图找出我第一次错过的任何内容 我在以下地方看到了这个声明使用计算属性的基本示例部分 https v2 vuejs org v2 guide computed html Basic Exam
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐

  • Win7连接网络打印机步骤

    Win7客户端添加网络打印机 1 进入打印机官网 先下载对应型号的打印机驱动 2 找到控制面板 gt 点击硬件和声音 gt 设备和打印机 3 点击添加打印机按钮 选择添加网络 无线或Bluetooth打印机 4 搜索可用的打印机 5 找到对
  • 2023中国民营100强投资趋势

    导读 根据民企注册地了解到 民企100强企业几乎一半分布在华东地区 其次分布在华南 华北和华中地区 从省份来看 广东 浙江是主要分布的省份 企业数量分别是19家 江苏省有14家 北京市有8家 上海市有7家 河北省 山东省各6家 关注公众号
  • taro生命周期详解

    taro生命周期详解 taro介绍 生命周期 react的钩子函数 为兼容小程序的钩子函数 个别生命周期详解以及注意 1 render 函数 2 constructor 构造函数 3 在各个生命周期钩子函数中修改state的属性或者参数 4
  • 华为OD机试真题 (python)之支持优先级的队列

    题目描述 支持优先级的队列 实现一个支持优先级的队列 高优先级先出队列 同优先级时先进先出如果两个输入数据和优先级都相同 则后一个数据不入队列被丢弃 队列存储的数据内容是一个整数 输入描述 组待存入队列的数据 包含内容和优先级 输出描述 队
  • java corn 定时任务调度,每分钟执行一次,每半个小时执行一次

    java corn 表达式 每分钟执行一次 Scheduled cron 0 1 每半个小时执行一次 Scheduled cron 0 0 30 springboot 类 EnableScheduling Configuration Slf
  • 自定义截图方法,如何在RobotFrameWork的日志中显示

    用RobotFrameWork做UI自动化时 一般初学者都会选择第三方扩展库SeleniumLibrary进行UI自动化测试 随然已经封装许多浏览器操作方法 但在实际应用 某些方法还是不能满足我们的需求 于是乎 我们就舍弃SeleniumL
  • 以服务方式启动安防监控系统EasyNVR程序出现播放异常,是什么原因?

    EasyNVR安防视频监控平台的特点是基于RTSP Onvif协议 将前端设备统一接入 在平台进行转码 直播 处理及分发 在智慧安防视频监控场景中 EasyNVR可实现实时监控 云端录像 检索与回放 云存储 告警 级联等视频能力 极大满足行
  • 1.2 Ubauntu 使用

    一 完成VMware Tools安装 双击 VMwareTool 打开 Ubuntu 终端快捷键 Alt Control T 切换汉语的快捷键是Alt 空格 ls 打印出当前所在目录中所有文件和文件夹 cd 桌面 进入桌面文件夹 sudo
  • java生成有理数_第四届蓝桥杯Java B——有理数类

    有理数就是可以表示为两个整数的比值的数字 一般情况下 我们用近似的小数表示 但有些时候 不允许出现误差 必须用两个整数来表示一个有理数 这时 我们可以建立一个 有理数类 下面的 class Rational private long ra
  • Python-使用空值进行赋值-None

    0 摘要 在Python中 尤其是数组当中 对于一些异常值往往需要进行特殊处理 为了防止异常值与正常数据混淆 影响最终计算结果 常用的方法是将异常值置零或者置空 置零的方法较为简单 本文主要介绍如果对python中的数据进行置空 1 赋值为
  • 【TreeMap】-根据 key 或 value 排序

    1 根据 key 排序 引言 TreeMap 中key 可以自动对 String 类型或8大基本类型的包装类型进行排序 但是 TreeMap 无法直接对自定义类型进行排序 当我们想对对 TreeMap 中 key 中的自定义类型排序时 必须
  • 已解决:极品飞车9 Most Wanted无故跳出回桌面问题

    情况 1 可以进入游戏 2 新建用户 并可以进行第一项挑战赛 3 进行到某项赛事 生涯或挑战 时 再无法进去了 Loading 之后立即跳回桌面 程序结束 如果情况相同 那你可有救了 几经周折 找到这个地址 NEED For SPEED M
  • 使用io流一行一行读取txt文件

    io流分为字符流和字节流 字节流是万能流 可以处理任何数据 包含图片 视频 文字等 传输单位为字节 字符流只能读取文本数据 传输单位为字符 一 字节 的定义 字节 Byte 是一种计量单位 表示数据量多少 它是计算机信息技术用于计量存储容量
  • Linux系统与Windows系统之间的文件上传与下载

    Linux系统与Windows系统之间的文件上传与下载 在日常开发过程中 常常会遇到需要在Linux与Windows系统之间的文件的传输 有一些常用的方法与命令 在此记录 1 文件上传 从Windows系统上传文件到Linux系统中 有以下
  • 使用sklearn预处理数据之标准化、归一化、正则化

    文章目录 前言 二值化 最小最大化 属性缩放 正则化 标准化 前言 sklearn preprocessing是sklearn库中非常重要的一个module 集成了很多预处理数据的方法 今天对常用的几个加以解释说明 二值化 sklearn
  • 十年沉淀,回头发觉我当年面试 “Android” 竟然这么难!

    本文档收录了春招及秋招 含提前批 中能回忆起来的面试题 部分公司我既参加了春招也参加了秋招 将题目整合在了一起 所列题目不全 仅仅列出了我能回忆起来的部分题目 所列解答仅供参考 一 腾讯 春招 后台开发 二 阿里巴巴 秋招 阿里云 边缘计算
  • 在Windows下查看并设置CMD命令行字符编码格式,解决中文乱码问题。

    今天在复习java的时候 用cmd运行java文件时出现了中文乱码问题 其实这个问题我在大一下学期第一次上java课时就遇到了 可惜那时老师使用其他IDE来教学 我也懒得去解决这个问题 这个问题就不了了之了 今天又遇到这个问题 百度了相关资
  • Spring Boot自动配置

    原理是什么 原理就是通过loadFactoryNames读取实现配置好的spring factories 实例化其中的类 对于不同的实现有不同的处理逻辑 比如SpringBoot启动是需要的ApplicationContextInitial
  • postman 提交json中文乱码

    在headers中加 Content Type application json charset UTF 8 完美解决中文乱码问题
  • vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

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