21

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

我问的原因是我想基于此更改链接的 href:如果未安装 Skype,则显示一个弹出窗口,说明 Skype 是什么以及如何安装它,如果已安装,请将链接更改skype:my.contact.name?call为单击将开始通话。房地产问题意味着我宁愿只显示一个链接。

4

11 回答 11

31

感谢大家的回答:从链接和方法 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,它只会让浏览器处理它。

编辑:重新调整功能,使其仅在页面加载时执行检查,而不是每次加载页面时执行检查。该$.skype函数现在将返回一个布尔值,告诉您是否检测到Skype

于 2008-12-11T06:15:00.430 回答
7

适用于 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;
}
于 2008-12-11T04:07:18.643 回答
4

依靠 nickf 可靠的检测方法,我只需将 skype 用户名添加到数据属性(“ data-skype ”)并更改所有tel:链接的 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');
    }
});
于 2012-06-07T16:22:22.527 回答
2

用于 IE 的 skype 插件修改了 DOM,因此您始终可以在某处拥有一个“虚拟”电话号码字段,并注意任何注入的“跨度”元素,类名为“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>
于 2008-12-11T04:10:51.773 回答
1

听起来你正在把自己编码到一个角落里……试图用 JS 检测 Skype,用完屏幕空间。

相反,如果“联系”链接将用户带到联系页面,其中包含您的“Skype:”链接和说明性的 Skype 下载内容,那么整个事情可能会更友好。它会比 JS 弹出窗口更有用。

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

于 2008-12-11T04:41:10.027 回答
0

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

于 2008-12-11T03:59:22.763 回答
0

那不是javascript的安全策略想要的。

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

同时让它在mac&linux&windows上工作也应该是有问题的。

于 2008-12-11T04:05:40.690 回答
0

所有浏览器插件都在名为的全局数组中注册它们的 mime 类型mimeTypes,可以通过 navigator object 访问navigator.mimeTypes

所以你可以用它来检查插件是否活跃。如果插件安装和禁用 - 将不会为该禁用插件注册任何 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;
}});

所以这个:如果Skype click2call插件已安装并处于活动状态,则$.checkPlugin("skype");返回。true如果false没有活动插件或插件未安装。

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

于 2014-08-28T06:31:58.677 回答
0

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

<a href="callto:<phone_number>"><phone_number></a>
于 2010-02-19T10:00:26.117 回答
0

我只是在我的 Fedora 12 中测试,使用 firefox 或其他浏览器的 Linux 平台无法使用 skype 协议。

即使安装了 linux skype。

注意:以上参考适用于 Windows 平台

于 2010-07-24T18:50:00.720 回答
-2

编写一个签名的 Java 小程序可能是值得的。这样,您至少可以访问操作系统并确定是否以这种方式安装了 Skype。否则,如注意到的那样,Javascript 不允许这种事情(如果允许,您的计算机可能已经受到损害)。

于 2008-12-11T04:29:16.947 回答