Может ли какой-нибудь Javascript определить, установлен ли Skype или нет?
Причина, по которой я спрашиваю, заключается в том, что я хотел бы изменить href ссылки на этом основании: если Skype не установлен, покажите всплывающее окно с объяснением, что такое Skype и как его установить, если он установлен, измените ссылку на skype:my.contact.name?call, чтобы щелчок начнет звонок. Проблемы с недвижимостью означают, что я бы предпочел, чтобы отображалась только одна ссылка.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нет, обычно невозможно определить, установлено ли Skype или какое-либо другое программное обеспечение с веб-страницы, если приложение не делает что-то конкретное, чтобы сделать информацию доступной, например, изменять строку пользовательского агента а-ля .Net или у вас есть специальное расширение для браузера,
Это не то, чего хочет политика безопасности javascript.
Без плагина или другого стороннего материала вы никогда не получите такую информацию. Вы можете получить информацию только об отсутствующих плагинах, но не об отсутствующем программном обеспечении в вашей ОС.
также должно быть проблематично заставить это работать одновременно на Mac, Linux и Windows.
Работает в IE и Firefox, но не в Chrome или Opera.
function isSkypeInstalled(str) {
try {
/*@cc_on
//The Microsoft way, thanks to the conditional comments only run in IE
if (new ActiveXObject("Skype.Detection")) return true;
@*/
//Tested for firefox on win
if (navigator.mimeTypes["application/x-skype"]) return true;
}
catch(e){}
return false;
}
Плагин skype для IE изменяет DOM, поэтому вы всегда можете иметь где-нибудь «фиктивное» поле номера телефона и следить за любыми введенными элементами «span» с именем класса «skype_tb_injection» ...
Вы ищете что-то вроде этого:
<SPAN onmouseup = ".." class = "skype_tb_injection" onmousedown = "..." id = "softomate_highlight_0" onmouseover = "..." title = "Call this phone number in Thailand with Skype: +66812341234" onclick = "..." onmouseout = "..." durex = "0" context = "+66 8 1234 1234" IamRTL = "0">
<SPAN class = "skype_tb_nop"> </SPAN>
<SPAN onmouseup = "..." class = "skype_tb_imgA_flex" onmousedown = "..." id = "skype_tb_droppart_0" onmouseover = "..." title = "Skype actions" style = "..." onclick = "..." onmouseout = "...">
<SPAN class = "skype_tb_nop"> </SPAN>
<SPAN class = "skype_tb_imgFlag" id = "skype_tb_img_f0" style = "..."> </SPAN>
<SPAN class = "skype_tb_nop"> </SPAN>
</SPAN>
<SPAN class = "skype_tb_imgS" id = "skype_tb_img_s0" style = "..."> </SPAN>
<SPAN class = "skype_tb_injectionIn" id = "skype_tb_text0" style = "...">
<SPAN class = "skype_tb_innerText" id = "skype_tb_innerText0"> +6...</SPAN>
</SPAN>
<SPAN class = "skype_tb_imgR" id = "skype_tb_img_r0" style = "...">
<SPAN class = "skype_tb_nop"> </SPAN>
</SPAN>
</SPAN>
Возможно, стоит написать подписанный Java-апплет. Таким образом вы сможете хотя бы получить доступ к ОС и определить, установлен ли Skype таким образом. В противном случае, как было замечено, Javascript не допускает подобных вещей (если бы это было так, ваш компьютер уже был бы скомпрометирован).
На самом деле, для моих целей это немного перебор. хотя спасибо за ответ.
Кроме того, очень часто нет имеет поддержку Java-апплетов. (Обычно так работает amd64 linux, если только вы не один из немногих, кто использует IcedTea, а skype делает работает под Linux.)
nickf - я предлагаю вам еще немного почитать о javascript. kent - да, многие вещи не работают на amd64 linux
звучит так, как будто вы кодируете себя в каком-то уголке ... пытаетесь обнаружить Skype с помощью JS, у вас заканчивается экран.
все это могло бы быть более дружелюбным, если бы вместо этого ссылка «Контакт» перенаправляла пользователя на страницу контактов с вашими ссылками «skype:» и пояснительным контентом для скачивания по скайпу. это будет намного полезнее, чем всплывающее окно JS.
вы можете добавить некоторые настройки, например, флажок «У меня Skype больше не показывать эту страницу» на эту страницу. Затем используйте эту настройку, чтобы переключить ссылку «Контакт».
Спасибо за ответы всем: из ссылок и методов seanb и некоторых опубликованных я смог придумать решение, которое работает для IE и Firefox, поэтому я решил опубликовать «полный» ответ. Вот оно как удобное расширение jQuery!
jQuery.extend({
skype : function(failureFunction) {
var $ = jQuery;
if ($.browser.safari || $.browser.opera) {
return true;
} else if ($.browser.msie) {
try {
if (new ActiveXObject("Skype.Detection")) return true;
} catch(e) { }
} else {
if (typeof(navigator.mimeTypes["application/x-skype"]) == "object") {
return true;
}
}
$('a[href^ = "skype:"]').click(function() {
failureFunction();
return false;
});
return false;
}
});
HTML:
<a href = "skype:your.skype.username?call">Call me</a>
<a href = "skype:your.skype.username?add">Add me</a>
Javascript:
jQuery(function($) {
$.skype(function() {
// this function gets called if they don't have skype.
alert("Looks like you don't have skype. Bummer.");
});
});
Вот и все!
Если кто-то использует Safari, Opera или Chrome, он просто позволит браузеру справиться с этим.
edit: перенастроили функцию, чтобы она выполняла проверку только при загрузке страницы, а не каждый раз при загрузке страницы. Функция $.skype теперь будет возвращать логическое значение, сообщающее, был ли обнаружен скайп или нет..
приведенный выше код вызывает эту ошибку в консоли (хром): Uncaught TypeError: невозможно прочитать свойство 'safari' неопределенного
@domii Я думаю, jQuery удалил объект .browser где-то за последние 7 лет ...
Вы можете использовать стандарт W3C, и браузер определит, какое программное обеспечение установлено для управления звонками:
<a href = "callto:<phone_number>"><phone_number></a>
Что ж, это не сработает, если мы хотим звонить по Skype вместо обычного номерного.
Я просто тестировал свою Fedora 12, платформу Linux с использованием firefox или другого браузера, не работающего по протоколу Skype.
Даже с установленным linux skype.
Примечание: приведенные выше ссылки подходят для платформы Windows.
Опираясь на надежные методы обнаружения nickf, я просто добавляю имя пользователя в скайпе к атрибуту данных («data-skype») и меняю значения href для всех ссылок тел:, если скайп не поддерживается. Работает очень хорошо, глобальное приложение с обычными гиперссылками тел: остается неизменным, если Javascript отключен.
<!-- the links -->
<a href = "tel:+15035551212" data-skype = "yourskypeusername" title = "Call">Call</a>
/* the javascript*/
function hasSkype() {
if ($.browser.safari || $.browser.opera) {
return true;
} else if ($.browser.msie) {
try {
if (new ActiveXObject("Skype.Detection")) return true;
} catch(e) { }
} else {
if (typeof(navigator.mimeTypes["application/x-skype"]) == "object") {
return true;
}
}
return false;
}
$('a[href^ = "tel:"]').each(function() {
if (hasSkype()) {
// if Skype is available, update the link to use Skype
$(this).attr('href','skype:'+$(this).attr('data-skype')+'?call');
}
});
Все плагины браузера регистрируют свои mime-типы в глобальном массиве с именем mimeTypes, доступ к которому можно получить через объект навигатора navigator.mimeTypes.
Таким образом, вы можете использовать это для проверки активности плагина. Если плагин установлен и отключен - никакой MIME-тип не будет зарегистрирован для этого отключенного плагина. Если плагин установлен и активен - у него есть mime-запись в navigator.mimeTypes
Некоторая реализация кода с использованием jQuery:
jQuery.extend({checkPlugin: function(mimetype_substr) {
for (var i = 0; i < navigator.mimeTypes.length; i++) {
if (navigator.mimeTypes[i]['type'].toLowerCase().indexOf(mimetype_substr) >= 0) {
console.info("Gotcha! Here it is: "+navigator.mimeTypes[i]['type']);
return true;
}
}
return false;
}});
Итак: $.checkPlugin("skype"); возвращает true, если плагин skype click2call установлен и активен. И false, если нет активного плагина или плагин не устанавливается.
На самом деле нужно искать в другом глобальном массиве - navigator.plugins, но все активные плагины имеют свои записи в navigator.mimeTypes, и это немного проще.
Что ж, вопрос, как я понимаю, заключается в том, есть ли что-нибудь, способное справиться с URL-адресами 'skype:'. Какой скайп будет делать, если он установлен. Что делает его актуальным и возможным. Все еще ищу решение для Safari.