点击提交触发Cannot read properties of null(reading 'closed')报错修复
错误原因
触发Uncaught TypeError: Cannot read properties of null (reading 'closed')的核心原因是:执行到if(!(window.opener.closed))代码行时,window.opener本身的值为null,对null值读取属性就会抛出类型错误。原代码默认假设window.opener一定存在,没有做空值校验,只要opener引用失效就会直接抛错中断后续逻辑。
常见触发场景包括:
- 当前页面不是通过父页面
window.open()唤起的弹窗,是用户直接输入地址、从书签打开的独立页面,浏览器默认给window.opener赋值为null - 当前页虽然是弹窗,但唤起它的父页面已经被关闭、或者因跨域安全策略被浏览器切断了opener引用
- 弹窗唤起时配置了
noopener参数、或者触发跳转的链接带了rel="noopener"属性,浏览器会主动清空opener引用避免钓鱼安全风险
可行修复方案
修复的核心逻辑是先判断window.opener是否存在,再访问它的属性,同时保留原有业务逻辑,opener不存在时直接走关闭窗口的逻辑即可,不会影响正常流程。
修复后的完整代码如下:
<a href="javascript:done1(1);" onMouseOver="submiti.src='/web/graphics/icons/submito.gif'" onMouseOut="submiti.src='/web/graphics/icons/submitu.gif'"> <img name="submiti" border="0" src="/web/graphics/icons/submitu.gif" width="60" height="22"> </a> <script language="javascript"> function done1(v_hwde) { // 增加window.opener空值校验,避免空引用报错 if(window.opener && !window.opener.closed) { var data = document.tinform1.tirtby.value; // 原入参传入的是数字类型1,这里调整判断条件匹配入参类型,避免不必要的隐式类型转换 if(v_hwde === 1){ var data1 = document.tinform1.hwlocde.value; window.opener.document.tinform.hwlocde.value = data1; } window.opener.document.tinform.tirtby.value = data; window.opener.document.tinform.submit(); } window.close(); } </script>
如果业务存在跨域弹窗交互的场景,需要提前配置合法的跨域沟通权限,避免opener引用被浏览器同源策略拦截。
内容的提问来源于stack exchange,提问作者JaoTa
相关产品推荐
相关产品推荐

