首页 > 其他分享 >关于用JS判断PC客户端是否安装某个软件的方法

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

时间:2023-07-19 14:57:15浏览次数:40  
标签:浏览器 target uri JS PC 软件 安装 客户端

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

 

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

首先,确定目标软件是否注册了自定义协议(例如,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等,但是有些特殊情况

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

标签:浏览器,target,uri,JS,PC,软件,安装,客户端
From: https://www.cnblogs.com/jane2160/p/17565547.html

相关文章

  • IC卡读卡器web插件中使用js异步await/async调用接口
    js中使用异步await/async方式,对于程序的结构和逻辑都有非常大的好处,对于异步await/async有如下描述:async表示这是一个async函数,await只能用在async函数里面,不能单独使用.async返回的是一个Promise对象,await就是等待这个promise的返回结果后,再继续执行.await等待的是一个Pro......
  • android13 如何使用httpcanary抓包
    1.首先下载httpcanary的专业版链接:https://pan.baidu.com/s/1cgneyOGvpNR8pENQ9RFFDQ提取码:ocmb2.将下面的sh文件,放到手机的/data/local/tmp目录,命令为cert.sh并给权限chmod777cert.sh#cert.shset-e#Failonerror#Createaseparatetempdirectory,tohol......
  • android 加载assets 本地json
    Android加载Assets本地JSON的实现作为一名经验丰富的开发者,我很荣幸能够教会你如何在Android应用中加载本地JSON文件。下面我将逐步介绍整个实现过程,并提供相应的代码示例和注释。实现步骤首先,我们来看一下加载Assets本地JSON的实现步骤:步骤说明1获取AssetsManager对......
  • android 遍历json串
    Android遍历JSON串的流程在Android开发中,我们经常会使用JSON(JavaScriptObjectNotation)作为数据交换的格式。遍历JSON串是一项基本的开发技能,它可以帮助我们在应用程序中获取和使用JSON数据。下面是遍历JSON串的基本流程:步骤描述步骤一创建JSON对象或解析JSON字符串......
  • 安装MySQL 8.0客户端
    打开终端,使用root用户登录系统。导入MySQL官方的存储库密钥:#rpm--importhttps://repo.mysql.com/RPM-GPG-KEY-mysql下载MySQL官方的YUM存储库定义文件并将其移动到指定位置:#wgethttps://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpmrpm-ivhmysql8......
  • JS 嵌套循环
    for(vari=0;i<5;i++){while(i%3==0){i++;console.log(i);break;}console.log(i);}for(vari=0;i<5;i++){while(i||i++){console.log(i);continue;console.l......
  • JSONP方式解决跨域
     <script>//封装一个jsonp函数functionjsonp({url,params,callback}){returnnewPromise((resolve,reject)=>{//定义回调函数window[callback]=function(data){resolve(data)}......
  • Nest.js框架下,nest g app auth 命令报错!
    首先报错信息是:Failedtoexecutecommand:node@nestjs/schematics:sub-app--name=auth--no-dry-run--no-skip-import--language="ts"--source-root="apps/reservations/src"--spec--no-flat--spec-file-suffix="spec",大概的意思就是无法执行这条命令。......
  • Uncaught Error: Unsupported GeoJSON type: undefined
     渲染一个json数据(含坐标,应该就是Geojson类型)出现该错误。 AI:这表示在您的JavaScript代码中,您正在处理的GeoJSON数据存在问题。错误明确指出GeoJSON类型为undefined,这意味着您试图访问或处理的GeoJSON数据没有有效或被识别的类型  ---------------------shp文件构成--......
  • JS标识符
    什么是标识符? 变量名函数名属性名都称为标识符. 定义标识符规范如下1)标识符只能由字母数字下划线$组成.2)标识符不能以数字开头,例如:1name.3)标识符不能实JS中的关键字或保留字,例如:forifwhile等.4)标识符一般采用驼峰命名法定义,第一个单词首字母为小......