如何捕获并屏蔽'Cross-Origin-Opener-Policy policy would block the window.closed call'错误
如何捕获并屏蔽'Cross-Origin-Opener-Policy policy would block the window.closed call'错误
我太懂你这种头疼的处境了——弹窗跳去其他域名后,查window.closed直接触发跨源安全错误,常规的try/catch、全局错误监听都抓不住,还得看着错误日志跳出来闹心。
其实问题出在你当前的代码逻辑里:虽然整个while循环包在try块里,但访问extFrame?.closed这个属性时抛出的安全错误,需要更精准的捕获逻辑。我们可以把每次访问closed属性的操作单独塞进try/catch里,这样就能稳稳抓住这个跨源错误了。
给你调整好的代码示例:
const checkForPopUp = async function() { try { while (true) { let isClosed; try { // 把访问closed属性的操作单独包裹,精准捕获跨源错误 isClosed = extFrame?.closed; } catch (error) { // 碰到跨源错误,就当弹窗已经"无法继续检测",直接结束逻辑 console.log("弹窗已跳转至跨源地址,停止检测"); return true; } if (isClosed) { return true; } await new Promise(resolve => setTimeout(resolve, 250)); } } catch (error) { console.log("其他异常:", error); } }
为啥这样能行?因为弹窗跨源后,访问它的closed属性会直接抛出DOMException安全错误,把这个属性访问单独放在内部try/catch里,就能精准截住这个错误,然后我们可以把这种情况等效成弹窗"无法继续监控"的状态,直接返回true结束检测,自然就不会有错误日志乱跳了。
另外还有个备选思路:如果能控制弹窗的代码,可以用window.postMessage让弹窗定期给主页面发心跳消息,一旦收不到消息,要么是弹窗关了,要么是跨源了。但要是弹窗是第三方页面,这个方法就没法用了,所以还是上面的try/catch包裹属性访问的方案更直接好用。
备注:内容来源于stack exchange,提问作者Mike-S122
相关产品推荐
相关产品推荐

