用Javascript来检测Skype?

是否有可能使用一些JavaScript来检测Skype是否安装?

我问的原因是我想改变一个链接的HREF的基础上:如果没有安装Skype,显示一个popup解释什么是Skype,以及如何安装,如果安装,更改链接到skype:my.contact.name?call所以点击将开始一个电话。 房地产问题意味着我只希望只显示一个链接。

感谢大家的回答:从seanb和一些贴子的链接和方法,我能想出一个解决scheme,适用于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

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

依靠nickf的可靠检测方法,我只需将skype用户名添加到data属性(“ data-skype ”)中,并在不支持skype的情况下更改所有tel:链接的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'); } }); 

IE的skype插件修改了DOM,所以你可以在任何地方总是有一个“虚拟”的电话号码字段,并寻找类名为“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> 

听起来像你正在编码自己到一个angular落那里..试图检测与JS的Skype,用尽了屏幕房地产。

整个事情可能会更友好,如果相反,“联系”链接将用户带到联系页面,您的“skype:”链接和您的解释性skype下载内容。 这将比JSpopup更有用。

你可以添加一些偏好设置,如“我有Skype不显示此页面”checkbox到此页面。 然后使用该首字母来切换您的“联系”链接。

不,一般不可能检测是否从网页上安装了Skype或任何其他软件,除非应用程序做了一些特定的信息,例如修改用户代理string,或者你有一个特殊的浏览器扩展,

这不会是JavaScript的安全策略。

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

也应该是有问题的同时在mac&linux&windows上得到这个工作。

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

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

我只是在我的Fedora 12testing,Linux平台使用Firefox或其他浏览器不工作的Skype协议。

即使有安装的Linux的Skype。

注意:以上参考对Windows平台很有好处

所有浏览器插件都将其mimetypes注册到名为mimeTypes全局数组中,可以通过导航器对象navigator.mimeTypes进行访问。

所以你可以使用这个插件激活或不激活。 如果插件安装和禁用 – 没有任何MIMEtypes将被注册为该禁用的插件。 如果插件已安装且处于活动状态 – 他在navigator.mimeTypes有一个MIMEtypes的logging

一些使用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进行search,但是所有活动的插件都在navigator.mimeTypes有logging,这样会更容易一些。

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