我想在网页上创建一个链接,将关闭浏览器中当前活动的选项卡,而不关闭浏览器中的其他选项卡。当用户单击关闭链接时,将出现一条警告消息,要求用户使用“YES”和“NO”两个按钮确认。如果用户单击“是”,关闭该页面,如果“否”,什么都不做。

怎样才能做到呢?有什么建议吗?


当前回答

不好意思,我最近实现了一个本地托管的站点,它需要关闭当前浏览器选项卡的能力,并发现了一些有趣的变通方法,这些方法在我能找到的任何地方都没有很好的记录,所以我自己去做了。

注意:这些解决方案都是在本地托管站点的情况下完成的,并且(Edge除外)需要专门配置浏览器,因此对于公共托管站点来说并不理想。



背景:

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

当前功能:

Window.close()将适用于由脚本打开的标签,或由target="_blank"(在新标签中打开)的锚点打开的标签

参见@killstreet对@calios的回答的评论


浏览器特定的解决方案:

谷歌Chrome:

Chrome不允许window.close()脚本被运行,如果你尝试使用它什么也不会发生。通过使用Chrome插件TamperMonkey,我们可以使用window.close()方法,如果你包含// @grant窗口。关闭TamperMonkey的UserScript头文件。

例如,我的脚本(当一个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实际上是我尝试过的所有3个浏览器中表现最好的,并且使用window.close()方法而不需要任何配置。当window.close()脚本运行时,一个额外的弹出窗口提醒您页面正在尝试关闭当前选项卡,并询问您是否想继续。

编辑: 这是在旧版本的边缘不是基于铬。我还没有测试过它,但可以想象它的功能与基于铬的Chrome版本类似


最后提醒:Chrome和Firefox的解决方案都是浏览器故意禁用的,可能是出于安全原因。它们也都要求用户事先配置浏览器以使其兼容,因此可能不适用于公共站点,但对于像我这样的本地托管解决方案非常理想。

其他回答

window.close()在2k21中不起作用,因为脚本可能只关闭由它们打开的窗口。

但是如果标签在浏览器中不是手动打开的,而是自动打开的,那么window.close()就可以工作了。

自动(当close()工作时):

<a href="/close" target="_blank">浏览器将在新选项卡中打开地址,该选项卡可以用close()关闭 当新的浏览器标签从另一个应用程序打开(当你点击一个链接在Telegram/Whatsup/Outlook等)-操作系统将打开新的标签,它可以关闭close() 当你用window.open('ya.ru')打开时,当然可以用close()关闭它

手动(当它不工作时):

当你打开新的浏览器并输入地址。 当您单击(+)打开新选项卡,并键入地址

据我所知,在Chrome或FireFox中已经不可能了。这在IE中仍然是可能的(至少在edge之前)。

这是可能的。我搜索了整个网络,但有一次当我做微软的一项调查时,我终于得到了答案。

试试这个:

window.top.close();

这将为您关闭当前选项卡。

由于严格的浏览器行为,window.close()只有在通过window.open(…)打开时才会工作。

但我想了个办法!

当没有包含window.open(…)时,添加一个空标签 当关闭的最佳时间出现时,调用window.close 如果2。已经返回一个错误,替换任何标签或HTTP参数与一个空的标签,最后关闭窗口

<button onclick="myFunction()">Close</button>
<script>
if (location.href.indexOf("#") == -1) {
    window.open(location.href + "#", "_self")
}

function myFunction() {
  try {
    window.close()
  } catch (err) {
    window.open(location.href.substring(0, location.href.indexOf("?")).substring(0, location.href.indexOf("#")) + "#", "_self")
    window.close()
  }
}
</script>

在这个现场演示中输入关闭

有点晚了,但这是我发现的……

window.close()将只工作(IE是一个例外)当你试图关闭()的窗口是由脚本使用window.open()方法打开的。

(请参阅下面@killstreet关于target _blank的锚标签的评论)

TLDR: chrome和firefox允许关闭它们。

你会得到控制台错误: 脚本不能关闭非脚本打开的窗口。 只是一个错误而已。

你可以在URL中添加一个唯一的参数来知道页面是否从脚本打开(比如时间)-但这只是一个黑客,而不是一个本地功能,在某些情况下会失败。

我找不到任何方法知道页面是否从open()打开, 并且close不会抛出和错误。 这将不会打印"test":

try{
  window.close();
}
catch (e){
  console.log("text");
}

你可以在MDN中阅读更多关于close()函数的信息