支持该功能的情况下如何在新标签页中打开Mailto链接

5
我有一个网页,创建了联系人列表和他们的电子邮件地址。你有两个选项可以使用mailto链接:(1)在当前窗口中打开或(2)在新标签/窗口中打开。
我看到两种方案都有潜在的缺点:
- 对于Web邮件客户端(例如Gmail),选项1并不理想,因为它会劫持窗口,用户必须以某种方式返回应用程序。 - 对于桌面邮件客户端,第一种选项也不理想,因为现在你有一个空白的窗口/选项卡。
是否有任何方法“检测”打开的网页是否有内容,如果没有则关闭它?
基于这个链接: 检测基于Web的邮件客户端与本地邮件客户端的mailto链接 我尝试了以下获取body的代码:
const windowRef = window.open(`mailto:${email}`, '_blank')
const body = windowRef.document.body

我遇到的问题是每个文档的 body 都是空的:<body></body>
我猜测这是因为它没有足够的时间来加载页面,所以我尝试了 setTimeout ,但是然后我得到一个 Blocked a frame with origin "myhostman" from accessing a cross-origin frame.
有什么想法支持 web 和桌面邮件客户端而又没有以上列出的缺点吗?
1个回答

8
这个方法可能有些笨拙,但它可能能够满足你的需求:
你可以定义一个名为SendEmail()的函数:

function SendEmail() {
    const windowRef = window.open(`mailto:email@address.com`, '_blank');

  windowRef.focus();

  windowRef.onfocus = function() {
    return;
  } 

  setTimeout(function(){
    windowRef.close();
  },500);
}

你的html代码看起来像这样:

<a href="javascript:void(0)" onclick="SendEmail();">email</a>

这个想法是,如果用户将webmail设置为默认的电子邮件客户端,则该function将退出; 但是,如果用户有桌面电子邮件客户端,则新窗口将失去焦点,触发setTimeout()关闭新打开的窗口。
我的测试使用这个JSFiddle很好地工作,但只经过了“一半”的测试,我的意思是,由于我没有将webmail客户端设置为默认客户端,因此我无法确认它是否按照您的要求实际工作,但我可以确认当我的桌面电子邮件客户端打开时,窗口已关闭...
更新:
忘记上面的函数,我稍微修改了它变成了这样:
function SendEmail() {
  const windowRef = window.open(`mailto:email@address.com`, '_blank');

  windowRef.focus();

  setTimeout(function(){
    if(!windowRef.document.hasFocus()) {
        windowRef.close();
    }
  }, 500);

}

我在Firefox中测试了此功能,将Gmail和Yahoo!设置为默认电子邮件客户端时,新打开的选项卡仍然保持打开状态;然后我将其改回桌面电子邮件客户端,新打开的选项卡关闭了。我用Vivaldi和IE Edge进行了相同的测试(其中我的桌面客户端被设置为默认客户端),结果成功相同。这里是更新的JSFiddle链接:https://jsfiddle.net/97naqavu/1/

你有一个很有创意的想法。 - Leeish
有趣的想法,虽然当我测试桌面客户端时也看到了选项卡关闭,但是在测试 Web 客户端时,它也会关闭。 - Tom Nolan
糟糕...好吧,我有另一个想法。我会先测试它,如果成功了,我会编辑我的答案。 - Vash The Stampede
@Tom Nolan,我已经更新了我的答案。希望这能有所帮助。 - Vash The Stampede
很棒的解决方案,Vash。它可以轻松地修改为使用从链接传递的地址,我已经在这个fiddle中进行了更改:https://jsfiddle.net/perfectweb1/Lq8v84xh/ - perfectweb

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