如何防止“mailto”事件在浏览器中打开新标签页

34

我正在使用JavaScript填写mailto:来在我的Web应用程序中发送信息,但每次用户按下“发送”按钮时,它都会在打开邮件应用程序(Outlook,Gmail等)之前在浏览器中打开一个新标签页。

有没有办法防止打开空白标签页?


编辑:这个问题在以下所有主要浏览器中都遇到了:Internet Explorer,Firefox和Google Chrome。

我正在使用window.open()来发送电子邮件,是否有任何已知的替代方法?

这是我发送电子邮件的方式:

var mailto_link = 'mailto:'+email+'?subject='+subject+'&body='+body_message;
var win = window.open(mailto_link,'emailWindow');

我不想使用window.location.href,因为我要在用户发送电子邮件后显示一条消息。


你应该添加导致问题的代码,并命名你正在使用的浏览器。 - AmShaegar
8个回答

30

感谢您的编辑。确实有一种替代方案:

window.location.href = "mailto:mail@domain.tld";
alert("Thank you!");

我不想使用window.location.href,因为当用户发送电子邮件后,我需要显示一条消息。

我并没有真正理解这个问题。在使用 window.location.hrefmailto: 时,您并没有离开网站。


1
感谢您的贡献和最新编辑!我实际上没有测试过href属性与mailto: URI一起使用。这正是预期的效果! - Jeff Noel
10
如果使用 mailto: 时,例如将 Gmail 设置为 mailto: 协议的默认处理程序,则会离开该网站。请前往 chrome://settings/handlers 进行更改。 - Joe B
2
此外,这在Firefox上无法正常工作。如果您有一个websocket连接打开,当您执行此操作时,Firefox将立即终止它(即使页面没有导航)。 - CpnCrunch

9
< p >AmShaegar的window.location.href解决方案效果不错,但在我开发的复杂应用程序中会引起副作用。

最终,我提出了这个解决方案,可能会让人感兴趣:

$('<iframe src="mailto:mail@domain.tld">').appendTo('body').css("display", "none");

请查看此Plunker: http://plnkr.co/edit/J0LvQU?p=preview

2
这对我来说似乎是最合适的解决方案,特别是如果你想避免使用 href 链接,因为那些被垃圾邮件机器人爬取。 - peter_the_oak
3
值得注意的是,在Chrome中,如果网站使用https协议,它会将创建的iframe阻止为混合内容,这会导致mailto永远不会触发。 - Kyle Hawk

5

空白选项卡是通过window.open()打开的。你不需要这个。

mailto链接的语法应该是这样的

<a href="mailto:your@email.address?subject=Comments about the color blue">Contact Us</a>

请参阅http://www.addressmunger.com/mailto_syntax_tutorial/以获取更多详细信息。


这是正确的答案,即使它是一个“显然!”的时刻。 - Lawrence Dol

5

在短时间间隔后关闭窗口:

var mailto_link = 'mailto:'+email+'?subject='+subject+'&body='+body_message;
var win = window.open(mailto_link,'emailWindow');
setTimeout(function() { win.close() }, 500);

1
我认为@CpnCrunch的答案是正确的,但不完整。如果用户在同一浏览器中查看电子邮件,则新窗口应保持打开状态。只有在外部电子邮件应用程序中查看时,新窗口才应关闭。由于跨站点浏览器限制,我们可能只能在新窗口为空白时检查它是否为about:blank。我通过像这样包装win.close()的检查来解决这个问题: try { if (myWindow.location.href === 'about:blank') { myWindow.close(); }} catch (Error) {/* do nothing */} - Tom Anderson

3
尝试给窗口命名(myWindow)并添加一个close()命令:
<script>
    myWindow=window.open("mailto:emailaddress@example.com");
    myWindow.close();
</script>';

这应该关闭额外的浏览器窗口并保持电子邮件应用程序的打开状态。至少对我来说有效。


它也适用于慢速机器吗?我可以想象窗口关闭得太快,浏览器无法响应mailto链接。 - AmazingTurtle

0
不,这严格取决于您的浏览器如何处理新标签页。我已经花了数小时寻找解决方法、解决方案或任何其他办法...
火狐浏览器:选项 -> 标签页
Safari 浏览器:偏好设置 -> 标签页

0
<a className="prom-links-anchor" tabIndex="0" aria-label="Email" href={ "mailto:" + eid + "@yahoo.com"}   
   role="link" nocm="true" title={ "Email"} rel="email" data-cs={contentSource} data={resultPosition + 1} 
   onMouseDown={this.handleMouseDown.bind(this)} onKeyDown={this.handleKeyPressEvent.bind(this)} 
   onContextMenu={e=> e.preventDefault()}
  >
  <div className="icon-email" title="Email" href={"mailto:" + eid + "@yahoo.com"} rel="email" 
       data-cs={contentSource} data={resultPosition + 1} />
  <div className="icon-label-email" aria-hidden="true" href={"mailto:" + eid + "@yahoo.com"} 
       title={"Email"} rel="hc-email" data-cs={contentSource} data={resultPosition + 1}
    >Email</div>
</a>

你必须正确缩进代码,否则 HTML 将变得不可见。[编辑] 你的回答并添加一些解释,说明这段代码是如何解决问题的。 - barbsan

0

纪录一下:

创建一个带有 target 属性的锚标签,像这样:

<div>
    <a target="_self" href="mailto:mail1@domain1.com;%20mail2@domain2.com?subject=Mail%20sending&body=etc...">
        Send Mail
    </a>
</div>

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