我使用以下内容打开包含一些页面内容的新标签(在新过程中)
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 ...
答案 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)