window.close和self.close不要在Chrome中closures窗口

问题是,当我调用window.close()self.close()它不closures窗口。 现在似乎有一种信念,在Chrome中,您不能通过脚本closures任何不是脚本创build的窗口。 这是明显的错误,但不pipe它应该仍然这样做,即使它需要popup一个警报来确认。 这些都没有发生。

所以,有没有人有真正的,function和经过validation的方法来closures一个窗口使用类似于javascript:window.close()javascript:self.close() ,实际上做预期的事情,并发生在每个浏览器基于Chrome? 任何build议将不胜感激,我正在寻找Javascript特定的解决scheme,没有什么JQuery或第三方的实施。

更新:虽然大部分build议有严重的限制和可用性问题,但是使用脚本头中的// @grant window.close的最新build议(特定于TamperMonkey)通常会在通常不能使用处理closures的方法。 虽然不是完全理想的,并不是每一个案件,这对我来说是一个很好的解决scheme。

普通的JavaScript无法closures窗户。 这是前段时间介绍的一项安全function,用于阻止各种恶意攻击和烦恼。

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

如果满足以下所有条件,则Window对象的close()方法应该closures浏览上下文A

  • 相应的浏览上下文A脚本可closures的
  • 现任脚本的浏览上下文熟悉浏览上下文A.
  • 现任脚本的浏览上下文被允许浏览浏览上下文A.

如果浏览上下文是由脚本创build的辅助浏览上下文(与用户的操作相对),或者如果浏览上下文的会话历史logging仅包含一个文档,则该浏览上下文是脚本可closures的

这意味着,有一个小的例外, JavaScript不能被允许closures一个窗口,而不是由相同的JavaScript打开。

Chrome允许这个exception – 它不适用于userscripts – 但Firefox不。 Firefox的执行情况显示 :

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


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


长远的解决scheme:

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

但是,由于window.close所带来的安全风险远远小于Greasemonkey / Tampermonkey脚本; Greasemonkey和Tampermonkey可以在他们的API中合理地提供这个function(主要是为你打包扩展工作)。
考虑提出function请求。


哈克变通办法:

Chrome 目前很容易受到“自我redirect”攻击。 所以像这样的代码通常用于工作:

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

这是越野车的行为,国际海事组织,现在(截至2015年4月)大多阻塞。 只有当标签刚刚打开并且浏览历史中没有页面时,它仍然可以从注入的代码工作。 所以这只在很less的情况下才有用。

但是, 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的更新。 请注意,如果只有一个选项卡打开,这将不起作用。 它只closures其他选项卡。

Firefox对这个漏洞很安全。 所以,唯一的javascript方法是一次性削弱安全设置,一个浏览器。

你可以打开about:config和set
allow_scripts_to_close_windowstrue

如果您的脚本是供个人使用的,请继续操作。 如果你让其他人把这个背景打开,他们会很聪明,而且有理由拒绝。

目前没有相应的Chrome设置。

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

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

从我的观察,这个更新解决了使用window.close()closurespopup窗口的问题。 当它失败时,你会在控制台看到这个,“脚本可能只closures由它打开的窗口”。 这意味着哈克变通办法 (布罗克·亚当斯的答案) 可能无法在最新的版本。

所以,在以前的Chrome发布版本中,下面的代码块可能工作,但不是这个更新。

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

对于此更新,您必须相应地更新您的代码以closurespopup窗口。 其中一个解决scheme是获取popup窗口ID并使用

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

方法删除它。 Chrome扩展程序窗口API可以在chrome.windowsfind。

其实我的Chrome扩展MarkView面临这个问题,我不得不更新我的代码,使其为Chrome浏览器更新工作。 顺便说一句,MarkView是读取和写入Awesome Markdown Files的工具,它提供了包括内容大纲,可sorting表格和代码块语法高亮显示的行号的function。

我也创build了这个post ,欢迎任何评论。

我正在使用Brock Adams发布的方法,如果它是用户启动的,它甚至可以在Firefox中使用。

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

我是从一个button,所以它是用户启动 ,它仍然工作正常使用Chrome 35-40,Internet Explorer 11,Safari 7-8和ALSO Firefox 29-35。 我testing使用Windows和Mac OS X 10.6,10.9和10.10版本8.1,如果这是不同的。


完整的代码:

HTML:

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

JavaScript的:

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

试试这个testing页面:(现在在Chrome 40和Firefox 35中testing)

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

在篡改密钥现在你可以使用

 // @grant window.close 

然后只是打电话

 window.close(); 

许多人仍在试图find一种方法来使用JavaScriptclosuresChrome浏览器。 下面的方法只适用于当您使用Chrome作为APP启动器 – 例如信息亭!

我testing了以下内容:

我正在使用以下扩展程序: closures自助服务terminal

我按照使用说明,它似乎工作得很好(确保你清除caching,而进行testing)。 我使用的JavaScript(附加到单击事件):

 window.location.href = '/closekiosk'; 

我希望能帮助别人,因为这是我find的唯一工作解决scheme。

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

尽pipe认为这是“虚假的”,但你所说的“似乎是一种信念”其实是正确的。 Mozilla的window.close文档说

该方法只允许使用window.open方法调用由脚本打开的窗口。 如果窗口未被脚本打开,则JavaScript控制台中将显示以下错误:脚本可能不会closures未由脚本打开的窗口

你说这是“应该还是这样做”,但我不认为你会find任何支持的参考,也许你误解了一些东西?

下面的代码为我工作 –

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

Chrome 43.0.2357.81上testing

这可能是旧的,但我们来回答。

我使用top.close()来closures一个选项卡。 window.close()或其他打开…closures没有为我工作。

我发现了一个新的方式,适合我perfetly

 var win = window.open("about:blank", "_self"); win.close(); 

只有使用window.open()打开一个新窗口,新窗口才能够使用上面提到的代码closures。 这完全适合我:)注意:切勿使用href在新选项卡中打开页面。 Window.close()不适用于“href”。 使用window.open()来代替。

试试这样的onclick =“return self.close()”