如何标记电话号码?


471

我想在HTML文档中将电话号码标记为可调用链接。我已经读过微格式方法,并且我知道该tel:方案是标准的,但实际上没有任何地方可以实现。

Skype的定义,因为据我所知,skype:callto:,后者已经获得了一定的知名度。我认为,其他公司也有其他计划或选择加入callto:

标记电话号码的最佳实践是什么,以便使尽可能多的使用VoIP软件的人只需单击链接即可拨打电话?

奖励问题:有人知道紧急电话的并发症吗,例如美国的911或德国的110?

干杯,

更新: Microsoft NetMeeting采用callto:WinXP下的方案。这个问题表明,Microsoft Office Communicator将处理tel:方案,但不会处理方案callto:。太好了,雷德蒙德!

更新2:两年半后的现在。它似乎归结为您想要对数字进行的处理。在移动环境中,tel:是必经之路。如果您认为用户是更多的Skype用户(callto:),或者更有可能安装了Google语音(tel:)之类,则由您来定位桌面。我个人的意见是,在有疑问的情况下使用tel:(与@Sidnicious'答案一致)。

更新3:用户@ rybo111指出,与此同时,Chrome中的Skype已成为tel:潮流。我无法验证这一点,因为没有机器可以同时使用,但如果是真的,这意味着我们终于在这里赢得了胜利:tel:


1
不幸的是没有。这似乎归结于您的提供商(VoiP,手机配件或其他)所做的事情。可能还要为800个号码收费。
Boldewyn

1
我在Chrome中使用Google语音,但无法识别tel:URI。我一直坚持callto:并以手机浏览器无论如何应该自动检测该号码的理论来显示电话号码。
Old Pro

5
尽管有标题,但这个问题实际上是“您应该对电话号码使用哪种URL方案”,而不是如何对其进行标记。
Raedwald,时间

1
使用Chrome时会提示@Boldewyn Skype,tel:因此也许您应该在最后删除有关Skype使用的注释callto:
rybo111 2014年

1
您能否尝试将问题更新编辑为相应的答案。这样有点混乱。
idmean 2015年

Answers:


495

tel:方案在1990年代后期使用,并在2000年初以RFC 2806(在2004年更为严格的RFC 3966淘汰了)记录在案,并不断加以改进tel:在iPhone上提供支持并不是一个任意决定。

callto:虽然受Skype支持,但不是标准,除非特别针对Skype用户,否则应避免使用。

我?我将开始tel:在您的页面上包括格式正确的URI(不嗅探用户代理),然后等待世界其他地区的电话赶上来:)。

范例

<a href="tel:+18475555555">1-847-555-5555</a>


感谢您的详细回答!自从我问了这个问题以来,我也很想遵循这种方法。使用标准并告诉抱怨的人他们使用了错误的应用程序/工具。虽然很难,但如果这是您的客户,我认为您是对的。尽管如此,如果我必须考虑Skype用户,那么我将反过来采用我的JavaScript解决方案。
Boldewyn

1
现在是2014年,电话:现在适用于Skype。但是,如果您要发起对Skype回声/声音测试服务的呼叫,则链接为msdn.microsoft中的
CN

4
有人尝试过href="tel://1-555-555-5555"格式吗?从Tutsplus的人推荐它code.tutsplus.com/tutorials/...
阿德里安成为

2
以我在tel:标记上的经验,Skype要求在数字上加一个国家代码(例如,英国数字为“ +44”)才能正确解析该数字。否则,它只会打开Skype,但不会尝试拨号。
ShaunUK '16

3
示例不应该是:<a href="tel:+18475555555">?注意首字母1之前的+。)
斯特凡

73

我的测试结果:

拨电至:

  • 诺基亚浏览器:没有任何反应
  • Google Chrome:要求运行Skype拨打电话
  • Firefox:要求选择一个程序来拨打电话
  • IE:要求运行Skype拨打电话

电话:

  • 诺基亚浏览器:工作
  • Google Chrome:什么也没有发生
  • Firefox:“ Firefox不知道如何打开此URL”
  • IE:找不到网址

2
除此之外,Android 4.2.2(Nexus 4)上的Google Chrome的行为相同。在后台运行Android版本的Skype甚至无法使callto:链接起作用。简而言之,如果您想一时定位到手机,则不能真正使用callto:链接。
13年

现在,在chrome 35上,您会看到此弹出式窗口
2014年

在chrome和firefox(也可能是IE)中,您可以使用registerProtocolHandler为您的tel:前缀注册您的Web服务。
罗斯·罗杰斯

您必须使用适用于chrome的+国家/地区代码电话号码。tel:链接似乎在w / o + chrome上无法正常运行
Stas Svishov 2014年

在OSX和Chrome上更新:要求启动Facetime。
Jules

45

最好的选择是从tel开始:它适用于所有手机

然后放入此代码,该代码仅在桌面上并且仅在单击链接时才运行。

我正在使用http://detectmobilebrowsers.com/来检测移动浏览器,您可以使用任何喜欢的方法

if (!jQuery.browser.mobile) {
    jQuery('body').on('click', 'a[href^="tel:"]', function() {
            jQuery(this).attr('href', 
                jQuery(this).attr('href').replace(/^tel:/, 'callto:'));
    });
}

因此,基本上,您涵盖了所有基础。

tel:适用于所有电话以打开带有号码的拨号器

callto:可在您的计算机上使用,以从Firefox,Chrome连接到Skype


是的,这-callto:根本无法在Android上使用(请参阅我对Murat答案的评论),而tel:则不能在桌面上使用。真的很不幸。
13年

1
嗯,可惜的是,快速的jsfiddle似乎也没有让这项工作... jsfiddle.net/tchalvakspam/gVZYt/3
Kzqai 2013年

在Mac 10.8上的Seamonkey 2.20上工作,将<body <?php body_class(); ?>>代码放在wordpress主题的header.php文件的代码下面。
om01 2013年

callto:不适用于Mac中的chrome,并且该版本是最新的
Ujjwal

可悲的是这已经在JQuery的1.9折旧完毕jquery.com/upgrade-guide/1.9/#jquery-browser-removed
Casebash

21

正如人们所期望的那样,WebKit的支持也tel:扩展到了Android移动浏览器-FYI


15
作为评论本来会更好,但无论如何都很好。
o0'。

10

我保留此答案是出于“历史性”目的,但不再推荐了。参见上面的@Sidnicious'答案和我的Update 2。

因为它看起来像是呼叫方和电话员之间的平局,所以我想提出一个可能的解决方案,希望您的评论将带我回到光明的道路上;-)

使用callto:,因为大多数桌面客户端都可以处理:

<a href="callto:0123456789">call me</a>

然后,如果客户端是iPhone,请替换链接:

window.onload = function () {
  if (navigator.userAgent.match (/iPhone/i)) {
    var a = document.getElementsByTagName ("a");
    for (var i = 0; i < a.length; i++) {
      if (a[i].getAttribute ('href').search (/callto:/i) === 0) {
        a[i].setAttribute ('href', a[i].getAttribute ('href').replace (/^callto:/, "tel:"));
      }
    }
  }
};

对这个解决方案有任何异议吗?我最好从tel:哪里开始?


iPhone可能也支持callto方案,但Apple偏爱tel,因此这是文档中提到的方案。
Jan Aagaard

5
看我的答案。callto:是专有的URI方案,所以我不会从那里开始。
2009年

callto:在Mac中不适用于chrome,并且该版本是最新的。
Ujjwal

这并不令我惊讶。给出答案后,情况在2009年发生了根本变化。另外,您需要注册该callto:方案的第三方程序,例如Skype。Chrome本身不知道该怎么做。
Boldewyn


3

RFC3966为电话号码定义了IETF标准URI,即“ tel:” URI。那是标准。没有类似的标准指定“ callto:”,这是Skype在平台上的特殊约定,允许注册URI处理程序以支持它。


Sidnicious就是这么说的,是的。
Boldewyn

3

这为我工作:

1.建立符合标准的链接:

        <a href="tel:1500100900">

2.在未检测到移动浏览器时将其替换,对于Skype:

$("a.phone")
    .each(function()
{ 
  this.href = this.href.replace(/^tel/, 
     "callto");
});

选择通过类替换的链接似乎更有效。当然,它仅适用于具有.phone类的锚。

我已将if( !isMobile() ) { ...其启用,因此仅在检测到桌面浏览器时才触发。但这可能已经过时了...

function isMobile() {
    return (
        ( navigator.userAgent.indexOf( "iPhone" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "iPod" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "iPad" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "Android" ) > -1 ) ||
        ( navigator.userAgent.indexOf( "webOS" ) > -1 )
    );
}

检测移动浏览器的“正确”方法是检查不区分大小写的字符串“ mobile”。
凯文·考克斯

2

我用于tel:我的项目。

它可以在我的索尼爱立信智能手机上的Chrome,Firefox,IE9&8,Chrome移动版和移动浏览器中使用。

callto:无法在移动浏览器中使用。


2

我会使用tel:(按照建议)。但是,为了有一个更好的后备/不显示错误页面,我将使用如下所示(使用jquery):

// enhance tel-links
$("a[href^='tel:']").each(function() {
    var target = "call-" + this.href.replace(/[^a-z0-9]*/gi, "");
    var link = this;

    // load in iframe to supress potential errors when protocol is not available
    $("body").append("<iframe name=\"" + target + "\" style=\"display: none\"></iframe>");
    link.target = target;

    // replace tel with callto on desktop browsers for skype fallback
    if (!navigator.userAgent.match(/(mobile)/gi)) {
        link.href = link.href.replace(/^tel:/, "callto:");
    }
});

假设在userAgent字符串中具有移动标记的移动浏览器支持该tel:协议。对于其余部分,我们将链接替换为callto:协议以在可用时回退到Skype。

为了抑制不支持的协议的错误页面,该链接的目标是一个新的隐藏iframe。

不幸的是,似乎无法检查该网址是否已成功加载到iframe中。似乎没有错误事件被触发。


很好地使用隐藏的iframe!
Boldewyn

1

由于callto:Skype默认支持默认设置(在Skype设置中设置),其他人也支持它,因此我建议使用callto:而不是skype:


3
在这里我同意。但是总的来说,它似乎可以归结为tel:vs callto :,而这并非易事。
Boldewyn

1

尽管Apple tel:在其文档中建议使用Mobile Safari,但目前(iOS 4.3)接受callto:相同的内容。因此,我建议callto:在通用网站上使用它,因为它可以同时与Skype和iPhone一起使用,并且我希望它也可以在Android手机上使用。

更新(2013年6月)

这仍然是决定您要提供的网页的问题。在我的网站上,我同时提供tel:callto:链接(后者标记为Skype),因为Mac上的桌面浏览器对tel:链接不起作用,而移动Android对链接不起作用callto:。甚至带有Google Talk插件的Google Chrome也无法响应tel:链接。不过,我还是希望在桌面上同时提供两个链接,以防万一有人麻烦地使tel:链接在他们的计算机上工作。

如果网站设计要求我仅提供一个链接,那么我将使用tel:尝试callto:在台式机浏览器上更改为该链接的链接。


1
最新的开放源代码版本的Android“ Ice Cream Sandwich”中的股票浏览器似乎仍仅支持tel:;单击callto:链接将导致“网页不可用”
rymo 2012年

0

使用jQuery,用适当的callto:tel:方案替换页面上的所有美国电话号码。

// create a hidden iframe to receive failed schemes
$('body').append('<iframe name="blackhole" style="display:none"></iframe>');

// decide which scheme to use
var scheme = (navigator.userAgent.match(/mobile/gi) ? 'tel:' : 'callto:');

// replace all on the page
$('article').each(function (i, article) {
    findAndReplaceDOMText(article, {
        find:/\b(\d\d\d-\d\d\d-\d\d\d\d)\b/g,
        replace:function (portion) {
            var a = document.createElement('a');
            a.className = 'telephone';
            a.href = scheme + portion.text.replace(/\D/g, '');
            a.textContent = portion.text;
            a.target = 'blackhole';
            return a;
        }
    });
});

感谢@jonas_jonas的想法。需要出色的findAndReplaceDOMText函数


1
该解决方案不是理想的,因为分析用户代理字符串被认为是不好的做法。考虑一个支持telURI但不会将自己报告为移动设备的设备。
Arturo TorresSánchez15年

-1

我使用常规<a href="tel:+123456">12 34 56</a>标记,并通过以下方式使桌面用户无法点击这些链接pointer-events: none;

a[href^="tel:"] {
    text-decoration: none;
}
.no-touch a[href^="tel:"] {
    pointer-events: none;
    cursor: text;
}

对于不支持指针事件(IE <11)的浏览器,可以使用JavaScript阻止点击(示例依赖于Modernizr和jQuery):

if(!Modernizr.touch) {
    $(document).on('click', '[href^="tel:"]', function(e) {
        e.preventDefault();
        return false;
    });
}

1
使用Modernizr.touch支持触摸事件来推断支持tel:是不可靠的。简单的例外情况:iPad,Windows平板电脑等
zachleat 2015年

即使在Windows桌面上运行的Chrome也会将自身报告为触摸设备。
Arturo TorresSánchez15年

一些台式机确实支持tel:url。对于Mac特定的示例,Mac上的FaceTime是标准的,并且可以与tel:一起使用,甚至可以将用户的iPhone与Handoff / Continuity一起使用,因此使用指针事件:不再将其定位到目标桌面可能不再是明智的选择。
OxC0FFEE '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.