如何在浏览器窗口中关闭当前标签页?

597
我希望在网页上创建一个链接,点击该链接可以关闭浏览器中当前激活的标签页而不关闭其他标签页。当用户单击关闭链接时,应出现一个警告消息,提示用户确认是否关闭,提供两个按钮,“是”和“否”。如果用户单击“是”,则关闭该页面;如果单击“否”,则不执行任何操作。
如何实现?有什么建议吗?

2
我可能来晚了,但浏览器有其防止的原因。<br><br> 想象一下你一遍又一遍地试图关闭一个窗口,但它不会关闭,因为它正在执行你问题中的“如果没有”的部分,即“什么也不做”。<br><br> 这肯定会让人恼火! - Muhammad Osama
不可能的。请阅读此内容:https://dev59.com/2WIj5IYBdhLWcg3w6JHU#19768082 - iamandrewluca
对于任何试图以编程方式关闭选项卡的人,我有两件事要补充(TL:DR;) 1 您只能关闭使用JavaScript打开的选项卡(如Ryan Joy所提到的)。 2,这里没有提到:只有当window.top.opener(“父”窗口)不为null时,您才能关闭选项卡。 - Nico
windows.close()在Angular中无法正常工作。它会给我一个警告:脚本只能关闭由它们打开的窗口。 - Margi212
您想关闭的页面,请粘贴以下代码:<a href="JavaScript.windows.close()"> 关闭</a>。 - Omid Shagiwal
23个回答

666
您需要使用JavaScript来完成此操作。使用window.close()
close();

注意:当前选项卡是隐含的。以下代码与其等效:

window.close();

或者你可以指定一个不同的窗口。

所以:

function close_window() {
  if (confirm("Close Window?")) {
    close();
  }
}

使用 HTML:

<a href="javascript:close_window();">close</a>

或:

<a href="#" onclick="close_window();return false;">close</a>

在这里使用 return false 可以防止事件的默认行为。否则,浏览器将尝试跳转到该URL(显然不存在的URL)。

现在,window.confirm() 对话框中的选项将是“确定”和“取消”,而不是“Yes”和“No”。如果你真的想要“Yes”和“No”,你需要创建一些模态JavaScript对话框。

注意: 上述内容存在浏览器特定的差异。如果你使用Javascript(通过window.open())打开窗口,则可以使用javascript关闭窗口。Firefox禁止关闭其他窗口。我相信IE会询问用户是否确认。其他浏览器可能会有所不同。


525
JavaScript无法关闭任何标签页。“只有通过使用window.open方法生成的脚本打开的窗口才允许调用此方法。”换句话说,您只能使用JavaScript关闭由JavaScript生成的窗口/标签页。 - Ryan Joy
9
无法在Chrome 30 PC上运行,其他答案显示要在当前标签页中打开一个窗口,然后关闭它才能工作。 - markasoftware
3
在Firefox中,在“about:config”中设置“dom.allow_scripts_to_close_windows = true”可能是解决方案(但可能存在很大的安全风险!) - Nepomuk Pajonk
9
浏览器不允许这种行为。JavaScript 只能关闭由它打开的选项卡。 - Edward Kennedy
2
这个代码至少在Chrome 62中可以工作: <button type="button" onclick="window.open('', '_self', ''); window.close();">Discard</button> 另请参阅此文章 - hering
显示剩余14条评论

267

试试这个

<a href="javascript:window.open('','_self').close();">close</a>

3
在Firefox 31.0中工作。 - Adrian Carr
2
这种解决方案的不足之处在于会向服务器发送一个get请求。但另一方面,我没有找到其他的解决方案。 - 100r
41
在Chrome控制台中执行此操作,会输出“脚本只能关闭由它打开的窗口”的提示。 - parliament
2
在chrome 60.0.3079.0中无法工作: "脚本只能关闭由它打开的窗口。" - Our_Benefactors
3
<a href="javascript:window.open(location, '_self').close();">关闭</a> - warfish
显示剩余7条评论

66

这种方法适用于Chrome和IE:

<a href="blablabla" onclick="setTimeout(function(){var ww = window.open(window.location, '_self'); ww.close(); }, 1000);">
    If you click on this the window will be closed after 1000ms
</a>

65
更加通俗易懂的翻译:用以下代码关闭当前页面:open(location, '_self').close(); - uınbɐɥs
4
这在IE 11上运行良好,但在Chrome 38中无法运行。 - Yann Duran

44
据我所知,Chrome或FireFox已经不再支持该功能。至少在Edge之前的IE版本中仍可能存在该功能。

3
这段代码至少能在Chrome 62中使用: <button type="button" onclick="window.open('', '_self', ''); window.close();">Discard</button> 参见此文章 - hering
1
@hering 嗯,这篇文章是2006年的,但如果你找到了一些有效的东西,那是个好消息,也许会帮助那些一直读到这里的人。谢谢你分享。 - Guy Schalnat
问题是关于如何从当前活动选项卡中关闭该选项卡。正如您所说,在Chrome或Firefox中不可能实现。这应该是被接受的答案。 - decates

34
抱歉打扰了,但我最近在实施一个本地托管的网站时,发现需要关闭当前浏览器标签页的功能,并找到了一些有趣的解决方法,这些方法在我所能找到的任何地方都没有很好地记录。
注意:这些解决方法是针对本地托管的网站而设计的,除了Edge浏览器外,还需要特定的浏览器配置。未经配置的浏览器(通常用于公共托管的网站)功能有限。

背景:

过去,jQuery脚本window.close()能够在大多数浏览器上无问题地关闭当前标签页。然而,现代大多数浏览器不再支持这个脚本,可能是出于安全原因。

当前功能:

window.close()将在由脚本打开的标签页上工作,或者由带有target="_blank"的锚点(在新标签页中打开)打开,无需任何额外的设置或配置。

请参考@killstreet对@calios回答的评论


特定浏览器的解决方法:

Google Chrome:

Chrome不允许运行window.close()脚本,如果你尝试使用它,什么都不会发生。然而,通过使用Chrome插件TamperMonkey,我们可以使用window.close()方法,只要在TamperMonkey的UserScript头部包含// @grant window.close

例如,我的脚本(当点击id为'close_page'的按钮并在浏览器弹出窗口上按下'yes'时触发)如下所示:

// ==UserScript==
// @name         Close Tab Script
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Closes current tab when triggered
// @author       Mackey Johnstone
// @match        http://localhost/index.php
// @grant        window.close
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==

(function() {
    'use strict';
    $("#close_page").click(function() {
        var confirm_result = confirm("Are you sure you want to quit?");
        if (confirm_result == true) {
            window.close();
        }
    });
})();

注意:此解决方案只能在不是最后一个打开的标签页时关闭该标签页。具体来说,如果关闭该标签页会导致窗口关闭,则无法关闭该标签页。

Firefox:

Firefox有一个高级设置,您可以启用它来允许脚本关闭窗口,从而有效地启用window.close()方法。要启用此设置,请转到about:config,然后搜索并找到dom.allow_scripts_to_close_windows首选项,并将其从false更改为true。

这样您就可以像使用其他脚本一样,在您的jQuery文件中直接使用window.close()方法。

例如,当首选项设置为true时,此脚本可以完美运行:

<script>
  $("#close_page").click(function() {
    var confirm_result = confirm("Are you sure you want to quit?");
    if (confirm_result == true) {
      window.close();
    }
  });
</script>

这个方法比Chrome的解决方案要好得多,因为它允许用户关闭当前标签页,即使它是唯一打开的标签页,而且不需要第三方插件。然而,唯一的缺点是它也允许其他网站运行这个脚本(不仅限于你打算在哪个网站上使用),所以可能存在安全隐患,尽管我无法想象关闭当前标签页会有多么危险。

Edge:

令人失望的是,Edge实际上在我尝试的所有3个浏览器中表现最好,并且在不需要任何配置的情况下与window.close()方法配合使用。当运行window.close()脚本时,会弹出一个额外的弹窗警告您当前页面正在尝试关闭当前标签,并询问您是否要继续。

编辑: 这是在基于Chromium之前的旧版Edge上进行的测试。我没有测试过,但想象它在基于Chromium的版本上的行为应该类似于Chrome。

MS Edge close tab confirm box


最后说明:Chrome和Firefox的解决方案都是对浏览器故意禁用的某些功能的变通方法,可能出于安全考虑。它们都需要用户事先配置浏览器以实现兼容性,因此对于面向公众使用的网站来说可能不太可行,但对于像我这样的本地托管解决方案则非常理想。

18

这是可能的。我在整个网络上搜索了这个问题,但当我参加微软的一项调查时,终于得到了答案。

试试这个:

window.top.close();

这将会关闭当前的选项卡。


30
脚本只能关闭由它打开的窗口。 - Google Chrome 50。 - Husky

13

以下内容适用于Chrome 41:

function leave() {
  var myWindow = window.open("", "_self");
  myWindow.document.write("");
  setTimeout (function() {myWindow.close();},1000);
}

我尝试了几个关于 FF 的想法,包括打开一个实际的网页,但似乎没有什么用。据我所知,如果通过 JS 真正地 打开了一个标签或窗口,那么任何浏览器都会使用 xxx.close() 关闭它,但至少 FF 无法通过在标签内部打开新内容来欺骗关闭一个标签。

当你考虑这一点时,这是有道理的 - 用户可能不想让 JS 关闭具有有用历史记录的标签或窗口。


Chrome: '未捕获的类型错误:无法设置空值的innerHTML属性' - Francisco Corrales Morales
给出了积极的评价。尽管由于某些细节而不赞成使用document.write,但在我谦虚的观点中,这仍然是一个很好的答案。 提出的替代方案(document.createElement,.createTextNode,.innerHTML)不如此简洁,这为我们提供了向用户传达信息的机会。我将提供一个没有document.write的答案。 最诚挚的问候 - Ramon Maldio

12

window.close()在2k21中无法工作,因为脚本只能关闭它们打开的窗口。

但是如果标签页不是手动打开而是自动打开的话 - 那么window.close()就可以工作了。

自动方式(当close()可以使用时):

  • <a href="/close" target="_blank">浏览器将在新标签页中打开地址,这个标签页可以用close()关闭
  • 当从另一个应用程序打开新浏览器标签页时(例如你在 Telegram/Whatsup/Outlook 中点击链接),操作系统会打开一个新标签页,可以用close()关闭
  • 当你用window.open('ya.ru')打开网站时 - 可以用close()关闭

手动方式(当它不起作用时):

  • 当你打开新的浏览器并输入地址。
  • 当你点击(+)打开新标签页并输入地址

10

对于仍在访问此页面的用户,您只能关闭由脚本打开的标签页或使用HTML的带有目标_blank的锚点标签。这两种情况都可以使用

<script>
    window.close();
</script>

1
这在每个现代浏览器中都可以工作。IE11和Edge 17会显示一个确认警告,但仍然可以工作。 - Fabian von Ellerts
我在尝试让Angular应用程序从Adfs注销时遇到了困难。不知道关闭选项卡是否是最终注销的方法。我将尝试使用这个片段。 - Tore Aurstad

9

也可以尝试这个。在三种主要的浏览器上都适用于我。

<!-- saved from url=(0014)about:internet -->
<a href="#" onclick="javascript:window.close();opener.window.focus();" >Close Window</a>

很多其他技巧对我来说都不起作用,但这个可以。我正在使用 Google Chrome 版本88.0.4324.182(官方构建)(64位) - Leroy
在Chrome 96中无法工作 - Hugh Perkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接