window.open 卡死

博客探讨了在Chrome浏览器中使用window.open打开同源页面时,由于浏览器进程分配机制,可能导致父页面卡死的问题。问题源于非完全加载的页面在关闭时影响了同一进程的父页面。解决方案是在window.open的参数中添加'noopener',确保新页面在不同进程中运行,避免影响父页面。然而,这将阻止新页面访问父页面。博客详细解释了原因并提供了相应的修复办法。

最近公司里开发了一个低代码平台,使用的react技术栈。

这个平台顶部有一个预览按钮,当点击时,会使用window.open打开一个新的浏览器tab,显示预览页的内容。

开发的时候,发现一个奇怪的现象,如果打开之后的页面,资源没加载完(页面内有不少ajax交互),就快速关闭掉了,父页面就会卡死。

另一个同事对这个事情进行了排查,最后发现是window.open的问题,这个看似不起眼的api,其实暗藏玄机

最终发现问题和chrome的进程机制有关系。

原因:谷歌浏览器在给新开窗口分配进程时,看是否同源,非同源页面会单独分配一个新进程,而同源页面只会分配一个相同的新进程。在上述场景中,A,B页面同源,所以谷歌浏览器只会分配一个进程,这就导致B页面在请求未结束时就关闭,A页面会卡死。

对具体分析原因感兴趣,请访问:谷歌浏览器新开页面进程问题 - MinorF_γ - 博客园

记录一下解决方案:

1
window.open(url, windowName, 'noopener')

只要在window.open第三个参数上加一个 noopener 就可以了,这样chrome在分配进程的时候,就会单独分配一个新的进程,就不会造成父页面卡死了

noopener会导致新打开的页面无法使用window.opener访问到父页面。如果需要访问的话就不能这么干了。我们现在两个页面之间没有交互,就直接用noopener解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值