我想在HTML文档中标记一个电话号码为可调用链接。我读过微格式方法,我知道tel:方案是标准的,但实际上没有实现。

据我所知,Skype定义了Skype:和callto:,后者已经获得了一些流行。我想,其他公司要么有其他的计划,要么就搭上了“呼叫列车”。

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

额外的问题:有人知道紧急号码的并发症吗,比如美国的911或德国的110 ?

更新:Microsoft NetMeeting在WinXP下接受callto:方案。这个问题表明,Microsoft Office Communicator将处理tel:方案,但不处理callto: ones。好,雷蒙德!

更新2:现在已经过去两年半了。这似乎可以归结为你想用这个数字做什么。在移动环境中,tel:是可行的。如果你认为你的用户更多是Skype用户(callto:),或者更可能安装谷歌Voice (tel:)之类的东西,这取决于你。我个人的观点是,有疑问时使用tel:(与@Sidnicious的回答一致)。

更新3:用户@rybo111指出,Chrome中的Skype同时也加入了tel:潮流。我无法证实这一点,因为没有一台机器同时拥有这两种设备,但如果这是真的,这意味着我们终于有了一个赢家:tel:


当前回答

我的项目用的是tel:。

它适用于Chrome、Firefox、ie9和8、Chrome手机和我的索尼爱立信智能手机上的移动浏览器。

但是callto:在移动浏览器中不起作用。

其他回答

使用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函数。

我会使用电话:(建议)。但是为了有一个更好的回退/不显示错误页面,我会使用这样的东西(使用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-string中有移动标记的移动浏览器支持tel:协议。对于其余部分,我们将链接替换为callto:协议,以便在可用的情况下回退到Skype。

为了抑制不支持协议的错误页,链接指向一个新的隐藏iframe。

不幸的是,它似乎不可能检查,如果url已成功加载在iframe。似乎没有触发错误事件。

最好的办法是从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

正如人们所期望的那样,WebKit对tel:的支持也扩展到了Android移动浏览器——仅供参考

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