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