浏览器是否设置了mailto协议处理程序的检测方法?

3

我有一个网站,动态生成了一个mailto链接,并使用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"]);

这不太好,因为如果没有设置协议处理程序,什么都不会发生。如果至少能检测到这种情况,我可能会考虑这个选项,但是也找不到任何迹象。我猜一种选择是设置一个计时器,如果到达执行时间就提醒用户?其他人已经解决了这个问题吗?似乎这是一个非常普遍的需求。谢谢。

这是一种反模式,因此通常情况下并没有解决。在这里有一个明确的责任界定,而且不是每个网站的工作来指导用户设置他们的电脑。只需提供格式良好的内容即可。其余的由用户自行处理。 - user229044
1
@meager 我不同意。软件对用户的配置进行响应并提供有用信息是合理的。 - xtempore
1个回答

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由电子邮件应用程序处理,则此方法将失败。

在我的情况下,大多数人会使用基于Web的电子邮件,因此它适用于大多数情况。如果出现故障,我会显示一条消息,内容为“如果您的电子邮件未打开,请在此处复制电子邮件地址...”


这是我能优雅地处理在Chrome中某些用户的iframe中静默失败的mailto链接的唯一方法,这完全取决于他们如何配置chrome://settings/handlers以及他们是否阻止或允许这些设置。 - darryn.ten
这是我能优雅地处理在Chrome中的某些用户中静默失败的mailto链接的唯一方法,这完全取决于他们如何配置chrome://settings/handlers以及他们是否阻止或允许这些设置。 - undefined

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