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

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


当前回答

您可以尝试使用JavaScript + HTML来欺骗浏览器关闭当前窗口:

JS:

function closeWindow() {
 if(window.confirm('Are you sure?')) {
  window.alert('Closing window')
  window.open('', '_self')
  window.close()
 }
 else {
  alert('Cancelled!')
 }
}

HTML:

Some content
<button onclick='closeWindow()'>Close Current Window!</button>
More content

其他回答

下面是如何创建这样一个链接:

<a href=“javascript:if(“Close window?”)window. Close ()闭> < / a >

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

我只是想添加window.close()在2021,chrome 91工作,但并不总是。如果标签中没有历史记录(你不能返回),它就可以工作的情况之一。

在我的情况下,我想创建自毁选项卡,关闭后几秒钟,但我在努力如何去开发服务器避免新选项卡,因为显然新选项卡也是选项卡,它被保存在选项卡历史:D我创建的链接大约:空白选项卡与目标=_blank属性,它导致新选项卡,window.close()方法终于工作了!

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

我的解决方案是使用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()函数的信息