Javascript window.close和self.close请勿在Chrome中关闭窗口

Javascript window.close和self.close请勿在Chrome中关闭窗口,javascript,google-chrome,greasemonkey,tampermonkey,Javascript,Google Chrome,Greasemonkey,Tampermonkey,问题是,当我调用window.close()或self.close()时,它不会关闭窗口。现在人们似乎相信,在Chrome中,你不能用脚本关闭任何非脚本创建的窗口。这显然是错误的,但无论如何,它应该仍然这样做,即使它需要弹出一个警报来确认。这些都没有发生 那么,有没有人有真正的、功能性的、经过验证的方法来关闭一个窗口,比如使用javascript:window.close()或javascript:self.close()关闭一个窗口,它确实做到了预期的效果,并且在每一个非基于Chrome的浏览

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

那么,有没有人有真正的、功能性的、经过验证的方法来关闭一个窗口,比如使用
javascript:window.close()
javascript:self.close()
关闭一个窗口,它确实做到了预期的效果,并且在每一个非基于Chrome的浏览器中都能正常运行?任何建议都将不胜感激,我正在寻找Javascript特定的解决方案,而不是JQuery或第三方实现

更新:虽然很多建议都存在严重的局限性和可用性问题,但最新的建议(针对TamperMonkey)使用脚本标题中的
/@grant window.close
通常会在通常无法处理close方法的选项卡上起作用。虽然这并不完全理想,也不适用于所有情况,但对我来说,这是一个很好的解决方案。

尽管我认为这“显然是错误的”,但你所说的“似乎是一种信念”实际上是正确的。Mozilla的文档说

仅允许对使用window.open方法的脚本打开的窗口调用此方法。如果窗口不是由脚本打开的,则JavaScript控制台中会出现以下错误:脚本可能无法关闭非由脚本打开的窗口


你说它“应该仍然这样做”,但我认为你找不到任何支持这一点的参考资料,也许你记错了什么?

普通javascript无法随意关闭windows。这是一种安全功能,不久前引入,用于阻止各种恶意攻击和骚扰

发件人:

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

  • 相应的浏览上下文是脚本可关闭的
  • 现任脚本的浏览上下文熟悉浏览上下文A
  • 允许现任脚本的浏览上下文导航浏览上下文A
如果浏览上下文是由脚本创建的辅助浏览上下文(而不是由用户的操作创建的),或者如果它是会话历史记录仅包含一个文档的浏览上下文,则可以使用脚本关闭浏览上下文

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

Chrome允许这种例外——它不适用于用户脚本——但Firefox不允许

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


如果您尝试使用
窗口。从Greasemonkey/Tampermonkey/userscript关闭
,您将得到:
Firefox:错误消息“
脚本可能无法关闭未由脚本打开的窗口。

Chrome:只是默默地失败了



长期解决办法: 处理这个问题的最好方法是制作一个Chrome扩展和/或Firefox插件。这些可以可靠地关闭当前窗口

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



骇人的解决办法: Chrome当前易受“自我重定向”攻击。所以像这样的代码通常都是有效的:

open(location, '_self').close();
国际海事组织称,这是一种有缺陷的行为,现在(大约2015年4月)大部分被阻止。如果选项卡是新打开的,并且在浏览历史记录中没有页面,它仍然可以从注入的代码工作。所以它只在非常小的情况下有用

但是,一个变体仍然适用于Chrome(v43和v44)和Tampermonkey(v3.11或更高版本)。使用显式的
@grant
和普通的
窗口。关闭()。例如:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);
谢谢你的更新。请注意,如果只有一个选项卡处于打开状态,则此操作将不起作用。它只关闭其他选项卡


Firefox对该漏洞是安全的。因此,唯一的javascript方法是禁用安全设置,一次一个浏览器

您可以打开
about:config
并设置
允许脚本\u关闭\u窗口
true

如果您的脚本是供个人使用的,请继续并这样做。如果你要求其他人打开这个设置,他们会明智而有理由带着偏见拒绝


目前没有Chrome的等效设置。

此功能的要求:

您必须从窗口启动器打开窗口/选项卡,才能获得javascript句柄使其工作,因为它并不总是在未通过窗口启动器脚本打开的选项卡上工作。此测试页面显示了如何:

如果您在我的启动程序中看不到它工作,则需要发布您的浏览器、设备和版本。不同版本的浏览器在不同的设备上的行为不同。(比如ipad上的Firefox和Chrome,它们并不是他们所说的那样。它们是具有不同外观的Safari!)

因此,有一点很重要,比如说“我在使用iOs 14.5的iPad上使用Safari 10.14”,所以
open(location, '_self').close();
function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}
<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />
function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}
<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />
window.open('', '_self', '');
window.close();
chrome.windows.remove(integer windowId, function callback)
window.location.href = '/closekiosk';
var win = window.open("about:blank", "_self");
win.close();
window.open('location', '_self', '');
window.close();
// @grant        window.close
window.close();
window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
<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>
@grant window.close 
 document.getElementsByTagName ('html') [0] .remove ();