【问题标题】:Javascript to detect Skype?检测Skype的Javascript?
【发布时间】:2010-09-26 09:10:33
【问题描述】:

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

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

【问题讨论】:

    标签: javascript skype


    【解决方案1】:

    所有浏览器插件都在名为 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"); 返回 true 如果 Skype click2call 插件已安装并处于活动状态。和false 如果没有活动插件或插件未安装。

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

    【讨论】:

      【解决方案2】:

      依靠 nickf 可靠的检测方法,我只需将 skype 用户名添加到数据属性(“data-skype”)并更改所有 的 href 值>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】:

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

        即使安装了 linux skype。

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 好吧,如果我们想要一个 Skype 电话而不是通常的编号电话,这不起作用。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 上面的代码在控制台(chrome)中产生了这个错误:Uncaught TypeError: Cannot read property 'safari' of undefined
            • @domii 我猜 jQuery 在过去 7 年的某个时候删除了 .browser 对象...
            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案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;
              }
              

              【讨论】:

                【解决方案9】:

                编写一个签名的 java 小程序可能是值得的。这样,您至少可以访问操作系统并确定是否以这种方式安装了 Skype。否则,如前所述,Javascript 不允许这种事情(如果允许,您的计算机可能已经被入侵了)。

                【讨论】:

                • 这对我来说有点矫枉过正,真的。谢谢你的回答。
                • 另外,not 非常常见,有 java 小程序支持。 (amd64 linux 通常是这样的,除非你是运行 IcedTea 的稀有者之一,并且 skype 确实在 linux 上工作。)
                • nickf - 我建议你多阅读一下 javascript。 kent - 是的,很多东西都不适用于 amd64 linux
                【解决方案10】:

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

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

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                  • 好吧,我看到的问题是是否有任何东西能够处理“skype:”URL。哪个 Skype 会做,如果它已安装。这使得它具有相关性和可能。仍在寻找 Safari 的解决方案。
                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-24
                  • 1970-01-01
                  • 2012-07-04
                  • 1970-01-01
                  • 2018-05-18
                  • 2014-06-13
                  • 1970-01-01
                  • 2020-01-19
                  相关资源
                  最近更新 更多