【问题标题】:Close/exit a PWA programmatically以编程方式关闭/退出 PWA
【发布时间】:2020-03-07 23:10:23
【问题描述】:

如何关闭/退出我的 PWA?

我以为我能做到这一点:

window.close();

不幸的是,这会导致通常的错误:

脚本只能关闭它打开的窗口。

有没有办法以编程方式关闭我的 PWA?

【问题讨论】:

标签: javascript google-chrome progressive-web-apps


【解决方案1】:

因此请遵循 MDN 文档:

window.close

过去,当您直接调用窗口对象的 close() 方法,而不是在窗口实例上调用 close() 时,浏览器会关闭最前面的窗口,无论您的脚本是否创建了那个窗口。 不再是这种情况了;出于安全原因,不再允许脚本关闭它们未打开的窗口。

关注living standard

如果 current 为 null 或其正在关闭为真,则返回。 (问题来了,因为浏览上下文为空,除非您使用 javascript 上下文打开新文档)

如果以下所有都为真:

  • 当前是脚本可关闭的
  • 现任全局对象的浏览上下文熟悉当前
  • 允许当前全局对象的浏览上下文导航当前

从第二部分开始,脚本将被视为不可关闭脚本 (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

https://security.stackexchange.com/questions/133744/why-do-browsers-disallow-script-closing-an-opener-window-yet-allow-changing-its

【讨论】:

  • 我问的是 PWA,而不是常规页面。 “或者如果它是一个顶级浏览上下文,其会话历史记录仅包含一个文档”这正是我的 PWA 的内容。所以,在我看来,这听起来像是一个在 PWA 中不起作用的浏览器错误。
  • 你是对的(忘记了标题上的 PWA,我的错),在这种情况下 window.close 按预期工作。最简单的测试方法是,打开一个隐身窗口,然后立即执行 window.close... 它会关闭。所以可能你需要检查你的确认是否属实,我相信你的 PWA 不是顶级浏览上下文
  • 它是通过直接到 PWA 的快捷方式打开的...在这种情况下没有其他浏览上下文。
  • 那么它应该可以工作,我刚刚用 Twitter PWA 进行了测试。安装 PWA,打开应用程序。在浏览器中调用 window.close ......它会立即关闭。最简单的检查方法是 window.history.length 等于 1
  • 啊,明白了!好的,所以我的 PWA 使用锚片段进行内部导航......这意味着历史长度可以大于 1,即使它只是在一个原点上。缺少一个大的 iframe,知道有什么办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多