关于用JS判断PC客户端是否安装某个软件的方法

发布时间 2023-07-19 14:46:05作者: jANE2160

开发过程中,我们经常会碰到这样的需求:在web网页上,检测电脑上是否安装了某个软件。由于浏览器的安全机制,js没有办法通过浏览器去访问注册表信息,除非用浏览器扩展。

 

如果想在web网页中判断PC客户端是否安装了某个软件,可以试用标准的浏览器特性:检查浏览器是否支持自定义协议处理程序(Custom Protocal Handler)。

首先,确定目标软件是否注册了自定义协议(例如,mysoftware://),然后使用JS通过尝试打开该协议处理程序来验证其是否存在。

通过注册表查看协议:键盘WIN+R打开运行窗口,输入regedit后回车,打开注册表

通过软件在注册表注册的自定义协议打开软件:location.href = 'mysoftware://';

具体实现代码如下:

// 原理:利用input聚焦失焦去判断。点击打开客户端按钮,input聚焦。1. 如果浏览器检测到本地系统有对应的注册码,则会弹窗提示是否打开客户端软件,input失去焦点,判断安装了客户端。2. 否则1s后还没弹窗,判断没有安装客户端。

//
通过软件的安装协议,检测是否安装
 /**
   * uri 打开客户端的uri
   * failCb 打开客户端失败回调
   * successCb 打开客户端成功回调
   */
  openUriWithInputTimeoutHack(uri, failCb, successCb) {
      let target = document.createElement('input');
      target.style.width = '0';
      target.style.height = '0';
      target.style.position = 'fixed';
      target.style.top = '0';
      target.style.left = '0';
      document.body.appendChild(target);

      target.focus();
      let handler = this.registerEvent(target, "blur", onBlur);
      
      function onBlur() {
        successCb && successCb();
        handler.remove();
        clearTimeout(timeout);
        document.body.removeChild(target);
      };

      location.href = uri;
      
      let timeout = setTimeout(function () {
        failCb && failCb();
        handler.remove();
        document.body.removeChild(target);
      }, 1000);
    },
    registerEvent(target, eventType, cb) {
      if (target.addEventListener) {
        target.addEventListener(eventType, cb);
        return {
          remove: function() {
            target.removeEventListener(eventType, cb);
          }
        }
      } else {
        target.attachEvent(eventType, cb);
        return {
          remove: function () {
            target.detachEvent(eventType, cb);
          }
        };
      }
    }

方法调用:

/**
  * uri 打开客户端的uri
  */
this.openUriWithInputTimeoutHack(uri, () => {
          console.log('未安装');
        }, () => {
          console.log('已安装');
        })

 

该方法适用于常见浏览器:chrome、ie、Firefox、QQ、360等,但是有些特殊情况

当浏览器检测到对应注册码时,会弹窗提示是否打开软件,而某些浏览器会有“始终用此程序打开”这类的选项,如果勾选了该选项,然后再卸载软件,则无法正确检测到没有安装的情况