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

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

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


当前回答

Chrome修复了36.0.1985.125版本的安全问题

Chrome 36.0.1985.125 2014年7月16日星期三 发行通知

根据我的观察,这次更新修复了使用window.close()关闭弹出窗口的问题。当它失败时,你会在控制台中看到这一点,“脚本可能只关闭由它打开的窗口。”这意味着在最新版本中,布洛克·亚当斯(Brock Adams)的回答可能行不通。

因此,在之前的Chrome发布版本中,下面的代码块可能会工作,但不适用于此更新。

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

对于此更新,您必须相应地更新代码以关闭弹出窗口。解决方案之一是获取弹出窗口id并使用

chrome.windows.remove(integer windowId, function callback)

方法将其删除。Chrome扩展窗口API可以在Chrome .windows中找到。

实际上,我的chrome扩展MarkView正面临这个问题,我不得不更新我的代码,使它为这个chrome更新工作。顺便说一下,MarkView是工具来读取和写入Awesome Markdown文件,它提供的功能包括内容大纲,可排序表和代码块语法突出显示与行号。

我也创建了这个帖子,欢迎任何评论。

其他回答

在我的例子中,页面需要关闭,但可能已经通过链接和窗口打开。Close会失败。

我选择的解决方案是发布窗口。关闭,然后是一个窗口。重定向到另一个页面的setTimeout。

这样,if窗口。关闭成功,该页上的执行将停止,但如果失败,它将在一秒钟内重定向到另一个页面。

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);

许多人仍在尝试使用javascript关闭Chrome浏览器。以下方法只适用于当你使用Chrome作为应用程序启动器- kiosk为例!

我测试了以下内容:

我正在使用以下扩展:关闭Kiosk

我正在遵循使用说明,它似乎工作得很好(确保在进行测试时清除缓存)。我使用的javascript是(附加到点击事件):

window.location.href = '/closekiosk';

我希望这能帮助到一些人,因为这是我找到的唯一有效的解决方案。

注意:似乎扩展运行在后台,并添加了一个Chrome托盘图标。它有以下选项选中:“让Chrome运行在后台”(或类似的文本)。你可能需要玩它,直到它为你工作。我检查它,现在它工作得很好!

普通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没有相应的设置。

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

家长:

<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>

下面的代码对我有用

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

在Chrome 43.0.2357.81上测试