Как сделать разметку на телефонных номерах?

Я хочу пометить номер телефона как ссылку для вызова в документе HTML. Я прочитал подход микроформатов и знаю, что схема tel: будет стандартной, но практически нигде не реализовано.

Скайп определяет, насколько мне известно, skype: и callto:, причем последнее приобрело некоторую популярность. Я предполагаю, что у других компаний либо другие схемы, либо они садятся в callto: поезд.

Как лучше всего разметить номер телефона, чтобы как можно больше людей с программным обеспечением VoIP могли просто щелкнуть ссылку, чтобы позвонить?

Дополнительный вопрос: знает ли кто-нибудь о проблемах с номерами служб экстренной помощи, такими как 911 в США или 110 в Германии?

Ваше здоровье,

Обновление: Microsoft NetMeeting принимает callto: схем под WinXP. Этот вопрос предполагает, что Microsoft Office Communicator будет обрабатывать tel: схемы, но не callto:. Отлично, Редмонд!

Обновление 2: два с половиной года спустя. Кажется, все сводится к тому, что вы хотите сделать с номером. В мобильном контексте tel: - лучший вариант. Настроить таргетинг на настольные компьютеры решать вам, если вы думаете, что ваши пользователи больше похожи на Skype (callto:) или, скорее всего, у них установлено что-то вроде Google Voice (tel:). Мое личное мнение: в случае сомнений используйте tel: (в соответствии с ответом @Sidnicious).

Обновление 3: пользователь @ rybo111 отметил, что Skype в Chrome тем временем подхватил tel: подножку. Я не могу это проверить, потому что ни одной машины с обоими под рукой нет, но если это правда, значит, у нас наконец-то есть победитель: tel:


person Boldewyn    schedule 22.07.2009    source источник
comment
Есть новости о бонусном вопросе? Меня интересовали специальные номера, такие как (обычно?) Бесплатный номер 800 в Италии.   -  person o0'.    schedule 20.07.2011
comment
К сожалению нет. Кажется, все сводится к тому, что делает ваш провайдер (VoIP, мобильный телефон или что-то еще). Это также может быть плата за 800 номеров.   -  person Boldewyn    schedule 20.07.2011
comment
Я использую Google Voice в Chrome, и он не распознает tel: URI. Я все еще придерживаюсь callto: и отображения номера телефона, исходя из теории, что браузеры мобильных телефонов все равно должны автоматически определять номер.   -  person Old Pro    schedule 18.04.2012
comment
Я просто попробовал callto: URL в Chrome на Android 4.2.2 и получил ошибку 302 - (net: ERR_UNKNOWN_URL_SCHEME). Мало того, что последняя версия Android (на момент публикации) не смогла автоматически определить номер телефона, она также не смогла вызвать его в программе набора номера или в версии Skype для Android (у меня даже он работает в фоновом режиме - без кубиков ). ИМО, ответ @mordy лучше всего подходит как для мобильных, так и для настольных компьютеров.   -  person aendrew    schedule 06.03.2013
comment
Несмотря на название, на самом деле вопрос заключается в том, какую схему URL-адресов следует использовать для телефонных номеров, а не в том, как их разметить.   -  person Raedwald    schedule 03.05.2013
comment
Да, это правда. Контекстом было написание HTML-файла и возникший вопрос, нужно ли и как добавлять разметку вокруг телефонных номеров, но по сути это вопрос об URI.   -  person Boldewyn    schedule 03.05.2013
comment
Я только что снова протестировал tel:, и теперь (по крайней мере, в Mac OS и Windows) он работает со Skype. Думаю, пора перестать использовать callto: :-)   -  person Sander Steffann    schedule 21.12.2013
comment
@Boldewyn Skype запрашивается при использовании Chrome с tel:, поэтому, возможно, вам следует удалить свой комментарий в конце о Skype, использующем callto:?   -  person rybo111    schedule 20.02.2014
comment
@ rybo111 спасибо. Я добавил еще одно обновление, чтобы контекст остался неизменным. Но, похоже, у нас наконец-то есть победитель.   -  person Boldewyn    schedule 20.02.2014
comment
Не могли бы вы отредактировать обновления вашего вопроса в соответствии с ответами. Вот тут какой-то беспорядок.   -  person idmean    schedule 03.08.2015
comment
Возможный дубликат схемы URL-адреса для телефонного звонка   -  person rjmunro    schedule 12.02.2019


Ответы (14)


Схема tel: была в конце 1990-х годов и задокументирована в начале 2000 г. с помощью RFC 2806 (который был заменен более подробным RFC 3966 в 2004 г.) и продолжает совершенствоваться. Поддержка tel: на iPhone не была произвольным решением.

callto:, хотя и поддерживается Skype, не является стандартом, и его следует избегать, если он не предназначен специально для пользователей Skype.

Мне? Я бы просто начал включать правильно сформированные tel: URI на ваши страницы (без обнюхивания пользовательского агента) и ждать, пока телефоны остального мира наверстают упущенное :).

Пример:

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

person s4y    schedule 23.09.2009
comment
Спасибо за развернутый ответ! Поскольку я задал вопрос, у меня тоже возникло искушение последовать этому подходу. Используйте стандарт и скажите жалующимся людям, что они используют плохое приложение / инструмент. Хотя становится сложно, если это ваш клиент, я думаю, вы правы. Если, тем не менее, мне придется принимать во внимание пользователей Skype, я выберу свое JavaScript-решение наоборот. - person Boldewyn; 24.09.2009
comment
Наступил 2014 год, и тел: теперь работает для Skype. Но если вы хотите позвонить в службу Skype Echo / Sound Test Service, ссылка будет ‹a href=skype:echo123?call› Вызов службы Skype Echo / Sound Test Service ‹/a› с msdn.microsoft.com/en-us/library/office/ - person OzBob; 02.04.2015
comment
Кто-нибудь пробовал формат href="tel://1-555-555-5555"? ребята из Tutsplus рекомендуют его код .tutsplus.com / tutorials / - person Adrien Be; 30.04.2015
comment
По моему опыту работы с tel: tag Skype требует, чтобы в номере был код страны со знаком + (например, +44 для номеров в Великобритании), чтобы правильно проанализировать номер. В противном случае он просто открывает Skype, но не пытается набрать номер. - person ShaunUK; 18.04.2016
comment
Разве пример не должен быть: ‹a href=tel:+18475555555›? Обратите внимание на + перед начальным 1.) - person Stéphane; 02.06.2016
comment
На CSS-Tricks есть статья о текущем состоянии телефонных ссылок css-tricks.com/the-current-state-of-telephone-links, датированный 2016 годом. tel:, похоже, сейчас реализован во всех современных браузерах. - person Zuabi; 29.01.2020

Мои результаты тестов:

callto:

  • Браузер Nokia: ничего не происходит
  • Google Chrome: просит запустить скайп, чтобы позвонить по номеру
  • Firefox: просит выбрать программу для звонка на номер
  • IE: просит запустить скайп, чтобы позвонить по номеру

тел:

  • Браузер Nokia: работает
  • Google Chrome: ничего не происходит
  • Firefox: «Firefox не знает, как открыть этот URL»
  • IE: не удалось найти URL
person Murat    schedule 14.06.2012
comment
В дополнение к этому, поведение такое же для Google Chrome на Android 4.2.2 (Nexus 4). Если Android-версия Skype работает в фоновом режиме, даже ссылки callto: не работают. Короче говоря, вы не можете использовать callto: ссылки, если хотите настроить таргетинг на мобильные устройства в данный момент. - person aendrew; 06.03.2013
comment
Теперь в Chrome 35 вы видите это всплывающее окно - person pec; 27.06.2014
comment
В chrome и firefox (возможно, в IE) вы можете зарегистрировать свою веб-службу для префикса tel: с помощью registerProtocolHandler. - person Ross Rogers; 30.09.2014
comment
Вы должны использовать номер телефона + код страны, который работает на Chrome. tel: ссылки не работают со скайпом на Chrome без + - person Stas Svishov; 21.10.2014
comment
Обновление на OSX и Chrome: просит запустить Facetime. - person Giulio; 11.11.2014
comment
Вы можете настроить свой (немобильный) браузер для вызова другой программы для обработки схемы tel: URI. Я сделал (в Firefox), и он работает (но я не нахожу tel: URI в открытом доступе…). - person ysdx; 05.09.2015
comment
Обновление на 2016 год. Запуск в Windows 7 со ссылкой tel: на веб-странице: Google Chrome 50 показывает страшное диалоговое окно «Запрос внешнего протокола», при нажатии на «Запустить приложение» откроется Skype. Firefox 45 показывает диалоговое окно «Запуск приложения» с возможностью выбора между Skype и другой программой. IE 11 показывает диалоговое окно. Вы хотите разрешить этому веб-сайту открывать программу с указанным Skype и номером телефона, при нажатии кнопки «Разрешить» отображается другое предупреждение системы безопасности (открыто вне защищенного режима), а затем запускается Skype. Во всех случаях Skype отображает диалоговое окно подтверждения перед набором номера. - person interDist; 11.05.2016
comment
Я считаю, что лучше всего указывать номер в международном формате (с + и кодом страны) без пробелов и тире. - person interDist; 11.05.2016
comment
Ссылки callto: ведут себя аналогичным образом, но, поскольку они являются собственностью Skype, их следует избегать. - person interDist; 11.05.2016

Лучше всего начать с 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

person mordy    schedule 21.06.2012
comment
Да, это - callto: вообще не работает на Android (см. Мой комментарий к ответу Мурата), а tel: действительно не работает на рабочем столе. Это действительно прискорбно. - person aendrew; 06.03.2013
comment
Хммм, к сожалению, быстрый jsfiddle, похоже, тоже не позволяет этой работе ... jsfiddle.net/tchalvakspam / gVZYt / 3 - person Kzqai; 26.04.2013
comment
Работая над Seamonkey 2.20 на Mac 10.8, поместите код <body <?php body_class(); ?>> в файл header.php темы WordPress. - person om01; 06.09.2013
comment
callto: не работал для Chrome в Mac, и версия актуальна - person Ujjwal; 02.09.2015
comment
К сожалению, это обесценилось в JQuery 1.9 jquery.com/upgrade-guide/1.9 / # jquery-browser-удалено - person Casebash; 08.01.2016

Как и следовало ожидать, поддержка tel: в WebKit распространяется и на мобильный браузер Android.

person rymo    schedule 28.07.2010
comment
Было бы лучше в качестве комментария, но все равно хорошо знать. - person o0'.; 20.07.2011

Я сохраню этот ответ для "исторических" целей, но больше не рекомендую его. См. Ответ @Sidnicious выше и мое Обновление 2.

Поскольку это похоже на ничью между ребятами callto и tel, я хочу предложить возможное решение в надежде, что ваши комментарии вернут меня на путь света ;-)

Использование 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:?

person Boldewyn    schedule 22.07.2009
comment
Возможно, iPhone также поддерживает схему callto, но Apple предпочитает tel, так что это тот, который упоминается в документации. - person Jan Aagaard; 22.07.2009
comment
Смотрите мой ответ. callto: - это проприетарная схема URI, поэтому я бы не стал с нее начинать. - person s4y; 23.09.2009
comment
callto: не работал для Chrome в Mac, и версия актуальна. - person Ujjwal; 02.09.2015
comment
Меня это не удивляет. В 2009 году, когда был дан ответ, картина кардинально изменилась. Также вам понадобится сторонняя программа, которая регистрируется по схеме callto:, например Skype. Сам Chrome понятия не имеет, что ему делать. - person Boldewyn; 02.09.2015


RFC3966 определяет стандартный URI IETF для телефонных номеров, то есть URI "tel:". Это стандарт. Нет аналогичного стандарта, определяющего callto:, это конкретное соглашение для Skype на платформах, где он позволяет зарегистрировать обработчик URI для его поддержки.

person Leroy Jenkins    schedule 20.05.2013
comment
Сиднициус сказал, да. - person Boldewyn; 21.05.2013

это сработало для меня:

1. сделайте ссылку, соответствующую стандартам:

        <a href="tel:1500100900">

2. заменить его, когда мобильный браузер не определяется, для скайпа:

$("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 )
    );
}
person devein    schedule 04.06.2013
comment
Правильный способ обнаружения мобильных браузеров - это проверить строку mobile, нечувствительную к регистру. - person Kevin Cox; 09.06.2013

Я использовал tel: для своего проекта.

Он работал в Chrome, Firefox, IE9 и 8, Chrome для мобильных устройств и в мобильном браузере на моем смартфоне Sony Ericsson.

Но callto: не работал в мобильных браузерах.

person fuma    schedule 01.03.2013

Я бы использовал 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.

К сожалению, не представляется возможным проверить, был ли URL-адрес успешно загружен в iframe. Кажется, что никаких ошибок не запускается.

person jonas_jonas    schedule 20.09.2013
comment
Хорошее использование скрытых фреймов! - person Boldewyn; 23.09.2013

Поскольку callto: по умолчанию поддерживается Skype (настраивается в настройках Skype), а другие также поддерживают его, я бы рекомендовал использовать callto:, а не skype:.

person awe    schedule 22.07.2009
comment
Здесь я согласен. Но все вместе, кажется, сводится к tel: vs callto :, а это непросто. - person Boldewyn; 24.09.2009

Хотя Apple рекомендует tel: в своей документации для Mobile Safari, в настоящее время (iOS 4.3) она принимает callto: точно так же. Поэтому я рекомендую использовать callto: на обычном веб-сайте, поскольку он работает как со Skype, так и с iPhone, и я ожидаю, что он будет работать и на телефонах Android.

Обновление (июнь 2013 г.)

Это все еще вопрос решения того, что вы хотите, чтобы ваша веб-страница предлагала. На своих веб-сайтах я использую как tel:, так и callto: ссылки (последняя помечена как для Skype), поскольку настольные браузеры на Mac ничего не делают со ссылками tel:, а мобильный Android ничего не делает со ссылками callto:. Даже Google Chrome с подключаемым модулем Google Talk не отвечает на tel: ссылки. Тем не менее, я предпочитаю предлагать обе ссылки на рабочем столе на тот случай, если кто-то позаботился о том, чтобы tel: ссылки работали на своем компьютере.

Если бы дизайн сайта требовал, чтобы я предоставлял только одну ссылку, я бы использовал tel: ссылку, которую я бы попытался изменить на callto: в настольных браузерах.

person Old Pro    schedule 18.04.2011
comment
стандартный браузер в последней версии Android Ice Cream Sandwich с открытым исходным кодом по-прежнему поддерживает только tel:; нажатие на callto: ссылку приводит к тому, что веб-страница недоступна - person rymo; 18.01.2012

Используя 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.

person bishop    schedule 20.09.2014
comment
Это решение не идеально, поскольку анализ строки пользовательского агента считается плохой практикой. Рассмотрим устройство, которое поддерживает tel URI, но не сообщает о себе как о мобильном телефоне. - person Arturo Torres Sánchez; 24.06.2015

Я использую обычную разметку <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;
    });
}
person Alex    schedule 31.07.2014
comment
Использование Modernizr.touch, которое является поддержкой Touch Event для вывода о поддержке tel:, ненадежно. Простые случаи исключения: iPad, планшеты с Windows и т. Д. - person zachleat; 18.06.2015
comment
Даже Chrome, запущенный на рабочем столе Windows, сообщает о себе как о сенсорном устройстве. - person Arturo Torres Sánchez; 24.06.2015
comment
Некоторые компьютеры класса настольных ПК поддерживают tel: urls. Для примера, специфичного для Mac, FaceTime на Mac является стандартным и работает с tel :, вплоть до использования iPhone пользователя с Handoff / Continuity, поэтому использование pointer-events: none для целевых рабочих столов может оказаться нецелесообразным. . - person OxC0FFEE; 31.01.2016