window.postmessage 是 javascript api 方法,非 html 标签,必须在脚本中调用;误作标签使用会被浏览器忽略,且需配合 message 事件监听、校验 origin、处理窗口关闭等才能可靠通信。

window.postMessage 不是 HTML 标签,也不是可直接写在 HTML 中的语法结构;它是一个 JavaScript API 方法,必须在脚本中调用。试图把它当“标签”用(比如 <postmessage></postmessage> 或类似写法)会完全失效,且浏览器控制台不会报错——只是静默不工作。
为什么不能把 postMessage 当成 HTML 标签用
HTML 规范中没有 postMessage 这个元素;它属于 window 对象的方法,运行时依赖 JS 执行上下文。常见误用包括:
- 在 HTML 里写
<postmessage data="xxx" target="..."></postmessage>—— 浏览器直接忽略,不解析也不报错 - 把
postMessage放在<script></script>外面,当成声明式配置 —— 语法错误或被当作文本渲染 - 期望通过
document.querySelector('postmessage')拿到实例 —— 返回null,因为 DOM 中根本不存在该节点
postMessage 必须配合事件监听才有效
单向发送消息毫无意义,接收方若没注册 message 事件监听,消息就丢进黑洞。典型集成漏点:
- 只在父页调用
iframe.contentWindow.postMessage(...),但 iframe 内没写window.addEventListener('message', ...) - 监听写在
DOMContentLoaded之前,导致监听器注册失败(尤其动态插入 iframe 场景) - 用
window.onmessage = handler覆盖了其他模块已注册的监听器(推荐始终用addEventListener) - 未校验
event.origin,直接信任所有来源的消息(跨域场景下极危险)
跨文档通信在 Web 应用架构中的真实集成位置
它不是“加个标签就能跑”的功能,而是需嵌入具体交互生命周期的逻辑层:
- 在微前端架构中,主应用通过
postMessage向子应用 iframe 传递初始化参数(如用户 token、主题色),子应用在message回调中解析并触发自身init() - 在表单嵌套场景(如支付弹窗 iframe),父页监听子页发来的
{ type: 'submit_success', order_id: 'xxx' },再执行关闭弹窗 + 刷新订单列表 - 单页应用(SPA)中多个 tab 共享状态时,用
localStorage+storage事件更轻量;postMessage只用于 iframe 或window.open的明确窗口间通信 - 若 iframe 来自不同源,
targetOrigin必须写死为协议+域名+端口(如'https://pay.example.com'),不能用'*'—— 否则现代浏览器(Chrome 80+)会静默丢弃消息
最容易被忽略的是:通信建立后,双方窗口引用可能失效(比如 iframe 被 removeChild、新窗口被用户手动关闭)。不检查 otherWindow.closed 或捕获 TypeError: Cannot post message to closed window,会导致后续调用静默失败。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











