如何关闭/退出我的PWA?
我以为我可以做到这一点:
window.close();
不幸的是,这导致了通常的错误:
脚本只能关闭由它打开的窗口。
有什么办法以编程方式关闭我的PWA?
答案 0 :(得分:3)
因此,请遵循以下MDN文档:
过去,当您直接调用窗口对象的close()方法而不是在窗口实例上调用close()时,浏览器会关闭最前面的窗口,无论您的脚本是否创建了该窗口。 情况已不再如此;出于安全原因,不再允许脚本关闭未打开的窗口。
如果current为null或它的close为true,则返回。 (问题出在这里,除非您使用javascript上下文打开新文档,否则浏览上下文为null)
如果满足以下所有条件:
- 当前可关闭脚本
- 现有的全局对象的浏览上下文熟悉当前的
- 允许现有的全局对象的浏览上下文导航当前
从第二部分开始,该脚本将被视为不可关闭脚本(Here you have more info)
如果浏览上下文是由脚本创建的辅助浏览上下文(而不是用户的操作),或者它是会话历史记录仅包含的顶级浏览上下文,则该浏览上下文可以关闭脚本一份文件。
因此,我担心在现代浏览器中,如果不控制打开者的名称,实际上不可能完全关闭当前选项卡。这也适用于由iframe打开的窗口。所有信息都在我链接的当前标准中,原因在我引用的原因中。几年前,有一些使用open("", "_self")
和类似解决方案的解决方案,但我相信这一问题已得到修补。
在使用PWA的情况下,只要浏览历史记录中没有推送事件,您就只能关闭该应用程序(这意味着window.history.length
在整个导航中仍为1。在这种情况下,您的应用程序将被视为仅包含一个文档的顶级浏览上下文,因此window.close()
可以使用。最后一项确认可以进行测试:转到twitter.com->安装Twitter PWA->打开PWA->打开控制台,然后写入window.close()
,它将立即关闭该窗口,当它导航到PWA中的任何链接时,只有一个文档的历史记录条件无法满足。
额外尝试查找为什么这是一个安全问题: https://security.stackexchange.com/questions/120116/security-feature-preventing-javascript-from-closing-the-window