JavaScript для обнаружения Skype? - PullRequest
       23

JavaScript для обнаружения Skype?

21 голосов
/ 11 декабря 2008

Может ли какой-то Javascript определить, установлен Skype или нет?

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

Ответы [ 11 ]

32 голосов
/ 11 декабря 2008

Спасибо за ответы всем: по ссылкам и методам seanb и некоторым опубликованным, я смог найти решение, которое работает для IE и Firefox, поэтому я решил опубликовать «полный» ответ. Вот это как удобное расширение jQuery!

Расширение 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 теперь возвращает бул, сообщающий вам, был ли обнаружен скайп или нет .

8 голосов
/ 11 декабря 2008

Работает в 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;
}
4 голосов
/ 07 июня 2012

Опираясь на надежные методы обнаружения nickf, я просто добавляю имя пользователя Skype для атрибута данных (" data-skype ") и изменяю значения href для всех тел: ссылки, если Skype не поддерживается. Работает очень хорошо, глобальное приложение с обычными тел: гиперссылками, остающимися в такте, если 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');
    }
});
3 голосов
/ 11 декабря 2008

Плагин 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">&nbsp;</SPAN>
  <SPAN onmouseup="..." class="skype_tb_imgA_flex" onmousedown="..." id="skype_tb_droppart_0" onmouseover="..." title="Skype actions" style="..." onclick="..." onmouseout="...">
    &nbsp;&nbsp;
    <SPAN class="skype_tb_nop">&nbsp;</SPAN>
    <SPAN class="skype_tb_imgFlag" id="skype_tb_img_f0" style="...">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>
    &nbsp;
    <SPAN class="skype_tb_nop">&nbsp;</SPAN>
  </SPAN>
  <SPAN class="skype_tb_imgS" id="skype_tb_img_s0" style="...">&nbsp;</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="...">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <SPAN class="skype_tb_nop">&nbsp;</SPAN>
  </SPAN>
</SPAN>
1 голос
/ 11 декабря 2008

звучит так, как будто вы закодировали себя в каком-то уголке .. пытаясь обнаружить скайп с JS, исчерпав пространство экрана.

все это может быть более дружелюбным, если вместо этого ссылка «Контакт» переводит пользователя на страницу контактов с вашими ссылками «skype:» и вашим пояснительным контентом для загрузки по Skype. это будет гораздо полезнее, чем всплывающее окно JS.

Вы можете добавить некоторые префы, например, флажок «У меня скайп больше не показывать эту страницу» на этой странице. Затем используйте эту настройку, чтобы переключить ссылку «Контакт».

0 голосов
/ 28 августа 2014

Все плагины браузера, регистрирующие свои 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.log("Gotcha! Here it is: "+navigator.mimeTypes[i]['type']);
                return true;
        }
    }
    return false;
}});

Так вот: $.checkPlugin("skype"); возвращает true, если плагин skype click2call установлен и активен. И false если нет активного плагина или плагины не установлены.

На самом деле нужно искать в другом глобальном массиве - navigator.plugins, но все активные плагины имеют свои записи в navigator.mimeTypes, и это немного проще.

0 голосов
/ 24 июля 2010

Я только что тестировал на своей платформе Fedora 12, Linux, использующий Firefox или другой браузер, не работает по протоколу Skype.

Даже с установленным linux skype.

N.B. Вышеприведенные ссылки хороши для платформы Windows

0 голосов
/ 19 февраля 2010

Вы можете использовать стандарт W3C, и браузер определит, какое программное обеспечение установлено для управления вызовами:

<a href="callto:<phone_number>"><phone_number></a>
0 голосов
/ 11 декабря 2008

Возможно, стоит написать подписанный Java-апплет. Таким образом, вы можете по крайней мере получить доступ к ОС и определить, установлен ли Skype таким образом. В противном случае, как было отмечено, Javascript не допускает такого рода вещи (если бы это было так, ваш компьютер был бы уже взломан).

0 голосов
/ 11 декабря 2008

Это не было бы тем, чего хочет политика безопасности javascript.

Без плагина или других сторонних материалов вы никогда не получите такую ​​информацию. Вы можете получить информацию только об отсутствующих плагинах, но не об отсутствующем программном обеспечении в вашей ОС.

также должно быть проблематично, чтобы это работало одновременно на mac & linux & windows.

...