在使用它之前检测 window.close() 是不是可以工作(JavaScript)

Posted

技术标签:

【中文标题】在使用它之前检测 window.close() 是不是可以工作(JavaScript)【英文标题】:Detect if window.close() will work before using it (JavaScript)在使用它之前检测 window.close() 是否可以工作(JavaScript) 【发布时间】:2018-11-08 13:48:03 【问题描述】:

根据许多规则和安全功能,window.close() 仅在特定情况下有效:

From the latest working spec 为window.close()

Window 对象的close() 方法应在满足以下所有条件时关闭浏览上下文A

对应的浏览上下文Ascript-closable。 现任脚本的浏览上下文熟悉浏览上下文A。 允许当前脚本的浏览上下文导航浏览上下文A

如果浏览上下文是由脚本(而不是由用户的操作创建)的辅助浏览上下文,则该浏览上下文是可脚本关闭,或者如果它是一个浏览上下文,其会话历史记录只包含一个文档。

我有一个允许用户关闭新窗口的 Web 应用程序,它可以正常工作,除非不遵守上述规则。

我正在寻找的是检测 close() 函数何时起作用并且仅在这种情况下显示关闭按钮。

我发现有关window.opener 的信息从打开它的窗口返回一个引用。但它不起作用。

if(window.opener != null)
//show button

这可能是因为新窗口是使用“右键单击 -> 在新选项卡中打开”而不是脚本打开的。当标签以这种方式打开时window.close() 有效,我只想检测window.close() 何时有效。

有什么想法吗?

【问题讨论】:

【参考方案1】:

根据文档,如果给定上下文的会话历史记录长度为 1(这正是您在新选项卡/窗口中打开链接时发生的情况),则该窗口也是可脚本关闭的。您需要将其添加到您的检查器中。

if(window.opener != null || window.history.length == 1)
//show button

【讨论】:

【参考方案2】:

据我了解,没有本地方法可以做到这一点。通过检查window.closed 是否为假来检测错误,可以检查 window.close() 是否在事后失败。 See here.

您唯一的选择是提供关闭每个窗口的功能,或者在所有情况下都尝试关闭它,并在失败时要求用户手动关闭它 - 否则您或您的任何代码都无法关闭它定义。不幸的是,没有办法解决这个问题。如果无法以编程方式关闭窗口,则可能值得尝试的一个选项是将它们重定向到某个地方,您可以在每次尝试后轻松验证。

【讨论】:

以上是关于在使用它之前检测 window.close() 是不是可以工作(JavaScript)的主要内容,如果未能解决你的问题,请参考以下文章

chrome window.close 无法使用怎么办

JavaScript中window.open()打开与window.close()关闭

请问JavaScript语言中的window.close()和window.parent.close()有啥区别?

ExtJS Window.close()之后,关闭所在页面并跳转到另一个url

火狐浏览器中如何使用javascript:window.close()关闭窗口?

被`webView.uiDelegate`打开后如何处理`window.close`?