普通的 javascript 无法随意关闭窗口。这是不久前引入的一项安全功能,用于阻止各种恶意攻击和烦恼。
从最新的工作规范window.close()
:
close()
Window 对象上的方法应该,如果满足以下所有条件,则关闭浏览上下文A:
- 相应的浏览上下文A是脚本可关闭的。
- 现有脚本的浏览上下文与浏览上下文A相似。
- 允许现有脚本的浏览上下文导航浏览上下文A。
如果浏览上下文是由脚本创建的辅助浏览上下文(而不是由用户操作),或者如果它是会话历史记录仅包含一个文档的浏览上下文,则该浏览上下文是脚本可关闭的。
这意味着,除了一个小例外,不允许 javascript 关闭不是由同一个 javascript 打开的窗口。
Chrome 允许该异常——它不适用于用户脚本——但 Firefox 不允许。 Firefox 实现明确指出:
仅允许为使用该window.open
方法的脚本打开的窗口调用此方法。
如果您尝试window.close
从 Greasemonkey / Tampermonkey / 用户脚本使用,您将获得:
Firefox:错误消息,“ Scripts may not close windows that were not opened by script.
”
Chrome:只是默默地失败。
长期解决方案:
解决此问题的最佳方法是制作 Chrome 扩展程序和/或 Firefox 插件。 这些可以可靠地关闭当前窗口。
然而,由于由 带来的安全风险window.close
对于 Greasemonkey/Tampermonkey 脚本来说要小得多;Greasemonkey 和 Tampermonkey 可以在他们的 API 中合理地提供这个功能(本质上是为你打包扩展工作)。
考虑提出功能请求。
hacky的解决方法:
Chrome 目前很容易受到“自我重定向”漏洞的攻击。所以像这样的代码过去通常可以工作:
open(location, '_self').close();
这是 IMO 的错误行为,现在(截至 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
并设置
allow_scripts_to_close_windows
为true
.
如果您的脚本供个人使用,请继续这样做。如果你让其他人打开那个设置,他们会很聪明,也有理由带着偏见拒绝。
目前没有适用于 Chrome 的等效设置。