Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript window.close和self.close请勿在Chrome中关闭窗口_Javascript_Google Chrome_Greasemonkey_Tampermonkey - Fatal编程技术网

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或第三方实现


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

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

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


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

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

发件人:

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

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

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

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

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

如果尝试从Greasemonkey/Tampermonkey/userscript使用window.close,您将获得: Firefox:错误消息是,脚本可能无法关闭未由脚本打开的窗口。 Chrome:只是默默地失败了

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

但是,由于window.close带来的安全风险对于Greasemonkey/Tampermonkey脚本来说要小得多;Greasemonkey和Tampermonkey可以在其API中合理地提供此功能,基本上为您打包扩展工作。 考虑制作一个特征请求。< /P> 骇人的解决办法: Chrome当前易受自我重定向攻击。所以像这样的代码通常都是有效的:

open(location, '_self').close();
国际海事组织称,这是一种有缺陷的行为,截至2015年4月,该行为基本上被封锁。只有当选项卡刚刚打开并且在浏览历史记录中没有页面时,它才能从注入的代码中工作。所以它只在非常小的情况下有用

然而,ChromeV43和v44加上v3.11或更高版本仍然可以使用一个变体。使用显式@grant和普通window.close。例如:

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

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

您可以打开about:config和set 允许\u脚本\u关闭\u窗口为true

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

目前没有Chrome的等效设置。

此功能的要求:

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

如果您在我的启动程序中看不到它工作,则需要发布您的浏览器、设备和版本。不同版本的浏览器在不同的设备上的行为不同。比如ipad上的Firefox和Chrome,它们并不是他们所说的那样。他们是不同肤色的狩猎者

因此,说“我正在使用iOs 14.5的iPad上使用Safari 10.14”是很重要的,这样我就可以为您研究并发布结果以帮助其他用户。提前谢谢你这么做。如果您使用启动器,并且它在我的示例中对您起作用,那么它就起作用了

我使用的是Brock Adams发布的方法,它甚至可以在Firefox中使用,如果用户通过按钮或链接从另一个窗口启动它的话

open(location, '_self').close();
我通过按下按钮来调用它,因此它是由用户启动的,使用Chrome90、InternetExplorer11、Edge、Safari7-10以及Firefox35和88,它仍然可以正常工作。我使用8.1和10版本的Windows和Mac OS X 10.6、10.9和10.10和10.14进行了测试,如果这两个版本不同的话

自动关闭的页面上的窗口代码

要在用户打开的可自行关闭的窗口上使用的完整代码:

window_to_close.htm

JavaScript:

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

    return false;
}
HTML:

HTML:

Chrome修复了36.0.1985.125版的安全问题 Chrome 36.0.1985.125 2014年7月16日,星期三

根据我的观察,此更新修复了使用window.close关闭弹出窗口的问题。当它失败时,您将在控制台中看到这一点,脚本可能只关闭它打开的窗口。。这意味着布罗克·亚当斯的答案在最新版本中可能不起作用

因此,在之前发布的Chrome版本中,下面的代码块可能会工作,但不会与此更新一起工作

window.open('', '_self', '');
window.close();
对于此更新,您必须相应地更新代码以关闭弹出窗口。解决方案之一是获取弹出窗口id并使用

chrome.windows.remove(integer windowId, function callback)
方法将其删除。Chrome扩展windows API可在上找到

事实上,我的chrome扩展正面临着这个问题,我必须更新我的代码,使其能够在这次chrome更新中工作。顺便说一句,MarkView是一个读写很棒的标记文件的工具,它提供了一些功能,包括内容大纲、可排序表和代码块语法突出显示行号


我还创建了,欢迎发表任何评论。

许多人仍在尝试使用javascript关闭Chrome浏览器。以下方法仅在您使用Chrome作为应用程序启动程序(例如kiosk)时有效

我已测试了以下各项:

我正在使用以下扩展:

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

window.location.href = '/closekiosk';
我希望这能帮助一些人,因为这是我找到的唯一有效的解决办法


注意:该扩展似乎在后台运行,并添加了一个Chrome托盘图标。它选中了以下选项:让Chrome在背景或类似文本中运行。你可能需要玩它,直到它为你工作。我检查了它,现在它工作得很好

这可能很古老,但让我们来回答它


我使用top.close关闭选项卡。window.close或其他open…close对我不起作用。

我找到了一种新方法,它能很好地为我工作

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

下面的代码对我有用-

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

在Chrome 43.0.2357.81上测试,仅当您使用window.open打开新窗口时,新窗口才能使用我上面提到的代码关闭。这非常适合我:注意:永远不要使用href在新选项卡中打开页面。Window.close不能与href一起使用。改为使用window.open。

在tampermonkey中尝试类似这样的操作onclick=return self.close

现在您可以使用

// @grant        window.close
然后打个电话就行了

window.close();

在我的例子中,页面需要关闭,但可能已被链接打开,因此window.close将失败

我选择的解决方案是发出window.close,然后是一个window.setTimeout,它重定向到另一个页面

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
这样,如果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>

我想分享我对这个问题的解决方案。我们中的大多数人似乎都试图在标准浏览器会话中关闭浏览器窗口,用户在访问其他网站之后,在访问更多网站之前,访问某个或另一个网站

然而,我的情况是,我正在为一台设备构建一个web应用程序,这实际上是该设备唯一能做的事情。你启动它,它启动Chrome并导航到我们的应用程序。它甚至没有连接到互联网,它与之对话的任何服务器都在我们本地的Docker容器上。用户需要一种方法来关闭应用程序(又称close Chrome),这样他们就可以访问终端执行系统操作 更新

因此,它启动,在kiosk模式下启动Chrome,并且已经在正确的地址启动。这很容易满足规范中的第二个选项:

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

因此,只需从我的kiosk应用程序中调用window.close即可

对于猴子:

@grant window.close 

Ref:

如果无法关闭脚本未打开的窗口,则可以使用以下代码销毁页面:

 document.getElementsByTagName ('html') [0] .remove ();


window.close在铬合金中对我有效。@GårÐåñ:嗯,不,不是。这与语言无关。这是一个由浏览器实现的功能。如果你能写一个简单的例子来说明window.close是如何工作的,我认为这可能比说它不工作更有帮助。我给了你两个例子。卫报,给你解释一下,这是不恰当的javascript。试着关闭窗口,它就会工作。close只是一个变量名,不会调用函数,至少在Chrome37中测试时不会。当我将您的示例更改为window.close时,它在chrome 37中起作用。GårÐååñ@George所说的没有意义,除非我完全误解了这个词的含义。他正确地指出,示例中的javascript中存在语法错误,如果应用程序代码中存在相同的错误,那么这很可能就是问题的原因。然而,如果这些只是你例子中的拼写错误,那么你应该纠正这些拼写错误以得到更好的答案。嘿,我的朋友,很高兴终于收到你的来信。请注意,在Fx上,您可以通过翻转dom绕过该限制。允许\u脚本\u关闭\u窗口;假到真,但我想Chrome中没有任何东西是不经过源代码/重建的,这就是我现在如何绕过它的。我知道并与TM开发人员进行了交谈,在最近的alpha/beta版中,我们将其作为脚本的兼容性选项设置,以“中间人”风格运行。遗憾的是,我想除了黑客攻击,我们没有干净的解决方案。如果有人在window.close或浏览器之间的特定行为差异方面遇到问题,请仔细阅读此答案-它确实包含所有正确的信息。有没有办法检查窗口是否是通过脚本打开的?我需要显示/隐藏一个后退按钮,我不想使用hack,谢谢编辑:window.opener==null因为Chrome 36.0.1985.125 2014年7月16日,星期三,hack解决方案可能不起作用,详细信息请参见我的答案。window.close将在Tampermonkey中工作,如果您将@grant设置为非none的值。请参阅。忘记用户启动的异常;抢手货但我认为大多数用户脚本编写者希望完全自动操作。他们已经有了一个方便的、由用户发起的关闭机制——右上角的小X^_^不知怎么的,这对我不起作用。Firefox30和Chrome37都没有。它所做的只是让页面变成空白,真是奇怪的行为。我的代码是关闭窗口。我是不是做错了什么?在我看来,这也是用户发起的。请注意,如果我使用a或an,我会得到相同的结果。@YumYumYum感谢您的帖子,bitbucket.org最近将链接更改为bitbucket.io-现在在答案中修复了在页面上有一个关闭窗口的按钮对我有效。不起作用的是:打开窗户,“你自己”;窗口关闭;但它与openlocation一起工作,“自我”关闭;正确的破解方法是openlocation,“_self”.close;-注意open返回值的用法。这仍然适用于Chrome 36.0.1985.125分钟我的情况下,我只是用openlocation再次测试,“_self.”关闭;,我在这件事上犯了未经授权的错误。此错误与“window.close”不同。此脚本上的警告可能仅关闭由其打开的窗口。。它看起来像openlocation,“\u self.close;”向前推进了一点,但在我的情况下无法完成。感谢@brock adams的评论。我有打字脚本,当我放置chrome.windows.remove时,它说找不到chrome符号。我如何解决这个问题?我需要添加某种引用吗?@devt chrome.windows.remove是chrome扩展API,您的javascript应该被您的chrome扩展程序识别。您可以在background.js中尝试,在您的chrome扩展manifest.json中您需要:background:{scripts:[background.js],…},我已经删除了供用户自由访问的登录功能。因此,我上面提到的示例现在不可用。这还受到脚本可能无法关闭脚本未打开的窗口的影响。其他答案中提到的问题。请给出答案。请不要只在你的答案上讨论这个问题。你能添加你的Chrome版本吗?我的Chrome版本是43.0.2357.81。对我来说,它只是用位于/位置的窗口替换了当前窗口。@alianos-对我来说也是。不是
使用最新的chrome版本61.0.3163.100官方版本64 bitIt只是取代了curren窗口。没有了。我已经证实,这在很多情况下都是有效的,但偶尔也会出现顽固的情况,但总比什么都没有好,谢谢。我将把它添加到帖子中。正如一个注释:不在Greasemonkey 3.10中为我工作,你可以添加正确的说明如何做,我是新加入TamperMonkey的。这是2017年,我仍然收到脚本可能无法关闭未被脚本打开的窗口的错误。IE 11的确认按钮的不错的破解。在Chrome和Firefox上工作。这个漏洞看起来已经被填补了。我不知道什么时候,但我正在使用最新的dev build 84.x。空白页加载,但关闭不火。虽然这可能在理论上回答这个问题,包括这里的答案的主要部分,并提供链接以供参考。有趣的方法,将给出一个测试时,我可以看到。不要忘记破坏你的脚本too如何销毁脚本?所有这一切都是明确的窗口,但不关闭该选项卡。感谢您分享有关kiosk模式的一些知识。我可以确认它的工作!这正是我真正想要的。
@grant window.close 
 document.getElementsByTagName ('html') [0] .remove ();