【问题标题】:How to prevent mailto event from opening a new tab in browser如何防止mailto事件在浏览器中打开新标签
【发布时间】:2012-11-07 14:29:56
【问题描述】:

我正在使用填充了 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,因为我在用户发送电子邮件后显示一条消息。

【问题讨论】:

  • 您应该添加导致问题的代码并命名您正在使用的浏览器。

标签: javascript mailto


【解决方案1】:

感谢您的编辑。确实有另一种选择:

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

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

我并没有真正得到这个。将mailto:window.location.href 一起使用时,您不会离开网站

【讨论】:

  • 感谢您的贡献和最新的编辑!我实际上没有使用mailto: URI 测试href 属性。这按预期工作!
  • 使用mailto: 时您将离开网站,例如,如果将gmail 设置为mailto: 协议的默认处理程序。 chrome://settings/handlers
  • 另外,这在 Firefox 上也不能正常工作。如果你打开了一个 websocket 连接,firefox 会在你这样做时立即杀死它(即使页面没有导航)。
【解决方案2】:

AmShaegar 的 window.location.href 解决方案效果很好,但它在我一直在开发的复杂应用程序中产生了副作用。

我终于想出了这个可能有人感兴趣的解决方案:

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

查看此插件:http://plnkr.co/edit/J0LvQU?p=preview

【讨论】:

  • 这对我来说似乎是最合适的解决方案,尤其是如果您想避免与 href 的链接,因为这些链接会被垃圾邮件机器人抓取。
  • 值得注意。在 chrome 中,如果站点在 https 上,它会将创建的 iframe 阻止为混合内容,从而导致 mailto 永远不会触发。
【解决方案3】:

空白选项卡由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/

【讨论】:

  • 这是正确的答案,即使它是“嗯,呃!”片刻。 ??
【解决方案4】:

稍等片刻后关闭窗口:

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

【讨论】:

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

尝试命名窗口 (myWindow) 并添加 close() 命令:

<script>
    myWindow=window.open("mailto:emailaddress@example.com");
    myWindow.close();
</script>';

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

【讨论】:

  • 它也适用于慢速机器吗?我可以想象窗口关闭得太快,浏览器无法响应 mailto 链接。
【解决方案6】:

不,这完全取决于您的浏览器如何处理新标签。我花了几个小时寻找解决方法,解决方案,任何东西......

firefox:选项 -> 选项卡

safari:首选项 -> 选项卡

【讨论】:

    【解决方案7】:

    记录在案:

    使用 target 属性创建一个锚标记,如下所示:

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

    【讨论】:

      【解决方案8】:
      <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 变得不可见。 edit您的答案并添加一些解释为什么/如何此代码解决问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多