用于检测Skype的Javascript?

时间:2008-12-11 03:49:37

标签: javascript skype

某些Javascript是否可以检测是否安装了Skype?

我问的原因是我想根据以下内容更改链接的href:如果没有安装Skype,请显示一个弹出窗口,说明Skype是什么以及如何安装它,如果安装了,请更改链接到skype:my.contact.name?call,以便点击即可开始通话。房地产问题意味着我更愿意只显示一个链接。

11 个答案:

答案 0 :(得分:32)

感谢大家的答案:从链接和方法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函数现在将返回一个bool,告诉您是否检测到skype

答案 1 :(得分:8)

适用于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;
}

答案 2 :(得分:4)

依靠nickf可靠的检测方法,我只需将skype用户名添加到数据属性(“ data-skype ”)并更改所有 tel: 链接,如果不支持Skype。如果Javascript被禁用,那么正常 tel: 超链接的全局应用程序仍可正常运行。

<!-- 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 :(得分:3)

IE的skype插件会修改DOM,因此您可以随时在某处使用“虚拟”电话号码字段,并注意任何带有classname'skype_tb_injection'的注入“span”元素......

您正在寻找的是这样的:

<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>

答案 4 :(得分:1)

听起来你正在编写自己的角落......尝试用JS检测Skype,耗尽屏幕空间。

如果相反,“联系”链接会将用户带到一个联系页面,并带有“skype:”链接和您的解释性skype-download内容,整个事情可能会更友好。它将比JS弹出窗口更有用。

您可以添加一些首选项,例如“我有Skype不再显示此页面”复选框到此页面。然后使用该首选项切换“联系人”链接。

答案 5 :(得分:0)

不,通常无法检测是否从网页安装了skype或任何其他软件,除非应用程序执行某些特定操作以使信息可用,例如修改用户代理字符串la .Net或您有一个特殊的浏览器扩展,

答案 6 :(得分:0)

这不是javascript的安全策略。

没有插件或其他第三方的东西,你永远不会得到这样的信息。您只能获得缺少插件的信息,但不能丢失操作系统上的软件。

也应该有问题,以便同时在mac&amp; linux&amp; windows上运行。

答案 7 :(得分:0)

您可以使用W3C标准,浏览器将确定安装了哪些软件来管理呼叫:

<a href="callto:<phone_number>"><phone_number></a>

答案 8 :(得分:0)

答案 9 :(得分:0)

所有浏览器插件都在名为mimeTypes的全局数组中注册其mime类型,可以通过导航器对象navigator.mimeTypes访问。

所以你可以使用它来检查插件是否有效。如果已安装和禁用插件 - 将不会为该禁用的插件注册任何mime类型。如果插件安装并处于活动状态 - 他在navigator.mimeTypes

中有一个mime类型的记录

使用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");如果安装并激活skype click2call插件,则返回true。如果没有安装活动插件或插件,则false

实际上需要在另一个全局数组中搜索 - navigator.plugins,但所有活动插件都在navigator.mimeTypes中有记录,这样会更容易。

答案 10 :(得分:-1)

编写一个签名的java applet可能是值得的。这样你至少可以访问操作系统并确定Skype是否以这种方式安装。否则,正如注意到的那样,Javascript不允许这样的事情(如果确实如此,你的计算机就已经被破坏了。)