问题是,当我调用window.close()或self.close()时,它不会关闭窗口。现在似乎有一个信念,在Chrome中,你不能通过脚本关闭任何不是脚本创建的窗口。这显然是错误的,但无论如何,它仍然应该这样做,即使它需要弹出一个警告来确认。这些都没有发生。

所以有没有人有真正的,功能性的和经过验证的方法关闭一个窗口,使用javascript:window.close()或javascript:self.close(),这实际上是什么是预期的,发生的事情只是在每个浏览器,不是基于Chrome ?任何建议都将非常感谢,我正在寻找Javascript特定的解决方案,没有JQuery或第三方实现。

更新:虽然大部分建议都有严重的局限性和可用性问题,但最新的建议(具体到TamperMonkey)使用// @grant窗口。在脚本头文件中使用Close,即使是在那些通常不能处理Close方法的选项卡上也可以。虽然不完全理想,也不适用于所有情况,但在我的情况下,这是一个很好的解决方案。


当前回答

您也可以尝试使用下面的代码。这也将帮助你重定向你的父窗口:

家长:

<script language="javascript">

function open_a_window() 
{
    var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

        window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);

   return false;
}

// opener:
window.onmessage = function (e) {
  if (e.data === 'location') {
    window.location.replace('https://www.google.com');
  }
};

</script>

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

弹出:

<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">

<h1>The window closer:</h1>

<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" /> 


<script language="javascript">

function quitBox(cmd) 
{      
    if (cmd=='quit')    
    {   
       window.opener.postMessage('location', '*');
       window.open(location, '_self').close();    
    }     
    return false;   
}

</script>

</body>
</html>

其他回答

这可能有点老了,但还是回答吧。

我使用top.close()关闭一个制表符。Window.close()或其他open…亲密对我没用。

我想分享我对这个问题的“解决方案”。似乎我们大多数人都试图在一个标准的浏览器会话中关闭一个浏览器窗口,在这个会话中,用户正在访问一个或另一个网站,在他们访问了其他网站之后,在他们访问更多网站之前。

然而,我的情况是,我正在为一个设备构建一个web应用程序,这基本上是设备做的唯一一件事。你启动它,它会启动Chrome浏览器并导航到我们的应用程序。它甚至没有连接到互联网,它所连接的任何服务器都在我们本地的Docker容器上。用户需要一种方法来关闭应用程序(又名关闭Chrome),这样他们就可以访问终端执行系统更新。

所以它启动了,以kiosk模式启动Chrome,并且已经在正确的地址。这恰好很容易满足规范中的第二个选项:

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

所以简单地调用window.close()从我的kiosk应用程序只是工作!

这工作的要求:

你必须从窗口启动器打开窗口/标签,以获得一个javascript句柄,以使其工作,因为它并不总是工作在一个标签,没有通过窗口启动器脚本打开。这个测试页面向您展示了如何:

http://browserstrangeness.bitbucket.io/window_close_tester.htm

如果你没有看到它工作在我的启动器,张贴你的浏览器,你的设备和版本是必要的。不同版本的浏览器在不同设备上的表现不同。(比如ipad上的火狐浏览器和Chrome浏览器,并不是他们所说的那样。他们是不同皮肤的Safari !)

因此,重要的是说,例如“我在iPad上使用Safari 10.14,使用iOs 14.5”,这样我(或其他一些有用的人在stackoverflow这里)可以为你研究它,并发布结果以帮助其他用户。提前谢谢你这么做。如果您使用启动器,并且它在我的示例中为您工作,那么它就工作了。

我正在使用Brock Adams发布的方法,它甚至可以在Firefox中工作,如果它是由用户通过按钮或链接从另一个窗口启动。

open(location, '_self').close();

我从一个按钮按下调用它,所以它是用户发起的,它仍然可以使用Chrome 90, Internet Explorer 11, Edge, Safari 7-10和Firefox 35和88。我使用8.1和10版本的Windows和Mac OS X 10.6、10.9、10.10和10.14进行测试。


自关闭窗口代码(在自动关闭的页面上)

完整的代码将用于用户打开的窗口,可以关闭自己:

window_to_close.htm

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

下面是带有工作示例的测试页面:(现在在Chrome 90.0和Firefox 88.0中进行了测试——包括Windows 10和Mac 10.14 Mojave)

http://browserstrangeness.bitbucket.io/window_close_tester.htm


窗口打开器代码(在打开上述页面的页面上)

要做到这一点,安全性强加的跨浏览器兼容性要求要关闭的窗口必须已经被用户单击同一站点域中的按钮打开。

例如,使用上述方法关闭自身的窗口,可以使用以下代码从页面打开(代码提供自上面链接的示例页面):

window_close_tester.htm

JavaScript:

function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}

HTML:

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

如果你不能关闭脚本没有打开的窗口,那么你可以使用下面的代码销毁你的页面:

 document.getElementsByTagName ('html') [0] .remove ();

在tampermonkey中你可以使用

// @grant        window.close

然后简单地调用

window.close();