如何在不使用窗口打开的情况下关闭标签

时间:2016-10-22 15:17:27

标签: javascript html5 google-chrome chromium service-worker

我使用以下内容打开包含一些页面内容的新标签(在新过程中)

var p = document.getElementById("myElement"); 
var a = document.createElement('a');
a.setAttribute('href',".../mypage.html");
a.setAttribute('rel',"noreferrer");
a.setAttribute('target',"_blank");
p.appendChild(a);
a.click();

http://news.softpedia.com/news/Force-Google-Chrome-to-Open-Links-in-New-Processes-128962.shtml

当您使用此代码时,它始终打开新标签,  我希望当你调用这个代码时,它会看到它是否是在新标签中打开的先前调用,然后它将关闭它并且新调用将在新选项卡中打开。 或者可能在上一个标签页中运行新页面而不关闭它。

我无法使用常规窗口。打开API ...

3 个答案:

答案 0 :(得分:1)

如果你能控制所涉及的所有页面,

Service workers就有可能。

How to Send Messages Between Service Workers and Clients描述了如何实现进入每个页面的服务工作者,并提供在这些页面之间广播消息的方法。

服务工作者无权访问DOM。相反,您可以安排将消息传递给特定客户端(页面),然后该客户端根据该消息执行自己的DOM操作。

无论采用何种解决方案,请记住,页面是沙箱以保证安全性,因此需要某种自愿协议才能进行交互。如果不是这样的话,那么当你将密码输入另一个页面/标签时,会有一个页面/标签劫持你的密码会特别容易。

答案 1 :(得分:1)

您需要的是SharedWorker(不是服务工作者,不同的东西)。您之前链接的MDN页面中有一个完整的示例。

然而,根据caniuse.com,localStorage是一个更好的选择,可以兼容协调像这样的小任务。对于您的具体情况,请在index.html

<a href="example.html" rel="noreferrer" target="_blank">Open in another process</a>
<button>Close</button>
<script>
document.querySelector('button').onclick = () => {
  // Change the value if you want the storage event to be triggered.
  localStorage.setItem('close', Date.now());
};
</script>

现在在example.html内:

<p>This page is in another process.</p>
<script>
window.addEventListener('storage', event => {
  if (event.key === 'close') { window.close(); }
});
</script>

希望它有所帮助!

答案 2 :(得分:1)

使用与我的回答here中相同的技巧。但是不要在主窗口中更改dom,只需调用window.close(); Example