为什么部分网站无法通过父窗口调用window.close方法关闭?
父窗口调用window.close()关闭跨源子窗口失效问题说明
实测表现
- 部分站点支持父窗口正常关闭,以Google站点为例,代码如下:
const winHandle = window.open('https://www.google.com', '_blank'); setTimeout(() => { winHandle.close(); // 可正常关闭 }, 2000);
- 部分站点无法通过父窗口关闭,以Facebook站点为例,代码如下:
const winHandle = window.open('https://www.facebook.com', '_blank'); setTimeout(() => { winHandle.close(); // 关闭失效 }, 2000);
失效原因
- 核心触发原因是浏览器安全策略限制:如果子窗口所属站点配置了
Cross-Origin-Opener-Policy(COOP)响应头,取值为same-origin或same-origin-allow-popups时,会主动切断跨源父窗口和当前子窗口的opener关联,父窗口持有的窗口句柄会失去操作权限,此时调用close()方法无任何效果。 - 少数站点会在自身前端逻辑中拦截非页面自身触发的关闭事件,也会导致父窗口的关闭调用失效。
- 同域场景下不会触发该限制,只要父窗口持有有效子窗口句柄,
close()方法均可正常生效。
内容的提问来源于stack exchange,提问作者Qi Li
相关产品推荐
相关产品推荐

