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

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

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


当前回答

试试这样做onclick="return self.close()"

其他回答

在tampermonkey中你可以使用

// @grant        window.close

然后简单地调用

window.close();

尽管你认为这是“明显的错误”,但你所说的“似乎是一种信念”实际上是正确的。窗口的Mozilla文档。近说

此方法只允许被脚本使用该窗口打开的窗口调用。开放的方法。如果该窗口不是由脚本打开的,则在JavaScript控制台中出现以下错误:脚本不能关闭未由脚本打开的窗口

你说它“应该仍然这样做”,但我不认为你会找到任何支持这一点的参考,也许你记错了什么?

普通javascript不能随意关闭窗口。这是一个安全特性,在一段时间前推出,以阻止各种恶意利用和烦恼。

来自window.close()的最新工作规范:

The close() method on Window objects should, if all the following conditions are met, close the browsing context A: The corresponding browsing context A is script-closable. The browsing context of the incumbent script is familiar with the browsing context A. The browsing context of the incumbent script is allowed to navigate the browsing context A. A browsing context is script-closable if it is an auxiliary browsing context that was created by a script (as opposed to by an action of the user), or if it is a browsing context whose session history contains only one Document.

这意味着,除了一个小例外,javascript必须不允许关闭一个没有被同一javascript打开的窗口。

Chrome允许这种例外——它不适用于用户脚本——但Firefox不允许。Firefox的实现直截了当地说:

此方法只允许被脚本使用该窗口打开的窗口调用。开放的方法。


如果你想用window。关闭Greasemonkey / Tampermonkey / userscript,你会得到: Firefox:错误消息“脚本不能关闭未由脚本打开的窗口”。 Chrome:只是无声地失败。


长期解决方案:

解决这个问题的最好方法是做一个Chrome扩展和/或Firefox插件。这些可以可靠地关闭当前窗口。

但是,由于窗口存在安全隐患。接近,对于Greasemonkey/Tampermonkey脚本来说要少得多;Greasemonkey和Tampermonkey可以在它们的API中合理地提供此功能(实际上是为您打包了扩展工作)。 考虑提出一个特性请求。


俗气的变通方法:

Chrome目前很容易受到“自重定向”漏洞的攻击。所以像这样的代码在一般情况下是有效的:

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

这是错误的行为,我认为,现在(大约在2015年4月)大部分被阻止。它仍然会从注入的代码,只有当标签是新打开的,并在浏览历史中没有页面。所以它只在很小的情况下有用。

然而,变种仍然适用于Chrome (v43和v44)和Tampermonkey (v3.11或更高版本)。使用显式的@grant和普通的window.close()。例如:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

感谢zanetu的更新。注意,如果只有一个选项卡打开,这将不起作用。它只关闭额外的选项卡。

Firefox对这种攻击是安全的。所以,javascript唯一的方法就是削弱安全设置,一次一个浏览器。

你可以打开about:config和set Allow_scripts_to_close_windows为true。

如果您的脚本是供个人使用的,那么就这样做吧。如果你让其他人打开这个设置,他们会明智而合理地带着偏见拒绝。

目前Chrome没有相应的设置。

试试这样做onclick="return self.close()"

这工作的要求:

你必须从窗口启动器打开窗口/标签,以获得一个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" />