Используйте jQuery, чтобы определить, может ли устройство совершать телефонные звонки (поддерживает протокол tel: //)

На моем сайте есть несколько таких ссылок:

<a href="tel://+12181112222" class="call">218.111.2222</a>

Я хочу использовать jQuery (или другой метод), чтобы определить, поддерживает ли устройство выполнение вызовов / с использованием протокола tel: //. Существует ли в мире такой метод?

Я хочу использовать какой-то метод для включения или отключения ссылок, потому что при нажатии на рабочем столе мы попадаем на страницу типа «Firefox не знает, как открыть этот адрес, потому что протокол (tel) не связан с какой-либо программой. "

В настоящее время я обнюхиваю пользовательский агент и определяю, мобильное ли это устройство. Но есть ли лучший / точный способ? Что-то вроде $.support.xx из jQuery?

if ( (/iPhone|iPod|iPad|Android|BlackBerry/).test(navigator.userAgent) != true ){
    $(".call").attr("href", "#");
}

person Patrick Moore    schedule 27.06.2013    source источник
comment
stackoverflow .com / questions / 12141909 /   -  person dsgriffin    schedule 27.06.2013
comment
@Zenith, этот вопрос актуален, но в нем не обсуждается, как определить, будет ли работать включение tel: ссылок.   -  person Pointy    schedule 27.06.2013
comment
@Zenith, спасибо, это полезно, но, как сказал Пойнти, на самом деле он не определяет, поддерживается ли tel://. Это то, чего я пытаюсь достичь - тестирование пользовательского агента, я справился ... просто интересно / надеюсь на что-то, что более точно описывает, может ли устройство обрабатывать tel://.   -  person Patrick Moore    schedule 27.06.2013
comment
@SetSailMedia Извините, я хотел сказать, взгляните и на боковую панель (кстати, я не голосовал за закрытие). Ознакомьтесь с комментариями по этому вопросу - stackoverflow.com/questions/16810356/   -  person dsgriffin    schedule 27.06.2013
comment
Этот вопрос также актуален: stackoverflow.com/questions/2872090/, в нем описано, как проверить, поддерживают ли определенные браузеры протокол.   -  person Eric Beaulieu    schedule 27.06.2013


Ответы (4)


Я не уверен насчет Android или BlackBerry, но iOS автоматически берет телефонные номера и обертывает их следующим образом: _1 _... чтобы вы могли иметь скрытое <div> где-нибудь, содержащее номер телефона, например 1-800-555-5555, затем при загрузке страницы сделайте что-то вроде этого:

var isTelephone = $("a[href*='tel:']").length > 0;

Это может быть или не быть переносимым на другие платформы, вам придется попробовать.

person Adrien Delessert    schedule 27.06.2013
comment
Android, похоже, считает, что набор цифр - это номер телефона, и пытается позвонить по нему при нажатии на - person Jez D; 30.07.2013
comment
Я знаю, что ужасно опаздываю, но я нашел эта статья, в которой обсуждается, какие форматы распознаются и какими типами телефонов. Вам нужно выбрать формат для вашего скрытого <div> номера, который могут распознать Android и iPhone, иначе ваша работа будет напрасной! - person Meshaal; 11.05.2014
comment
Похоже, это не работает. Может ли кто-нибудь создать тестовую страницу, где это работает правильно? Google Chrome на Android, похоже, игнорирует <div>, даже если он не скрыт и даже если в заголовке есть тег <meta name="format-detection" content="telephone=yes">. - person Talia; 23.02.2015
comment
Умный хак. Однако определение формата телефона всегда должно быть отключено с помощью метатега, если ваша страница явно создает tel: ссылки. Я считаю, что обнаружение UserAgent является более надежным и перспективным для широкого спектра браузеров и устройств. - person Adam Leggett; 02.02.2016
comment
Skype или другое подобное программное обеспечение может быть обработчиком протокола tel:, так что это не очень хорошо. Часто при установке Skype он также устанавливает некоторые расширения для браузеров, которые преобразуют ПОЧТИ ВСЕ последовательности номеров в ссылки tel :. - person SynCap; 18.03.2017

Можно было бы найти первый экземпляр href с tel: // в нем и опубликовать вызов ajax. В случае успеха у него должно быть состояние готовности 1, поэтому ничего не делайте. В случае неудачи найдите все href с tel: //, возьмите внутренний html и замените тег a.

Это скорее гипотеза и непроверенная.

Другая мысль заключается в том, что большинство браузеров имеют настраиваемую поддержку строк в формате телефонного номера. Если вы вводите номер телефона, вам не нужно создавать тег, так как это должно быть сделано автоматически.

person ctatro85    schedule 27.06.2013
comment
Хорошо, интересно, просто опустить тег. У меня создалось впечатление, что, хотя он добавляется автоматически, это лучший способ? И я также попробую ваше предложение с помощью ajax. - person JGallardo; 03.08.2013
comment
Лучше, если вы хотя бы минимально протестируете, прежде чем писать ответ, который тысячи людей потратят на чтение: upsidedown-smile: (да, этот комментарий автоматически уничтожится после того, как вы его прочитаете, так что сэкономьте время для других людей ... :подмигивание:) - person Simon B.; 05.05.2021
comment
Поскольку пользовательские протоколы могут быть зарегистрированы на персональном компьютере, я не мог протестировать каждый сценарий. Кто-то мог зарегистрировать tel: // на своем компьютере, и в этом случае запрос ajax вернет состояние готовности 1. Однако голосование за поддержку позволяет фильтровать возможные ответы, чтобы найти лучшее решение. Что касается тестирования сценария, я использовал его с другими настраиваемыми протоколами (не tel: //) на компьютере / планшете. - person ctatro85; 12.05.2021

Я использую следующее, чтобы обнаружить его ВЕРОЯТНО телефон, прежде чем улучшать элемент без ссылки, который в ссылку tel:

var probablyPhone = (
    (/iphone|android|ie|blackberry|fennec/).test
     (navigator.userAgent.toLowerCase())
     && 'ontouchstart' in document.documentElement
  );

Я исключаю ipod | ipad, потому что знаю, что это не телефоны

Ключевым моментом здесь является ВЕРОЯТНО. Он, конечно, вернет истину на некоторых планшетных устройствах, но этого достаточно для моих целей на устройстве без сенсорного экрана, ссылка на который все равно не будет работать - я в основном просто хочу исключить рабочий стол следовательно, обнаружение события касания. Я полагаю, что проверка ширины устройства тоже сузила бы его, но, в конечном счете, нет гарантированного способа обнаружить мобильное устройство, способное к телефонным звонкам, которое я нашел.

person rgb    schedule 19.09.2013
comment
События касания могут быть эмулированы программным способом, Android, Blackberry может быть планшетом, телевизором, игрушкой, радио и т. Д. - person SynCap; 18.03.2017
comment
да, но я опубликовал это почти 4 года назад, я бы не советовал следовать чему-то 3-летней давности, не ища более свежие решения. - person rgb; 20.03.2017
comment
:) Мой комментарий не для вас, а для тех, кто читает это сегодня и когда-либо. Для того времени - это решение было достаточно совершенным. - person SynCap; 20.03.2017

Некоторое ограниченное решение может быть способом обнаружения некоторых чистых телефонов. Но не все возможно:

(function(a) {
	window.isPhone = /\bi?Phone\b|(?=.*\bAndroid\b)(?=.*\bMobile\b)|(?=.*\bAndroid\b)(?=.*\bSD4930UR\b)/i.test(a);
})(navigator.userAgent || navigator.vendor || window.opera);

console.info('This device %s make phone calls', window.isPhone ? 'is originally intended to' : 'probably can\'t' );

person SynCap    schedule 18.03.2017