【问题标题】:Is there a way to detect if the browser has a mailto protocol handler set?有没有办法检测浏览器是否设置了 mailto 协议处理程序?
【发布时间】:2021-12-25 07:31:47
【问题描述】:

我有一个网站可以动态构建一个 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"]);

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

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

谢谢

【问题讨论】:

  • 这是一个反模式,所以不,它还没有得到普遍解决。这里有明确的责任划分,并且不是任何/每个网站的工作都是通过设置他们的 PC 来指导用户。只需提供格式良好的内容。其余的由用户决定。
  • @meager 我不同意。软件响应用户的配置并提供有用的信息是合理的。

标签: javascript browser mailto protocol-handler


【解决方案1】:

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

它尝试在新窗口中打开 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 由电子邮件应用程序处理,那么这将失败。

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

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 2014-09-06
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多