使用window.name在同一标签页中打开电子邮件中的链接

19

我正在开发一个网站,用户可以更改设置,在生效之前需要进行确认。

确认是通过我通过电子邮件发送给他们的链接完成的。在网站的HTML中,我使用了以下代码片段:

<script type="text/javascript">window.name="mysite";</script>

我使用的是HTML格式的电子邮件

<a href="..." target="mysite">Click me</a>

但是Chrome总是打开新的标签页而不是在一个标签页中打开它们。
这种做法是否可行或者因某些原因被禁止了呢?

1
我尝试使用浏览器上下文名称规范来分配window.top.name,但是当单击针对现有选项卡的链接时,Chrome也会打开一个新选项卡。 - Dan Dascalescu
1
你尝试过base元素吗? - Vlad Zhukov
3个回答

9

像Gmail这样的Webmail平台由于安全原因,往往会修改电子邮件的某些HTML代码。

他们显然会删除电子邮件中的任何javascript代码。但是他们还会更改(或添加如果没有)每个锚元素的目标属性,并将它们设置为target="_blank",以避免用户被带出Gmail(在这种情况下)。

不幸的是,每个Webmail平台都有自己的行为,因此,您想要做的事情在每个Webmail平台上都不起作用。

如果您想要做的是防止用户打开同一页面的多个选项卡,(*请参考更新1),则可以考虑使用WebSockets,在用户输入电子邮件中发送的URL后关闭先前的选项卡。例如,可以查看socket.io

更新1

使用WebSockets无法完成此操作。没有可能使用javascript关闭未使用javascript打开的窗口,只能由其父项关闭。


3
我对你如何认为Web Socket将绕过JavaScript无法关闭它们没有实际打开的窗口的规则感兴趣。 - Guy Schalnat
看起来截取LocalStorage事件将允许第一个标签在第二个标签将某个键存储在LocalStorage中时关闭自身。 - Dan Dascalescu
1
你说得对,@GuySchalnat,由于你所说的规则,这是不可能做到的。那会是一个不错的尝试,丹。 - tin

8

这是一个非常有意思的想法,我很喜欢它。可惜的是,在现代浏览器中,您不能通过javascript关闭未经您打开的窗口。因此,如果您不允许在电子邮件中运行javascript,则最好的方法是将原始页面重定向到“感谢您”页面,并在浏览器的标签中保留它(但不再等待确认)。就像这样:

PleaseConfirm.html:

window.name="need_redirected";

Confirm.html:

var w = window.open("", "need_redirected");
if (w) 
    w.location="ThankYou.html";

当然,对于旧版IE,我仍会尝试在ThankYou.html中关闭旧窗口:
window.top.close();

当然,您仍然可以尝试设置目标,以防万一它起作用,您也可以尝试在标记上放置一个onclick属性,出于同样的原因:

<a href="confirm.html" target="need_redirected" onclick="window.open('confirm.html', 'need_redirected');">click here </a>

但这似乎是你所能做到的最好了。可惜啊。

3

其他两个答案都不起作用,但这个可能会:

  1. 在初始选项卡中,监听一个被创建的特定键的onstorage事件,例如“userHasConfirmedEmail”。当事件发生时,window.top.close()
  2. 在新标签页中,创建该密钥。

荣誉归功于Tomas和他的答案


3
好的想法,但是较新的浏览器版本会防止JavaScript关闭未由同一脚本首先打开的选项卡,很遗憾,现在看来我们在OP提出的问题上陷入了困境。 - John Rix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接