有没有办法判断最终用户是否能够处理<a href="tel:###">链接?</a>

18

所以,如果您想链接到电话号码,您需要这样做:

<a href="tel:18005555555">Click to Call</a>

这在移动网站上很常见,现在在桌面网站上也越来越流行(主要得益于Skype吧)。但是有些电脑/设备无法支持它。有没有办法判断用户是否能够处理tel链接?

解决方案可以是服务端或客户端,但我想它可能需要在客户端实现。


1
我觉得这非常有趣:就在一小时前,我正在调查确切的这个问题(以及geo:链接)。 - Chris Morgan
1
我发现有一个关于这个话题的“讨论”(单方面的!)在http://www.sitepoint.com/forums/showthread.php?610038-Detecting-Browser-Support-For-Speciic-URI-Schemes-(geo-tel-etc-)。那里的技术在Ubuntu上的Chrome浏览器中对我不起作用;当点击时,Chrome会尝试将其传递给`xdg-open`,而XMLHttpRequest不会失败。 - Chris Morgan
1
@ŠimeVidas - 这似乎是针对<input type="tel">而不是<a href="tel:#">的。 - Andrew G. Johnson
2
我建议将此关闭为a href tel和标准浏览器的重复问题,但我无法忍受这样做对一个好问题的不利影响,而那个问题的答案纯粹是关于检测移动浏览器...幸运的是,那里的问题可以被解释为询问如何检测移动浏览器而不是tel: URI方案支持,所以我很高兴不将其标记为重复。 - Chris Morgan
@AndrewG.Johnson:我也有偏见,因为我真的很想得到一个好答案! - Chris Morgan
显示剩余10条评论
6个回答

2

DeviceAtlasWurfl可以为你获取一些信息,但正如很多人指出的那样,没有真正可靠的方法来检测设备是否能够拨打电话。毕竟,有些人可能在桌面上,但基于他们安装的软件(甚至是其操作系统功能)能够拨打电话。

为了提供最佳体验,您应该包含tel:链接。这将为每个人提供拨打号码的机会,如果他们能够处理它。您可以使用CSS使其看起来不像链接,以减少对不支持tel:的浏览器/操作系统的潜在困惑。想要拨打号码的用户将选择或触摸它(希望复制该号码),并且将激活链接(在触摸场景中)或看到手形光标(在鼠标场景中),从而帮助他们更快地实现目标。

另外,将tel:链接设置为white-space: nowrap也总是一个好主意 :-) 这将将数字保留在单行中,以使连字符不允许它断开。

a[href^=tel:] { white-space: nowrap; }

0

我知道我来晚了将近10年,但是我为了在我的一个Web应用程序中定制UI而研究了这个问题,最终我选择在主用户菜单上添加一个切换选项:

✔ This device is a phone

当用户切换此设置时,结果将存储在浏览器的window.localStorage中,以便在以后的会话中记住。

确切的措辞取决于您的应用程序和您需要知道的原因,但归根结底,用户知道他们的设备是否具有打电话的能力,而不问他们,我们所能做的最好的事情就是猜测


0

只是一个想法,但如果您输入以下标题信息

<meta name="format-detection" content="telephone=yes">

您将能够输入没有tel:前缀(甚至没有锚点)的电话号码,浏览器会自动将它们转换为可点击的电话链接。

我认为这可能比特征或代理检测更可靠。


我并不是很喜欢这种做法...它不是合适的数据格式,而且它得到了广泛的支持吗?对于我自己来说,我也想要用于geo:链接,所以这不是一个通用的解决方案。不过还是谢谢你的想法,它可能在某些情况下非常有用。 - Chris Morgan

-1
据我所知,似乎没有一种好的可靠方法来实现这一点。它取决于浏览器之外安装了什么软件,因此我认为它不会暴露给网页(否则您可以使用它来检查用户是否安装了某些软件,特别是具有应用程序特定链接的软件,如itunes或visual studio)。
编辑:正如评论中指出的那样,firefox确实尝试导航,而将显示错误页面,因此下面的解决方案对于firefox无效。
另一种方法是简单地处理点击它但无法正常工作的情况。在chrome中进行测试,如果协议未被识别,则浏览器似乎根本不执行任何操作,因此您可以添加一个onclick,该onclick获取tel:后面的部分,并将click to call转换为实际号码。因此,如果他们没有安装任何东西,点击它会显示号码,这可能是一个不错的折衷方案?

Firefox至少(股票,桌面)将卸载您的页面,显示错误页面,因为它无法理解tel:链接。 Chrome也可能能够处理它,您无法确定它是否已处理。因此,这种方法基本上是行不通的。 - Chris Morgan

-2
据我所知,为了安全起见,检测用户具有的功能/应用程序可能会很棘手,但您可以排除一些事情并从那里开始。
您可以尝试查看它是否是可以处理链接的移动浏览器,然后如果不行,再查看其他设备是否能够使用电话号码,例如Skype,如果还不行,只需显示普通号码。
这结合了这些问题的答案:href tel and standard browsersJavascript to detect Skype?
<div>
<?php if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'mobile') || strstr(strtolower($_SERVER['HTTP_USER_AGENT']), 'android')) { echo '<div id="tel"><a href="tel:123456">123456</a></div>'; }else{?>
    <script>
            function skype (failureFunction) {
                var $ = jQuery;

                if ($.browser.safari || $.browser.opera) {
                    return true;
                } else if ($.browser.msie) {
                    try {
                        if (new ActiveXObject("Skype.Detection")) return true;
                    } catch(e) { }
                } else {
                    if (typeof(navigator.mimeTypes["application/x-skype"]) == "object") {
                        return true;
                    }
                }
                $('a[href^="skype:"]').click(function() {
                    failureFunction();
                    return false;
                });
                return false;
            }

        jQuery(function($) {
            if (skype()) {
                $('div#tel').html("<a href='skype:123456'>123456</a>");
            } else {    
                $('div#tel').html("<p>123456</p>");
            };
        });
    </script>
    <div id="tel"></div>
    <?}?>

我希望这是你朝着正确方向迈出的一步


-3
一个客户端实现可以使用 BrowserDetect 脚本来过滤用户的浏览器属性,使用此列表:Can i use: URI
var browser = BrowserDetect.browser;
var browserVersion = parseInt(BrowserDetect.version);
var supportsURI = true;

if((browser == 'Firefox' && browserVersion < 2) || (browser == 'Explorer' && browserVersion < 8) || (...)) {
    supportsURI = false;
}

(未经测试)

如果浏览器不支持URI-Schemes,您可以触发链接并显示包含所需数据(例如电话号码)的灯箱。


要是事情能够那么简单就好了。这是一个具体情况,同一款浏览器可能支持或不支持 tel: 方案。 - Chris Morgan

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