窗口.关闭和自我.关闭 不要在 Chrome 中关闭窗口长期解决方案:黑客解决方法:

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

那么,有没有人有真正的,功能性的和经过验证的方法来关闭窗口,使用类似的东西,或者实际上做了预期的事情,并且在不是基于Chrome的每个浏览器中都能很好地发生?任何建议将不胜感激,我正在寻找Javascript特定的解决方案,没有JQuery或第三方实现。javascript:window.close()javascript:self.close()

更新:虽然建议的大部分内容都有严重的限制和可用性问题,但在脚本头中使用 // @grant window.close 的最新建议(特定于 TamperMonkey)通常也可以做到这一点,即使在那些通常无法处理 close 方法的选项卡上也是如此。虽然不完全理想,也没有推广到每种情况下,但就我而言,这是一个很好的解决方案。


答案 1

普通的javascript不能随意关闭窗口。这是一项安全功能,不久前引入,用于阻止各种恶意漏洞利用和烦恼。

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

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

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

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

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

Chrome 允许这种例外 - 它不适用于用户脚本 - 但是 Firefox 不允许。Firefox 实现完全声明

只允许对使用 window.open 方法的脚本打开的窗口调用此方法。


如果你尝试使用从Greasemonkey / Tampermonkey / userscript,你会得到:
Firefox:错误消息,“”
Chrome:只是默默地失败了。window.closeScripts may not close windows that were not opened by script.



长期解决方案:

处理这个问题的最好方法是制作Chrome扩展程序和/或Firefox附加组件。这些可以可靠地关闭当前窗口。

但是,由于 所带来的安全风险对于 Greasemonkey/Tampermonkey 脚本要小得多。Greasemonkey 和 Tampermonkey 可以在其 API 中合理地提供此功能(实质上是为您打包扩展工作)。
考虑提出功能请求。window.close



黑客解决方法:

Chrome目前容易受到“自我重定向”攻击。所以像这样的代码曾经在一般情况下工作:

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

这是错误的行为,IMO,现在(大约截至2015年4月)大部分被阻止。仅当选项卡是新打开的并且浏览历史记录中没有页面时,它仍然可以从注入的代码中工作。因此,它仅在非常小的情况下有用。

但是,变体仍然适用于Chrome(v43和v44)以及 Tampermonkey(v3.11或更高版本)。使用显式和纯化的 .EG:@grantwindow.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:configallow_scripts_to_close_windowstrue

如果您的脚本供个人使用,请继续执行此操作。如果你要求其他人打开这个设定,他们会很聪明,也是有道理的,带着偏见拒绝。

目前没有针对 Chrome 的等效设置。


答案 2

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

Chrome 36.0.1985.125 2014年7月16日 星期三 发行说明

根据我的观察,此更新修复了使用关闭弹出窗口的问题。当它失败时,您将在控制台中看到此内容,“脚本可能仅关闭由它打开的窗口。这意味着黑客解决方法(Brock Adams的答案)在最新版本中可能不起作用window.close()

因此,在之前的Chrome发布版本中,以下代码块可能有效,但不适用于此更新。

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

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

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

方法来删除它。Chrome扩展窗口API可以在chrome.windows上找到。

实际上,我的chrome扩展程序MarkView遇到了这个问题,我不得不更新我的代码才能使其适用于此Chrome Update。顺便说一句,MarkView是读取和写入Awesome Markdown文件的工具,它提供了包括内容大纲,可排序表和代码块语法突出显示的功能。

我也创建了这篇文章,欢迎任何评论。