与跨域 iframe 通信示例

news/2025/11/8 13:58:23/文章来源:https://www.cnblogs.com/nanfei/p/19202224

与跨域 iframe 通信示例

window.addEventListener('load', function(){var iframes = document.getElementsByTagName('iframe');for (var i = 0; i < iframes.length; i++) {var iframe = iframes[i];var bridge = new IframeBridge(iframe);iframe.bridge = bridge;}
});class IframeBridge {constructor(iframe, targetOrigin = '*') {this.iframe = iframe;this.targetOrigin = targetOrigin;this.pendingRequests = new Map(); // 存储进行中的请求this.setupMessageListener();}setupMessageListener() {window.addEventListener('message', (event) => {// 安全检查:验证来源[1,3](@ref)if (this.targetOrigin !== '*' && event.origin !== this.targetOrigin) {return;}const message = event.data;// 检查是否为响应消息,并且有对应的请求IDif (message?._type === 'RESPONSE' && message?.requestId) {const pendingRequest = this.pendingRequests.get(message.requestId);if (pendingRequest) {// 从等待列表中移除this.pendingRequests.delete(message.requestId);if (message.success) {// 成功则解析Promise
                        pendingRequest.resolve(message.data);} else {// 失败则拒绝PromisependingRequest.reject(new Error(message.error || 'Request failed'));}}}});}async request(action, data = {}, timeout = 5000) {// 生成唯一请求ID[7](@ref)const requestId = this.generateRequestId();return new Promise((resolve, reject) => {// 设置超时const timeoutId = setTimeout(() => {this.pendingRequests.delete(requestId);reject(new Error('Request timeout'));}, timeout);// 存储resolve和reject以便后续使用this.pendingRequests.set(requestId, { resolve: (responseData) => {clearTimeout(timeoutId);resolve(responseData);}, reject: (error) => {clearTimeout(timeoutId);reject(error);}});// 向iframe发送消息[2,5](@ref)this.iframe.contentWindow.postMessage({_type: 'REQUEST',requestId,action,data}, this.targetOrigin);});}generateRequestId() {return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;}
}// 使用async/await进行通信
async function fetchDataFromIframe() {var iframes = document.getElementsByTagName('iframe');for (var i = 0; i < iframes.length; i++) {var iframe = iframes[i];var bridge = iframe.bridge;if(!bridge)continue;try {console.log('请求用户数据...');// 代码会在此"等待"直到收到响应const userData = await bridge.request('GET_USER_DATA', { userId: 123 });console.log('收到数据:', userData);// 继续执行后续逻辑const settings = await bridge.request('GET_USER_SETTINGS');console.log('用户设置:', settings);} catch (error) {console.error('通信失败:', error.message);}}}window.addEventListener('message', async (event) => {const message = event.data;// 处理请求类型的消息if (message?._type === 'REQUEST') {let responseData;let success = true;try {// 根据不同的action执行相应操作switch (message.action) {case 'GET_USER_DATA'://responseData = await getUserData(message.data.userId);responseData = "I am user " + message.data.userId;break;case 'GET_USER_SETTINGS'://responseData = await getUserSettings();responseData = "I am UserSettingsxxxx";break;default:throw new Error(`未知操作: ${message.action}`);}} catch (error) {responseData = { error: error.message };success = false;}// 回复消息,带回请求ID[3](@ref)
        event.source.postMessage({_type: 'RESPONSE',requestId: message.requestId, // 必须带回原请求ID
            success,data: responseData}, event.origin);}
});

 

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

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

相关文章

2025年新疆残膜回收机公司权威推荐榜单:棉花残膜回收机/北疆残膜回收机/残膜收膜打包一体机设备源头厂家精选

在农业可持续发展理念深入人心的今天,农田残膜回收已成为保护耕地、减少白色污染的关键环节。新疆作为我国重要的农业生产基地,对残膜回收机的需求日益增长。本文将基于市场反馈、技术数据与产品性能,为您精选新疆地…

实用指南:【Canvas与旗帜】正义联盟之刃

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年新疆大马力拖拉机公司权威榜单:新疆拖拉机/凯尔3004/大马力农机源头厂商精选

在新疆现代农业规模化、机械化发展的背景下,大马力拖拉机作为农业生产的核心动力装备,正发挥着日益重要的作用。大马力拖拉机通过强劲的动力输出、高效的作业效率和良好的地形适应性,为新疆大田作业、规模化农场经营…

2025年冷风机价格实力厂家权威推荐榜单:移动冷风机/大功率冷风机/节能冷风机源头厂家精选

在工业降温领域,选择合适的冷风机设备对提升生产效率与降低运营成本至关重要。据行业报告分析,2025年全球商用冷风机市场保持稳定增长态势,技术创新与节能环保成为驱动市场发展的核心力量。 本文将基于企业实力、产…

2025年特殊气体压缩机直销厂家权威推荐榜单:工艺气体螺杆式压缩机/沼气压缩机/化工尾气压缩机源头厂家精选

在工业气体处理领域,特殊气体压缩机的性能直接关系到整个生产系统的安全与效率。随着环保要求不断提高和工艺技术持续进步,特殊气体压缩机市场正迎来新一轮增长。 本文将基于技术实力、生产能力、产品质量及市场应用…

1v1视频软件源码,php进程之间共享socket资源 - 云豹科技

1v1视频软件源码,php进程之间共享socket资源receive.php<?php $path = __DIR__ . "/unix_sock"; @unlink($path); $rs = socket_create(AF_UNIX, SOCK_DGRAM, 0) or die("socket_create err"…

详细介绍:智能合约在分布式密钥管理系统中的应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

23种设计模式——享元模式(Flyweight Pattern) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

将 Zabbix 的数据导入到 Grafana 中进行可视化

Grafana 是一个非常强大的数据可视化工具,而 Zabbix 是一个流行的企业级监控解决方案。将 Zabbix 的数据导入到 Grafana 中进行可视化,可以帮助你更直观地展示各种监控指标。以下是一个详细的教程,介绍如何将 Zabbi…

zabbix的详细使用教程

Zabbix 详细使用教程 Zabbix 是一个开源的企业级监控解决方案,能够监控各种网络设备、服务器、虚拟化平台、数据库等。Zabbix 通过对数据收集、报警通知和数据可视化等功能的整合,帮助管理员进行实时监控和故障排查。…

WAF 在 “纯内网环境 + 内网可上互联网” 场景中的作用分析

WAF 在 “纯内网环境 + 内网可上互联网” 场景中的作用分析 结合 “内网电脑可访问互联网” 的核心前提,以及 WAF 部署于 “服务器群与核心交换机之间” 的架构,WAF 在该场景下不仅有用,且是内网 Web 安全防护的关键…

网络工程师必备神器

开头 作为一枚网络工程师,干着网络管理员的活,经常要抱着电脑穿梭于各个隐蔽的机柜、嘈杂的机房,去寻找迷失的交换机和路由器。电脑上也有攒着着一些神器,可以辅助我们快速的解决问题。 今天我就力推一款软件—千月…

react和vue

React 和 Vue 的详细使用教程 React 和 Vue 都是流行的前端框架,用于构建现代化的网页应用。它们各自有不同的设计哲学和实现方式,但都能帮助开发者高效构建用户界面。在这篇教程中,我将分别介绍 React 和 Vue 的基…

grafana的详细使用教程

Grafana 是一个开源的分析和监控平台,主要用于可视化不同数据源(如 Prometheus、Zabbix、InfluxDB、Elasticsearch 等)中的时间序列数据。通过 Grafana,用户可以创建实时监控面板、分析数据并进行报警通知。下面是…

十大最佳网络监控工具

有效的网络监控对于维护当今复杂 IT 环境的性能和可靠性至关重要。借助正确的工具,网络管理员可以在问题影响最终用户之前主动识别和解决问题。在这篇文章中,我们将探讨一些最佳的网络监控解决方案,包括基于云的平台…

LaTeX学习笔记:快速上手指南

LaTeX学习笔记:快速上手指南LaTeX 学习笔记:快速上手指南 众所周知,\(\LaTeX\) 语言本质上是一套封装了 \(\TeX\) 处理细节的宏,其中使用的每一个标记实际上都是一个宏。下面,让我们先来简单了解一下 \(\LaTeX\) …

koupleless demo依赖问题

最进入职了一家新公司,使用的是koupleless架构,让我本地运行下koupleless的demo,开发文档可以查看官网[https://koupleless.io/docs/quick-start/module_dev/](Koupleless 快速开始) 也可以直接从github上下载sampl…

有一种考前背书的美(省选 2026 Edition)

考前复习资料(省选 2025 Edition) 有一些太熟悉的例如线段树、树状数组、FWT 感觉就不写了。注意,要看的是不熟悉的! 目录考前复习资料(省选 2025 Edition)经典永流传Linux 相关虚拟机配置.gdbinit.vimrc.bashrc…

【C语言】杨辉三角:数学之美与编程建立的完美结合

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …