同源策略例外:window.location测试遇window.opener为null问题咨询
问题分析与解答
核心错误点
你搞反了window.opener的指向关系,同时忽略了跨源场景下的同源策略(SOP)限制:
window.opener的指向逻辑错误- 当窗口A通过
window.open()打开窗口B时,只有窗口B的window.opener会指向窗口A,窗口A本身的window.opener属性是null(因为A不是被其他窗口打开的)。 - 你在谷歌标签页(窗口A)中调用
window.opener.location,本质是在访问一个不存在的属性,自然会报Uncaught TypeError: window.opener is null。
- 当窗口A通过
跨源场景的同源策略限制
即使你切换到nzpost标签页(窗口B),尝试用window.opener.location = "https://www.bing.com"修改谷歌窗口的地址,也会触发跨源安全错误——因为谷歌(https://www.google.com)和nzpost(https://www.nzpost.co.nz)属于不同源(域名不同),浏览器的同源策略会禁止跨源窗口直接修改对方的location或访问敏感属性。
正确的测试逻辑(同源场景)
如果要验证关联窗口的location修改能力,需要在同源页面下测试:
- 本地搭建静态服务,创建两个同源页面(比如
a.html和b.html) - 在
a.html的控制台执行:const newWin = window.open('./b.html'),保存被打开窗口的引用 - 此时:
- 在
b.html的控制台执行window.opener.location = './new-page.html',a.html会成功跳转(同源允许操作) - 在
a.html的控制台执行newWin.location = './another-page.html',b.html也会成功跳转
- 在
总结
你的笔记描述的场景是同源关联窗口的情况,跨源场景下浏览器会通过同源策略限制此类操作,同时你对window.opener的指向逻辑理解有误,才导致了测试错误。
内容的提问来源于stack exchange,提问作者Teererai Marange
相关产品推荐
相关产品推荐

