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

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


当前回答

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

其他回答

以下工作为我在Chrome 41:

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

我尝试了几个FF的想法,包括打开一个实际的网页,但似乎都不起作用。据我所知,任何浏览器都会用xxx.close()关闭一个标签或窗口,如果它真的是由JS打开的,但FF,至少,不能通过在标签中打开新内容来关闭一个标签。

仔细想想,这是有道理的——用户可能不希望JS关闭一个有有用历史记录的选项卡或窗口。

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

您将需要Javascript来完成此操作。使用window.close ():

close();

注意:当前选项卡是隐含的。这是等价的:

window.close();

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

So:

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

HTML:

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

or:

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

这里返回false以防止事件的默认行为。否则浏览器将尝试访问该URL(显然不是这样)。

现在window.confirm()对话框上的选项将是OK和Cancel(不是Yes和No)。如果你真的想要“是”和“否”,你需要创建某种模式Javascript对话框。

注意:与上面的有特定于浏览器的区别。如果你用Javascript打开了这个窗口(通过window.open()),那么你可以用Javascript关闭这个窗口。Firefox不允许关闭其他窗口。我相信IE会要求用户确认。其他浏览器可能有所不同。

对于仍在访问此页面的人,您只允许关闭由脚本打开的选项卡或使用带有target _blank的HTML锚标记。这两个都可以使用

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

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

我的解决方案是使用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扩展的部署可能是一个痛苦。