postMessage 实现父子页面通信的关键在于精准发送、稳定接收和严格校验:父页需等待 iframe 加载完成、校验 contentWindow 并指定完整 targetOrigin;子页必须首验 event.origin 且用严格相等比对,再解析 event.data;回传可用 "*",但需闭环响应;移动端需绑定用户手势触发 play()。
用 `` 实现父子页面通信,核心不是“能不能发”,而是“发得准、收得稳、验得严”。`postMessage` 是浏览器原生支持的跨域通信机制,不绕过同源策略,而是通过受控通道传递消息——关键在源头校验和目标限定。
父页不能一加载完就立刻调用 `postMessage`,必须确保 iframe 已完成加载且 `contentWindow` 可用。否则会报错或静默失败。
https://player.example.com:8080;填 "*" 在生产环境会被浏览器丢弃,且无错误提示{ type: "play", time: 32 },避免字符串解析歧义子页监听 `message` 事件后,必须第一时间校验 `event.origin`。未校验就执行操作(比如 `video.play()` 或跳转),等于把控制权交给任意 。
=== 比对,禁止 `includes()` 或 `indexOf()` —— 否则会被 https://evil-example.com 绕过if (event.origin !== 'https://shop.example.com') return;
['https://a.com', 'https://b.com'].includes(event.origin)
event.data 前先做类型检查,防止 undefined 或非对象导致脚本中断子页调用 window.parent.postMessage() 向父页反馈状态时,targetOrigin 可设为 "*",因为父页源不可预知且已控制 iframe 加载行为,风险相对可控。
{ type: "ready", canPlay: true }){ type: "init" },父页再发控制指令,避免竞态iOS 和 Android 要求 `video.play()` 必须由用户真实交互(click/touchstart)触发。通过 `postMessage` 发来的指令属于程序调用,直接执行大概率抛 NotAllowedError。
play() 并返回 Promise{ type: "check-ready" } 探测子页是否已准备好接受控制Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)