我想在HTML文档中将电话号码标记为可调用链接。我已经阅读了微格式方法,我知道,tel:方案将是标准的,但实际上没有实现。
据我所知,Skype定义了skype:和callto:,后者已经获得了一些人气。我认为,其他公司有其他计划或跳上callto:列车。
标记电话号码的最佳做法是什么,以便尽可能多的人使用VoIP软件只需点击链接即可接听电话?
奖金问题:有没有人知道紧急号码的并发症,如美国的911或德国的110?
干杯,
更新:Microsoft NetMeeting在WinXP下采用callto:方案。这个问题表明,Microsoft Office Communicator将处理tel:方案,但不处理callto:方案。太棒了,雷德蒙!
更新2:两年半以后。这似乎归结为你想用这个数字做什么。在移动环境中,tel:是要走的路。如果您认为您的用户更多是Skype用户(callto:),或者更有可能安装了Google Voice(tel:),那么定位桌面就取决于您。我的个人意见是,如果有疑问,请使用tel:(符合@Sidnicious的回答)。
更新3:用户@ rybo111指出,Chrome中的Skype同时也加入了tel:潮流。我无法验证这一点,因为手头都没有机器,但如果这是真的,那就意味着我们终于有了一个胜利者:
-
有关奖金问题的任何消息?我想知道特殊号码,例如意大利的(通常是?)免费电话800。
-
不幸的是。它似乎归结为您的提供商(VoiP,手机或其他)的功能。这也可能是800个号码的收费。
-
我在Chrome中使用Google Voice,但它无法识别tel: URI。我仍然坚持使用callto:并显示电话号码,理论上手机浏览器应该自动检测号码。
-
我刚刚在Android 4.2.2上的Chrome中尝试了一个callto:URL,并收到错误302 - (net:ERR_UNKNOWN_URL_SCHEME)。不仅Android的最新版本(发布时)无法自动检测到电话号码,它也无法在拨号器或Android版本的Skype中调用它(我甚至让它在后台运行 - 没有骰子)。 IMO,@ mordy的答案最适合定位移动和桌面。
-
尽管标题,这个问题实际上是"你应该使用什么URL方案的电话号码",而不是如何标记它们。
-
是的,这是真的。上下文是编写HTML文件,以及手头的问题,是否以及如何在电话号码周围添加标记,但核心是关于URI的问题。
-
我刚刚再次测试tel:并且(至少在Mac OS和Windows上)它现在似乎与Skype一起使用。我认为是时候停止使用callto:了:-)
-
@Boldewyn Skype在使用tel:的Chrome时会出现提示,所以您最后可能会使用callto:删除有关Skype的评论吗?
-
@ rybo111谢谢。我添加了另一个更新,以便上下文保持不变。但似乎我们终于有了胜利者。
-
您可以尝试将问题更新编辑到相应的答案中。像这样它有点混乱。
-
电话呼叫的URL方案可能重复
tel:方案在20世纪90年代后期使用,并在2000年初使用RFC 2806(2004年更彻底的RFC 3966废弃)进行了记录并继续得到改进。在iPhone上支持tel:并不是一个随意的决定。
callto:虽然受Skype支持,但并非标准,除非专门针对Skype用户,否则应予以避免。
我?我只是开始在你的页面上包含正确形成的tel: URI(不用嗅探用户代理)并等待世界其他地方的手机赶上:)。
例:
-
谢谢你的详细解答!自从我提出问题以来,我也很想采用这种方法。使用标准并告诉抱怨的人,他们使用坏的应用程序/工具。虽然这很难,但如果这个是你的客户,我想,你是对的。尽管如此,我必须考虑Skype用户,但我会采用我的JavaScript解决方案。
-
callto:也适用于大多数其他VOIP电话系统,例如: SwyxIt。只是在说'...
-
这是2014年和电话:现在适用于Skype。但是,如果您想要发起Skype Echo /声音测试服务的呼叫,则链接将是从msdn.microsoft.com/en-us/library/office/&hellip呼叫Skype Echo /声音测试服务;
-
有人试过href="tel://1-555-555-5555"格式吗?来自Tutsplus的人推荐它代码.tutsplus.com/tutorials/…
-
根据我对tel:标签的使用经验,Skype要求国家代码上带有+的数字(例如英国数字为"+44")来正确解析数字。否则它只会打开Skype,但不会尝试拨号。
-
不应该是这样的例子:?注意初始1之前的+)
-
它应该使用+作为国际代码,还是00?
-
好点子。我刚加了一个'+':-)。
我的测试结果:
拨电至:
-
Nokia Browser:没有任何反应
-
谷歌浏览器:要求运行Skype来拨打该号码
-
Firefox:要求选择一个程序来拨打该号码
-
IE:要求运行Skype来拨打该号码
联系电话:
-
诺基亚浏览器:工作
-
谷歌Chrome:没有任何反应
-
Firefox:"Firefox不知道如何打开这个网址"
-
IE:找不到网址
-
除此之外,Android 4.2.2(Nexus 4)上的Google Chrome的行为相同。让Android版Skype在后台运行甚至不会使callto:链接工作。简而言之,如果您想在一分钟内定位移动设备,则无法真正使用callto:链接。
-
现在在chrome 35上你会得到这个弹出窗口
-
在chrome和firefox(也可能是IE)中,您可以使用registerProtocolHandler为您的tel:前缀注册您的Web服务。
-
你必须使用适用于chrome的+ countrycode电话号码。 tel:链接似乎无法在chrome w / o +上运行
-
OSX和Chrome上的更新:它要求启动Facetime。
-
您可以配置(非移动)浏览器以调用另一个程序来处理tel: URI方案。我做了(在Firefox上)并且它正在工作(但我没有在野外找到tel: URI ...)。
-
2016年更新。在Windows 7上运行,网页上带有tel:链接:Google Chrome 50显示一个可怕的对话框"外部协议请求",单击"启动应用程序"将打开Skype。 Firefox 45显示一个对话框"启动应用程序",可以在Skype和其他程序之间进行选择。 IE 11显示一个对话框"你想让这个网站打开一个程序",显示Skype和电话号码,单击"允许"显示另一个安全警告("在保护模式外打开"),然后启动Skype。在所有情况下,Skype都会在拨号前提供确认对话框。
-
我认为最好用国际格式(带+和国家代码)来表示没有任何空格或短划线的数字。
-
callto:链接的行为方式相同,但由于这是Skype专有的,因此应该避免使用它们。
最好的选择是从tel开始:适用于所有手机
然后输入此代码,该代码仅在桌面上运行,并且仅在单击链接时运行。
我正在使用http://detectmobilebrowsers.com/来检测移动浏览器,您可以使用您喜欢的任何方法
1 2 3 4 5 6
| 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:在桌面上并没有真正起作用。真的很不幸。
-
嗯,可悲的是一个快速的jsfiddle似乎也没有让这个工作... jsfiddle.net/tchalvakspam/gVZYt/3
-
在Mac 10.8上使用Seamonkey 2.20将>代码放在wordpress主题的header.php文件下面。
-
callto:在Mac中没有为chrome工作,版本是最新的
-
遗憾的是,这已经在JQuery 1.9中被弃用了jquery.com/upgrade-guide/1.9/#jquery-browser-removed
正如人们所预料的那样,WebKit对tel:的支持也延伸到Android移动浏览器 - 仅供参考
我保留这个答案是为了"历史性"的目的,但不再推荐它了。请参阅上面的@Sidnicious'回答和我的更新2。
因为它看起来像是callto和tel之间的平局,所以我想提出一个可能的解决方案,希望你的评论会让我重新回到光明之路上;-)
使用callto:,因为大多数桌面客户端都会处理它:
然后,如果客户端是iPhone,请替换链接:
1 2 3 4 5 6 7 8 9 10
| 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,所以这就是文档中提到的那个。
-
看我的回答。 callto:是专有的URI方案,所以我不会从那里开始。
-
callto:在Mac中没有为chrome工作,版本是最新的。
-
这并不让我感到惊讶。 2009年给出答案的时候,景观根本不同。此外,您需要一个第三方程序,它注册callto:方案,如Skype。 Chrome本身不知道应该做什么。
Mobile Safari(iPhone和iPod Touch)使用tel:方案。
如何从iPhone上的网页拨打电话号码?
-
因此,如果主要目标用户是iPhone或iPod Tough(也许是其他移动设备,我不知道......),你应该使用tel:如果主要用户是普通的web客户端,(IE,Firefox等......)使用Skype或其他一些VoIP软件,我认为callto:最好。
这对我有用:
1.制定符合标准的链接:
2.在未检测到移动浏览器时替换它,对于Skype:
1 2 3 4 5 6
| $("a.phone")
.each(function()
{
this.href = this.href.replace(/^tel/,
"callto");
}); |
选择通过类替换的链接似乎更有效。
当然它只适用于.phone类的锚点。
我把它放在函数if( !isMobile() ) { ...中,所以只有在检测到桌面浏览器时它才会触发。但是这个可能已经过时了......
1 2 3 4 5 6 7 8 9
| 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"。
RFC3966定义了电话号码的IETF标准URI,即'tel:'URI。这是标准。没有类似的标准指定'callto:',这是Skype在平台上的一种特殊约定,允许注册URI处理程序来支持它。
我会使用tel:(推荐)。但是为了有一个更好的后备/不显示错误页面,我会使用这样的东西(使用jquery):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| // 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。
不幸的是,如果网址已成功加载到iframe中,似乎无法检查。似乎没有触发错误事件。
我用tel:作为我的项目。
它适用于我的索尼爱立信智能手机上的Chrome,Firefox,IE9&amp; 8,Chrome移动设备和移动浏览器。
但callto:在移动浏览器中不起作用。
虽然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:链接会导致"网页不可用"
由于skype默认支持callto:(在Skype设置中设置),而其他人也支持它,我建议使用callto:而不是skype:。
-
我同意。但总之,它似乎归结为tel:vs callto:,这并不容易。
使用jQuery,使用适当的callto:或tel:方案替换页面上的所有美国电话号码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| // 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函数。
-
此解决方案并不理想,因为分析用户代理字符串被认为是不好的做法。考虑支持tel URI但不将自身报告为移动设备的设备。
我使用普通的12 34 56标记,并通过pointer-events: none;使桌面用户无法点击这些链接
1 2 3 4 5 6 7
| a[href^="tel:"] {
text-decoration: none;
}
.no-touch a[href^="tel:"] {
pointer-events: none;
cursor: text;
} |
对于不支持指针事件(IE <11)的浏览器,可以使用JavaScript阻止点击(示例依赖于Modernizr和jQuery):
1 2 3 4 5 6
| if(!Modernizr.touch) {
$(document).on('click', '[href^="tel:"]', function(e) {
e.preventDefault();
return false;
});
} |
-
使用Modernizr.touch(触摸事件支持)来推断对tel:的支持是不可靠的。容易例外情况:iPad,Windows平板电脑等
-
即使在Windows桌面上运行的Chrome也会将自己报告为触控设备。
-
一些桌面级机器确实支持tel:urls。对于特定于Mac的示例,Mac上的FaceTime是标准的并且与tel:一起工作,甚至使用用户的iPhone和Handoff / Continuity,因此使用指针事件:无目标桌面可能不再明智。