【问题标题】:How to mark-up phone numbers?如何标记电话号码?
【发布时间】:2010-11-12 22:27:08
【问题描述】:

我想在 HTML 文档中将电话号码标记为可调用链接。我已经阅读了the microformats approach,并且我知道tel: 方案将是标准的,但实际上没有实现。

据我所知,Skype 定义了skype:callto:,后者已经获得了一定的人气。我假设,其他公司要么有其他计划,要么跳上callto: 火车。

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

额外问题:有人知道紧急电话号码(例如美国的 911 或德国的 110)的并发症吗?

干杯,

更新: Microsoft NetMeeting 在 WinXP 下采用 callto: 方案。 This question 建议,Microsoft Office Communicator 将处理 tel: 方案,但不处理 callto: 方案。太好了,雷德蒙德!

更新 2: 两年半后的现在。它似乎归结为你想用这个数字做什么。在移动环境中,tel: 是要走的路。如果您认为您的用户更多是 Skype 用户 (callto:) 或者更有可能安装 Google Voice (tel:) 之类的东西,则以桌面为目标由您决定。我个人的看法是,如有疑问,请使用tel:(与@Sidnious 的回答一致)。

更新 3: 用户 @rybo111 指出,Chrome 中的 Skype 同时也加入了 tel: 的潮流。我无法验证这一点,因为手头没有机器,但如果这是真的,这意味着我们终于在这里赢了:tel:

【问题讨论】:

  • 很遗憾没有。这似乎归结为您的提供商(VoiP、手机通讯或其他)所做的。这也可能是对 800 个号码收费。
  • 我在 Chrome 中使用 Google Voice,但它无法识别 tel: URI。我仍然坚持使用callto: 和显示电话号码的理论,即手机浏览器无论如何都应该自动检测号码。
  • 尽管标题如此,但这个问题实际上是“你应该为电话号码使用什么 URL 方案”,而不是如何标记它们。
  • @Boldewyn Skype 在使用带有tel: 的Chrome 时会提示,所以也许您应该在最后删除您对使用callto: 的Skype 的评论?
  • 您能否尝试将您的问题更新编辑为相应的答案。像这样有点乱。

标签: html markup url-scheme phone-number


【解决方案1】:

Mobile Safari(iPhone 和 iPod Touch)使用tel: 方案。

How do I dial a phone number from a webpage on iPhone?

【讨论】:

  • 所以如果主要目标用户是iPhone或iPod Tough(可能还有其他移动设备,我不知道......),你应该使用tel:如果主要用户是普通的网络客户端, (IE、Firefox 等)使用 Skype 或其他一些 VoIP 软件,我认为 callto: 会是最好的。
【解决方案2】:

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

【讨论】:

  • 我同意。但总的来说,它似乎归结为 tel: vs callto:,这并不容易。
【解决方案3】:

我出于“历史”目的保留此答案,但不再推荐它。请参阅上面的@Sidnious 回答和我的更新 2。

由于 callto 和 tel 之间看起来像是平局,我想提出一个可能的解决方案,希望你们的 cmets 能让我重回光明之路 ;-)

使用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 方案,但苹果更喜欢 tel,所以文档中提到了这个。
  • 看我的回答。 callto: 是专有的 URI 方案,所以我不会从那里开始。
  • callto:在 mac 中对 chrome 不起作用,版本是最新的。
  • 这并不让我感到惊讶。 2009 年,当给出了答案时,情况就完全不同了。此外,您还需要注册callto: 方案的第三方程序,例如Skype。 Chrome 本身不知道应该做什么。
【解决方案4】:

tel: 方案是 used in the late 1990s,并在 2000 年初与 RFC 2806(在 2004 年被更彻底的 RFC 3966 淘汰)和 continues to be improved 一起记录。在 iPhone 上支持tel: 并不是一个武断的决定。

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

我?我只是开始在您的页面上包含格式正确的tel: URI(不嗅探用户代理),然后等待世界其他地方的手机赶上:)。

示例

&lt;a href="tel:+18475555555"&gt;1-847-555-5555&lt;/a&gt;

【讨论】:

  • 感谢您的详细解答!既然我问了这个问题,我也很想遵循这种方法。使用标准并告诉抱怨的人,他们使用了糟糕的应用程序/工具。虽然很难,但如果这个是你的客户,我认为,你是对的。如果我仍然必须考虑 Skype 用户,我将使用我的 JavaScript 解决方案。
  • 现在是 2014 年,电话:现在适用于 Skype。但是,如果您想发起对 Skype Echo / Sound Test Service 的呼叫,链接将是 Call the Skype Echo / Sound Test Service from msdn.microsoft.com/en-us/library/office/…
  • 有人试过href="tel://1-555-555-5555" 格式吗? Tutsplus 的人推荐它code.tutsplus.com/tutorials/…
  • 根据我使用 tel: 标签的经验,Skype 要求号码上带有 + 的国家/地区代码(例如,英国号码的“+44”)才能正确解析号码。否则它只会打开 Skype 但不会尝试拨号。
【解决方案5】:

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

【讨论】:

  • 作为评论会更好,但无论如何都很好。
【解决方案6】:

虽然 Apple 在他们的 Mobile Safari 文档中推荐 tel:,但目前(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:

【讨论】:

  • Android“冰淇淋三明治”最新开源版本中的股票浏览器似乎仍然只支持tel:;单击callto: 链接会导致“网页不可用”
【解决方案7】:

我的测试结果:

调用:

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

电话:

  • 诺基亚浏览器:工作中
  • 谷歌浏览器:没有任何反应
  • Firefox:“Firefox 不知道如何打开此网址”
  • IE:找不到网址

【讨论】:

  • 此外,Android 4.2.2 (Nexus 4) 上的 Google Chrome 的行为是相同的。在后台运行 Android 版本的 Skype 甚至不会使 callto: links 起作用。简而言之,如果您想立即定位移动设备,则不能真正使用 callto: 链接。
  • 现在在 chrome 35 上你会得到这个popup
  • 在 chrome 和 firefox(也可能是 IE)中,您可以为 tel: 前缀和 registerProtocolHandler 注册您的 Web 服务。
  • 您必须使用适用于 chrome 的 +countrycode 电话号码。电话:链接似乎在 chrome w/o + 上使用 skype 时不起作用
  • OSX 和 Chrome 的更新:它要求启动 Facetime。
【解决方案8】:

最好的办法是从 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:'));
    });
}

所以基本上你涵盖了所有的基础。

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

callto:在您的计算机上工作以从 firefox、chrome 连接到 Skype

【讨论】:

  • 是的,这 -- callto: 在 Android 上根本不起作用(参见我对 Murat 回答的评论),并且 tel: 在桌面上不起作用。真的很不幸。
  • 嗯,可悲的是,一个快速的 jsfiddle 似乎也无法让这个工作......jsfiddle.net/tchalvakspam/gVZYt/3
  • 在 Mac 10.8 上使用 Seamonkey 2.20 将 &lt;body &lt;?php body_class(); ?&gt;&gt; 代码放在 wordpress 主题的 header.php 文件中。
  • callto:在 mac 中对 chrome 不起作用,版本是最新的
  • 遗憾的是,在 JQuery 1.9 jquery.com/upgrade-guide/1.9/#jquery-browser-removed987654323@
【解决方案9】:

我在我的项目中使用了tel:

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

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

【讨论】:

    【解决方案10】:

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

    【讨论】:

    • Sidncious 是这么说的,是的。
    【解决方案11】:

    这对我有用:

    1.制作符合标准的链接:

     
    

    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”。
    【解决方案12】:

    我会使用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-string 中有移动标记的移动浏览器支持tel: 协议。对于其余部分,我们将链接替换为 callto: 协议,以便在可用的情况下回退到 Skype。

    为了抑制不受支持的协议的错误页面,链接将定位到一个新的隐藏 iframe。

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

    【讨论】:

    • 很好地使用隐藏的 iframe!
    【解决方案13】:

    我使用普通的&lt;a href="tel:+123456"&gt;12 34 56&lt;/a&gt; 标记并通过pointer-events: none; 使桌面用户无法点击这些链接

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

    对于不支持指针事件的浏览器(IE

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

    【讨论】:

    • 使用Modernizr.touch(即触摸事件支持)来推断对tel: 的支持是不可靠的。简单的例外情况:iPad、Windows 平板电脑等
    • 即使是在 Windows 桌面上运行的 Chrome 也将自己报告为触控设备。
    • 一些桌面级机器确实支持 tel: url。对于特定于 Mac 的示例,Mac 上的 FaceTime 是标准的,并且可以与 tel: 一起使用,甚至可以将用户的 iPhone 与 Handoff/Continuity 一起使用,因此使用 pointer-events: none 来定位桌面可能不再明智.
    【解决方案14】:

    使用 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 function

    【讨论】:

    • 这个解决方案并不理想,因为分析用户代理字符串被认为是不好的做法。考虑一个支持tel URI 但不将自己报告为移动设备的设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2014-07-08
    • 2013-01-24
    相关资源
    最近更新 更多