如何解决JavaScript中window.open触发的Uncaught TypeError: myWin is null错误
报错根因
- 核心原因是浏览器弹窗拦截规则触发,导致
window.open返回null:- 非用户主动交互(如点击、按键操作)触发的
window.open调用,默认会被所有主流浏览器拦截 - 即使是用户交互触发,短时间内连续多次同步调用
window.open也会被判定为恶意操作,触发拦截
- 非用户主动交互(如点击、按键操作)触发的
- 原代码没有对
myWin做非空校验,直接调用close方法就会抛出Uncaught TypeError: myWin is null错误
解决方案
按照以下规则修改即可解决:
- 必须将
webAssign函数绑定到用户主动交互事件上触发,比如按钮点击事件,禁止页面加载时自动调用 - 每次调用
window.open后增加非空判断,规避空指针异常 - 给每次打开操作增加短延时,降低被拦截的概率
修改后的代码示例:
function webAssign() { let i = 1; // 递归+延时替代同步循环,降低拦截概率 function openNextTab() { if (i >= 4) return; console.log(i); const myWin = window.open("index.html"); // 非空判断,避免空指针报错 if (myWin) { myWin.close(); } else { console.warn(`第${i}次弹窗被浏览器拦截,请检查当前站点的弹窗权限设置`); } i++; // 每次间隔300ms调用,可根据实际需求调整间隔时长 setTimeout(openNextTab, 300); } openNextTab(); } // 调用示例:绑定到按钮点击事件触发 // document.querySelector('#triggerBtn').addEventListener('click', webAssign)
如果调整后仍出现拦截提示,手动给当前站点开放弹窗权限即可正常运行。
内容的提问来源于stack exchange,提问作者Jaylen Nisus
相关产品推荐
相关产品推荐

