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

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


当前回答

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

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()函数的信息

其他回答

此方法适用于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>

在FF 18和Chrome 24测试成功:

插入头部:

<script>
    function closeWindow() {
        window.open('','_parent','');
        window.close();
    }
</script> 

HTML:

<a href="javascript:closeWindow();">Close Window</a>

感谢马科斯·j·德雷克。

可以保证在未来的任何浏览器中都不允许关闭选项卡。使用上面提到的脚本是行不通的。

我的解决方案是使用Chrome扩展。一个Chrome扩展可以要求标签操作权限,所以它将很容易处理任何标签从该扩展的内容脚本是活跃的领域关闭。

下面是背景脚本的样子:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    console.log(sender)
    console.log(message)
    if(message.closeThis) {
        closeTab(sender.tab.id)
    }
});

const closeTab = id => {
    console.log("Closing tab");
    chrome.tabs.remove(id);
}

内容脚本应该是这样的:

window.addEventListener("message", (event) => {
    // Only accept messages from ourselves
    if (event.source !== window)
        return;

    if (event.data.type && (event.data.type === "APPLICATION/CLOSE")) {
        console.log("Content script received APPLICATION/CLOSE event");
        chrome.runtime.sendMessage({closeThis: true});
    }
}, false);

通过在应用程序中调用此命令关闭选项卡(通过在清单中指定,确保内容脚本在您的域中启用):

window.postMessage({ type: "APPLICATION/CLOSE" }, "*");

使用时要谨慎,因为Chrome扩展的部署可能是一个痛苦。

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

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()函数的信息

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