js判断是否安装插件最近遇到一个需求:点击一个按钮,然后打开本地软件。类似于某些网站打开qq。但是后来遇到了一个问题,如果本地没有安装指定的软件,是打不开的。因此需要判断当前电脑是否安装了指定的软件,如果安装了则打开该软件;否则会弹出模态框,提示下载安装软件。一开始我一直在想怎么用js判断是否安装了某个软件(浏览器可以调用的软件)。但我不知道。后来在各大网站上找了一些方法:ActiveXObjectnavigator.plugins,后来发现这些方法都无效,很失望。最后在github上找到一个插件:CustomProtocolDetectioninBrowser,使用方法请参考里面的例子。基于插件原理的重构有一部分插件原理是这样的:如果插件安装在本地,当尝试使用插件打开时,会在窗口后触发blur事件;如果插件无法打开,则什么也不会发生。根据这个原理,进行了简单的封装。(其实算不上封装,只是原理的简单展示。)这里使用了es5代码,主要是作为低版本浏览器使用。了解原理后,可以移植到相应的项目或框架中。.//dom部分插件1
插件2plugin3//js部分varlinks=document.getElementsByClassName('link')varreadyToBlur=falsevarhasPlugin=nullvartimeout=1000window.addEventListener('blur',function(){if(readyToBlur){hasPlugin=trueconsole.log('hasplugin')}})for(vari=0;ipluginwindow.location.href='plugin:data'window.open('plugin:data')这里使用的是第二种方法。第一种不容易拦截,第三种不管有没有安装都会新开一个窗口。尝试打开软件时,开始监听窗口的模糊事件。在指定时间内,如果触发了blur事件,说明软件已经安装,修改hasPlugin标志;否则,不进行操作。然后当时间到了,移除监听器,判断hasPlugin的值,如果为false,则表示没有安装插件,执行相应的处理函数。另外需要注意的是,这里设置的超时时间是根据实际情况来定的,因为有些软件可能打开很慢,像qq这样的软件不会一键打开就立马打开,所以这里设置的是监控1的超时时间第二。2019-01-07更新如果需要强制将一个exe程序写入注册表,可以参考下面的文章Js调用exe程序的方法