2

我有一个网站可以动态构建一个 mailto url,然后使用 window.open() 在新的选项卡/窗口中打开它。

window.open("mailto:" + encodeURIComponent(r["to"]));

我现阶段正在 Chrome 中进行测试,因此其他浏览器的行为可能会有所不同。

如果 Chrome设置mailto 协议处理程序(例如 GMail),那么它会按预期工作。

如果 Chrome没有设置 mailto 协议处理程序,它只会打开一个带有 mailto url 的选项卡,没有其他内容。

这不是最坏的结果,但如果有一种方法可以提前知道,那就太好了,这样可以以某种方式引导用户设置他们的浏览器,以便 mailto url 正常工作。

以前,我只是通过将 window.location.href 设置为 url 在同一页面中打开:

windows.location.href = "mailto:" + encodeURIComponent(r["to"]);

这不是很好,因为如果没有设置协议处理程序,什么都不会发生。如果我至少可以检测到这种情况,但我也无法找到任何迹象,我也会将其视为一种选择。我想一个选择是设置一个计时器,如果它达到执行可以提醒用户?

其他人已经解决了这个问题吗?似乎是一个很常见的要求。

谢谢

4

1 回答 1

0

这就是我最终使用的。它并非在所有情况下都有效,但至少在识别未处理的协议方面提供了一些帮助。

它尝试在新窗口中打开 URL,然后在 2 秒后查看是否可以读取该位置。如果它打开了第三方站点(例如 GMail),这将引发异常 - 所以我们将其视为成功

如果没有发生异常,这将返回“about:blank”,这意味着我们(可能)失败了。

function openWin(url) {
  return new Promise((resolve, reject) => {
    const w = window.open(url);
    if (!w) {
      reject();
    }
    setTimeout(function() {
      try {
        const working = w.document.location.href;
      } catch (e) {
        resolve();
        return;
      }
      w.close();
      reject();
    }, 2000);
  });
}

用这样的东西调用:

openWin('mailto:' + encodeURIComponent(to)).then(() => {
  // handle success
}).catch(() => {
  // handle failure
});

警告:这仅适用于基于 Web 的协议处理程序。例如,如果您的 mailto 由电子邮件应用程序处理,那么这将失败。

就我而言,大多数人会使用基于 Web 的电子邮件,因此它适用于大多数情况。失败时,我会显示一条消息,影响“如果您的电子邮件没有打开,请在此处复制电子邮件地址......”

于 2021-11-15T00:14:35.110 回答