尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

与跨域 iframe 通信示例

与跨域 iframe 通信示例
📅 发布时间:2026/6/19 16:12:45

与跨域 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);}
});

 

桂棹兮兰桨,击空明兮溯流光。

相关新闻

  • 2025年新疆残膜回收机公司权威推荐榜单:棉花残膜回收机/北疆残膜回收机/残膜收膜打包一体机设备源头厂家精选
  • 详细介绍:智能合约在分布式密钥管理系统中的应用
  • 23种设计模式——享元模式(Flyweight Pattern) - 实践

最新新闻

  • Redis Memory Analyzer与Python集成:API使用详解
  • 2026十大离婚律师综合口碑榜单,价格透明服务优质精选 - mypinpai
  • 深入解析S12XDBG硬件调试模块:从比较器、状态机到复杂断点实战
  • 从环境变量到密码安全:Aero处理敏感配置的完整方案
  • CANN/ge获取HCCL跟随流数量
  • RxJavaSample高级技巧:10个实用方法解决回调地狱和复杂异步问题

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号