检测window.close()在使用之前是否有效(JavaScript)

时间:2018-05-29 20:12:23

标签: javascript window

根据许多规则和安全功能,window.close()仅适用于特定情况:

window.close()

From the latest working spec

  

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

     
      
  • 相应的浏览上下文 A 脚本可关闭
  •   
  • 现有脚本的浏览上下文熟悉浏览上下文 A
  •   
  • 允许现有脚本的浏览上下文导航浏览上下文 A
  •   
     

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

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

我正在寻找的是检测close()函数何时起作用,并且只显示关闭按钮。

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

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

也许这是因为新窗口是使用“右键单击 - >在新标签页中打开”而不是脚本打开的。以这种方式打开标签window.close()时,我只想检测window.close()何时起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

据我所知,没有一种本地方式可以做到这一点。通过检查window.closed是否为false来检查错误,可以检查window.close()是否在事后失败。 See here.

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