postmessage 是 iframe 跨域通信唯一安全、标准、可落地的方案;document.domain 和 cors 不适用。需监听 load 事件、校验 contentwindow 和 origin,targetorigin 必须写死完整地址,子页面收消息须双校验 origin 和 source,并通过 message 协议约定交互。

直接说结论:postMessage 是 iframe 跨域通信唯一安全、标准、可落地的方案;document.domain 和 CORS 在弹出层或典型跨域 iframe 场景中完全不适用。
父页面发消息前必须确认 iframe.contentWindow 可用且 origin 可读
常见错误现象是调用 iframe.contentWindow.postMessage() 时抛出 TypeError: Cannot read property 'postMessage' of null,或控制台显示 Blocked a frame with origin "https://a.com" from accessing a cross-origin frame。这不是“加载慢”,而是你试图在 iframe 尚未完成 JS 环境初始化时就访问它。
- 必须监听
iframe的load事件(不是DOMContentLoaded或setTimeout) - 在
load回调里双重检查:iframe.contentWindow && iframe.contentWindow.location?.origin - Safari 某些版本对跨域 iframe 的
location.origin返回null,此时应 fallback 到预设白名单域名(如'https://pay.gateway.io') - 若
iframe.src动态切换(如 dev/staging/prod),需每次load后重新匹配对应targetOrigin
targetOrigin 写成 '*' 会导致消息静默丢弃或安全失控
postMessage 发送时若 targetOrigin 填 '*',浏览器在多数现代环境(尤其重定向后 origin 变更时)会直接丢弃消息——控制台可能无提示,消息根本没发出去。更严重的是,它放弃来源校验,使恶意页面可截获敏感数据(如 token、用户 ID)。
- 必须写死完整 origin,例如
'https://upload.example.com:8088'(协议 + 域名 + 端口缺一不可) - 开发期可临时用
'*'快速验证流程,但上线前必须改掉 - 如果子页面部署多环境,用配置驱动
targetOrigin,别硬编码字符串 - CDN/代理网关可能重写响应头导致实际 origin 偏移,
'*'会让这类异常完全静默通过,极难排查
子页面收消息必须做双校验:event.origin === 白名单 && event.source === 预期窗口
只监听 message 事件等于开门揖盗。攻击者可在控制台伪造 postMessage,仅靠 event.data 字段做权限判断毫无意义。
- 用严格相等
===校验event.origin,禁止用includes()、正则或模糊匹配 - 必须比对
event.source是否等于你保存的iframe.contentWindow引用(不是window.parent或其他) - 推荐用
Set维护可信 origin 列表,避免硬编码字符串比较 - 首次通信可附带
type: "handshake"和随机nonce,建立双向信任链
无法获取跨域 iframe 的 DOM 元素,所有交互必须通过 message 协议约定
跨域 iframe 的 contentDocument 恒为 null,contentWindow 是受限对象,任何对其属性或方法的访问(包括 document、localStorage、cookie)都会触发 SecurityError。这不是延迟问题,是浏览器主动拦截。
- 想读取子页面选中的坐标、支付状态、表单值?必须由子页面主动
postMessage上报 - 想控制子页面 UI(如关闭浮层、切换主题)?必须定义明确的
type字段(如'CLOSE'、'TOGGLE_THEME'),由子页面自行响应 - 不要尝试在父页面里轮询或监听子页面 DOM 变化——跨域下连
MutationObserver都不可用 - 复杂状态同步(如微前端共享用户登录态)需设计带版本号或时间戳的 message 结构,避免竞态
真正容易被忽略的点在于:跨域通信不是“能发能收”就完事了;它是一套需要双方严格对齐的协议。从 targetOrigin 的精确性、load 时机的确定性,到每条消息的 type 定义、nonce 生命周期、错误重试策略——漏掉任一环,线上就可能表现为“偶发失败”或“被劫持”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











