JavaScript父子窗口通信核心是window.open()返回的引用和共享window上下文,需遵守同源策略并确保加载完成;跨域时必须使用postMessage。

JavaScript 中父窗口与子窗口通信,核心是通过 window.open() 返回的子窗口引用,以及双方共享的 window 对象上下文来实现。关键在于权限控制(同源策略)和通信时机(子窗口加载完成后再操作)。
获取子窗口引用并调用其方法或属性
父窗口调用 window.open() 后会返回一个指向子窗口的 window 对象,只要同源,就能直接访问其全局变量、函数或 DOM:
- 确保子页面已加载完成再操作,可监听
load事件:const child = window.open('child.html');<br>child.addEventListener('load', () => {<br> child.sayHello(); // 调用子窗口定义的函数<br>}); - 若子页面未定义对应方法或变量,会报
TypeError;跨域时会触发安全错误(Blocked a frame from accessing a cross-origin frame)。
子窗口主动向父窗口传递数据
子窗口可通过 window.opener 获取父窗口引用(同样受同源限制),然后调用父窗口暴露的方法或修改父窗口的变量:
- 父窗口提前定义接收函数,例如:
window.receiveFromChild = (data) => { console.log('收到:', data); }; - 子窗口中执行:
if (window.opener && !window.opener.closed) {<br> window.opener.receiveFromChild({ msg: '你好,父窗口' });<br>} - 注意检查
window.opener是否存在且未关闭,避免运行时报错。
使用 postMessage 实现跨域安全通信
当父、子窗口不同源时,必须使用 window.postMessage() —— 它是唯一被浏览器允许的跨域窗口通信机制:
立即学习“Java免费学习笔记(深入)”;
- 父窗口向子窗口发消息:
child.postMessage({ type: 'INIT', data: 'start' }, 'https://example.com');(第二个参数为子窗口确切源,不能写*除非完全信任) - 子窗口监听消息:
window.addEventListener('message', event => {<br> if (event.origin !== 'https://your-parent-domain.com') return;<br> console.log('父窗口消息:', event.data);<br>}); - 子窗口也可用
event.source.postMessage()回复父窗口,event.source是发送方窗口引用。
关闭子窗口及检测关闭状态
父窗口可调用 child.close() 关闭子窗口;子窗口可通过 window.close() 自行关闭(仅限脚本打开的窗口)。检测是否关闭用 child.closed 属性:
if (child && !child.closed) { child.close(); }- 子窗口关闭后,
window.opener仍存在但不可交互;父窗口无法监听子窗口“关闭事件”,需轮询或由子窗口主动通知(如用postMessage发送{ type: 'CLOSED' })。


















