window.close和self.close不关闭Chrome中的窗口

Gµå*_*ïåñ 165 javascript greasemonkey google-chrome tampermonkey

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

那么,是否有人使用真实的,功能性的,经过验证的关闭窗口的方法,使用类似的东西javascript:window.close()或者javascript:self.close()实际上做了预期的东西以及在非Chrome浏览器的每个浏览器中都能正常运行的东西?任何建议将不胜感激,我正在寻找Javascript特定的解决方案,没有JQuery或第三方实现.

更新:虽然所提出的大部分内容存在严重的局限性和可用性问题,但// @grant window.close在脚本标题中使用的最新建议(特定于TamperMonkey)通常会在通常无法处理close方法的选项卡上执行此操作.虽然不完全理想,并没有针对每种情况推广,但在我的情况下,这是一个很好的解决方案.

Bro*_*ams 178

普通的javascript无法关闭Windows willy-nilly.这是一个安全功能,不久前介绍,以阻止各种恶意攻击和烦恼.

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

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

  • 相应的浏览上下文A可关闭脚本的.
  • 现任脚本的浏览器上下文是熟悉的浏览器上下文一个.
  • 现任脚本的浏览器上下文允许导航浏览器上下文一个.

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

这意味着,除了一个小例外,不得允许javascript关闭未被同一个javascript打开的窗口.

Chrome允许该异常 - 它不适用于用户脚本 - 但Firefox不支持. Firefox实施平台说明:

仅允许为使用该window.open方法的脚本打开的窗口调用此方法.


如果您尝试使用window.closeGreasemonkey/Tampermonkey/userscript,您将获得:
Firefox:错误消息," Scripts may not close windows that were not opened by script."
Chrome:只是默默地失败.



长期解决方案:

解决此问题的最佳方法是改为使用Chrome扩展程序和/或Firefox插件. 这些可以可靠地关闭当前窗口.

但是,由于window.closeGreasemonkey/Tampermonkey脚本所带来的安全风险要小得多; Greasemonkey和Tampermonkey可以合理地在他们的API中提供这种功能(基本上为您打包扩展工作).
考虑发出功能请求.



黑客的解决方法:

Chrome 目前很容易受到"自我重定向"攻击.所以像这样的代码一般用于工作:

open(location, '_self').close();
Run Code Online (Sandbox Code Playgroud)

这是有缺陷的行为,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);
Run Code Online (Sandbox Code Playgroud)

感谢zanetu的更新.请注意,如果只打开一个选项卡,则无效.它只关闭其他标签.


Firefox可以抵御这种攻击.因此,唯一的javascript方法是一次性删除一个浏览器的安全设置.

你可以打开about:config并设置
allow_scripts_to_close_windowstrue.

如果您的脚本仅供个人使用,请继续执行此操作.如果你要求其他人改变这种设置,那么他们就会变得聪明,并且有理由拒绝偏见.

目前没有Chrome的等效设置.

  • 嘿,我的朋友,很高兴终于听到你的消息.只是一个注释,在Fx上你可以通过将`dom.allow_scripts_to_close_windows; false`翻转为'true`来绕过这个限制,但我想在Chrome中没有黑客攻击源/重建这就是我现在的方式.我知道并且已经与TM开发人员进行了交谈,并且在最近的alpha/beta中我们将其作为兼容性选项(脚本的设置)以中间人的方式运行,起作用.我觉得没有干净的解决方案,可惜. (3认同)
  • 如果有人遇到window.close或浏览器之间的特定行为差异,请仔细阅读这个答案 - 它确实拥有所有正确的信息. (3认同)
  • 如果你将`@ grant`设置为'none`以外的值,`window.close()`将在Tampermonkey中工作.见[this thread](https://forum.tampermonkey.net/viewtopic.php?f=17&t=1305). (2认同)

swc*_*ool 31

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

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

根据我的观察,此更新修复了使用window.close()关闭弹出窗口的问题.当它失败时,你会在控制台中看到这个,"脚本可能只关闭它打开的窗口." 这意味着hacky解决方法(Brock Adams的答案)可能在最新版本中不起作用.

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

window.open('', '_self', '');
window.close();
Run Code Online (Sandbox Code Playgroud)

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

chrome.windows.remove(integer windowId, function callback)
Run Code Online (Sandbox Code Playgroud)

删除它的方法.可以在chrome.windows中找到Chrome扩展程序窗口API .

实际上我的Chrome扩展程序MarkView正面临这个问题,我不得不更新我的代码,使其适用于此Chrome更新.顺便说一下,MarkView是读取和编写Awesome Markdown文件的工具,它提供的功能包括内容大纲,可排序表和带行号的代码块语法高亮.

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

  • 正确的破解方法是`open(location,'_self')。close();`-注意使用`open()`返回值。仍适用于Chrome`36.0.1985.125 m` (2认同)

bal*_*ing 18

现在你可以使用tampermonkey

// @grant        window.close
Run Code Online (Sandbox Code Playgroud)

然后只需打电话

window.close();
Run Code Online (Sandbox Code Playgroud)

  • 就像一个注释:在Greasemonkey 3.10中不适合我 (2认同)

Jef*_*ton 15

我正在使用Brock Adams发布的方法,它甚至适用于Firefox,如果它是用户启动的话.

open(location, '_self').close();
Run Code Online (Sandbox Code Playgroud)

我是通过按下按钮调用它,因此它是用户启动的,并且使用Chrome 35-40,Internet Explorer 11,Safari 7-8和ALSO Firefox 29-35仍然可以正常工作.我使用Windows 8.1和Mac OS X 10.6,10.9和10.10的版本进行了测试,如果不同的话.


完整的代码:

HTML:

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

JavaScript的:

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

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

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

  • 不知何故,这对我不起作用。无论是在 Firefox 30 上还是在 Chrome 37 上都没有。它所做的只是使页面变成空白(非常奇怪的行为)。我的代码是 `&lt;button onclick="open(location,'_self').close()" &gt;关闭窗口&lt;/button&gt;`。我做错了什么吗?在我看来,这也是用户发起的。请注意,如果使用“&lt;button&gt;”或“&lt;input type="button"&gt;”,我会得到相同的结果。 (3认同)

Min*_*ter 10

许多人仍在尝试使用javascript找到关闭Chrome浏览器的方法.以下方法仅适用于您使用Chrome作为APP启动器 - 例如自助服务终端!

我测试了以下内容:

我正在使用以下扩展名:关闭自助服务终端

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

window.location.href = '/closekiosk';
Run Code Online (Sandbox Code Playgroud)

我希望能帮到某个人,因为这是我找到的唯一可行的解​​决方案.

注意:扩展程序似乎在后台运行,并添加了Chrome托盘图标.它选中了以下选项:"让Chrome在后台运行"(或类似文字).你可能需要玩它,直到它适合你.我取消选中它,现在它工作得很好!


Gar*_*eth 8

尽管认为它"显然是假的",但你所说的"似乎是一种信念"实际上是正确的.window.close的Mozilla文档说

仅允许对使用window.open方法由脚本打开的窗口调用此方法.如果脚本未打开窗口,则JavaScript控制台中将显示以下错误:脚本可能无法关闭脚本未打开的窗口

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


Dfr*_*Dkn 7

以下代码对我有用-

window.open('location', '_self', '');
window.close();
Run Code Online (Sandbox Code Playgroud)

Chrome 43.0.2357.81上测试

  • 对我来说,它只是用 /location 处的窗口替换了当前窗口。 (10认同)
  • 无法在最新的 chrome 中工作 - 版本 61.0.3163.100(官方版本)(64 位) (2认同)

Ger*_*bdo 6

我找到了一种适合我的新方法

var win = window.open("about:blank", "_self");
win.close();
Run Code Online (Sandbox Code Playgroud)

  • 这个坑看起来已经被填平了。我不知道什么时候开始,但我正在使用最新的开发版本 84.x。空白页面加载但关闭不会触发。 (4认同)

归档时间:

查看次数:

499181 次

最近记录:

6 年 前