JS: window.opener为Null的问题

2022-2-14 12:16:55 [大杂烩 - PC与手机]

WEB系统中,JS通过window.opener来访问父页面,以读取数据。过去运行正常,近来突然发现Chrome打开页面JS报错,window.opener的值是null。检查 父页面的a 标签、父页面关闭、跨域等并无问题。经查阅发现,Chrome因为性能、安全等原因,对window.opener 进行了设置。


在A标签中 加上 rel="opener"
开启window.opener,同站环境下,sessionstorage也会带过去,页面也共享同一个渲染进程。

opener存在要满足以下条件:
1、同站点
同站点与同源不同,同站点要求相对宽松,即协议,根域名相同即可
2、是否有连接关系,
A连接B,一般有几种方式,a连接,JS执行打开新标签页,iframe包含。
如果直接地址栏输入访问B,则AB无连接关系
3、父页面未被关闭(A标签的target为 _blank,不能等于_self)


在A标签中 加上 rel="noopener"
为了防止window.opener被滥用,在使用targrt=_blank时需要加上rel=noopener
无论是window.open还是a标签,都有属性可以设定noopener,对应也有值opener,当设定了noopener,则A打开B时,B会打开一个新的渲染进程,即B也无法通过window.opener来操作A。
Chrome下,A标签当不手动设定rel='opener',浏览器会开启新的渲染进程,window.opener为空。

rel=norefferrer
rel=noopener支持chrome49和opera36,不支持火狐,为了兼容需要加上rel=noreferrer