js判断时候可以打开本地的软件或者插件

  点击一个按钮,打开本地的软件,比如问题反馈,需要调起本地的邮箱,填入一些信息。

  这个功能<a>标签有提供支持,但是如果本地没有安装邮箱,则无法打开,点了之后也没有任何反应,那么就需要判断当前电脑或者手机是否已经安装了指定的软件,如果已经安装,则打开该软件,否则,弹出模态框,给用户提示。

  其实这个并不好判断,后来在各大网站中找到一下方法

  1. ActiveXObject

  2. navigator.plugins

然而这些方法都无效

最后在GitHub上发现了一个插件 custom-protocol-detection

在插件中有这样一个原理:如果本地安装了软件,当尝试打开时,window后触发 blur 事件,如果无法打开,则什么都不会发生

根据这个原理,进行一个非常简单的封装,这里使用的是 vue + es6,只在Chrome或者移动端中可用

<template>
<div>
<p
class="link"
data-link="mailto:lihuan10@baidu.com"
@click="openMailto">
测试打开邮箱
</p>
</div>
</template> <script>
export default {
name: 'plugin',
data() {
return {
readyToBlur: false,
hasPlugin: null,
timeout: 1000,
timer: null
}
},
methods: {
openMailto(e) {
let link = e.target.dataset.link
this.readyToBlur = true;
this.hasPlugin = false;
window.location.href = link;
this.timer = setTimeout(() => {
this.readyToBlur = false;
!this.hasPlugin && this.noPlugin('mailto');
clearTimeout(this.timer);
}, this.timeout);
},
noPlugin(pluginName) {
console.log('no plugin ' + pluginName);
}
},
mounted() {
window.addEventListener('blur', () => {
if (this.readyToBlur) {
this.hasPlugin = true;
console.log('has plugin');
}
});
},
}
</script>

打开本地软件(比如邮箱,qq)的方法都是让浏览器的url发生改变,一般有一下方法

1. 使用 a 标签,并使用 href 属性,<a href="plugin: data">plugin</a>

2. 使用 window.location.href = 'plugin: data';

3. 使用 window.open('plugin: data');

这里使用的是第二种,第一种不好做拦截,第三种无论是否安装都会打开一个新的窗口

注意:这里设置的 timeout 是根据实际情况而定的,因为有一些软件打开的速度很慢。

js 判断是否可以打开本地软件的更多相关文章

  1. js通过注册表找到本地软件安装路径并且执行

    场景:用js执行本地的安装软件,如果不存在就执行安装 操作步骤: 1.前台js代码 <script type="text/javascript"> function e ...

  2. 实现HTML调用打开本地软件文件

    有时候我们想要实现一个功能,就是在HTML页面点击一个链接就能调用打开本地可执行文件.就像腾讯QQ.迅雷这种. 而实现这种功能其实也很简单,就是需要我们添加修改注册表,实现自定义URL Protoco ...

  3. js 判断通过什么打开(安卓、苹果、微信、QQ、浏览器、某个app应用…)

    /* 获取当前环境: 系统环境: iOS Android PC 浏览器环境 微信内置浏览器.QQ内置浏览器.正常浏览器 是否app内打开 */ var ua = navigator.userAgent ...

  4. JS判断网页是否在微信中打开/

    JS判断网页是否在微信中打开,代码如下: <script type="text/javascript"> function is_weixn(){ var ua = n ...

  5. html JS 打开本地程序及文件

    在网页打开本地应用程序示例: 一.在本地注册表自定义协议:以自定义调用Viso为例 1.在HKEY_CLASSES_ROOT下添加项ZVISIO. 2.修改ZVISIO项下的"(默认)&qu ...

  6. js判断当前页面在移动设备还是在PC端中打开

    方法一: var isPC = function () { var userAgentInfo = navigator.userAgent.toLowerCase(); var Agents = ne ...

  7. JS判断PC还是移动端打开网页

    最近在做移动端网站,也需兼容PC端.还没找到更好的方法,只能用javascr判断用户是在PC端打开还是移动端打开. JS判断 var isPC = function (){    var userAg ...

  8. js判断页面在pc端打开还是移动端打开

    js判断页面在pc端打开还是移动端打开,分别跳转不同的index.html window.addEventListener('load', function() { // true为手机,false为 ...

  9. js判断手机是否安装了某一款app,有则打开,没有去下载

    function openApp(){ if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { var loadDateTime = new ...

随机推荐

  1. Zabbix4.0+第三方报警平台OneAlert监控报警

    1. 前言 告警将重要信息发送给运维「或者其他相关人」,及时发现并且处理问题.在所有开源监控软件里面,Zabbix 的告警方式无疑是最棒的.告警的方式各式各样,从 Email 告警到飞信.139/18 ...

  2. 19 中山重现赛 1002 triangle

    题意:给一组数据a[0]...a[n],  n<5e6, a[i]<2^31-1(1e9)判断是否存在三角形数 首先想到的是排序,若a[i]+a[i+1]>a[i+2] , 则存在三 ...

  3. mongodb+nodejs

    不能只看mongodb官网文档https://docs.mongodb.com/manual/reference/method/db.collection.findOne/,都是同步接口 要看node ...

  4. 温顾知新系列-JAVA网络编程系统(1)- 流

    一.字节流 1. 输出流 Java的基本输出流类是java.io.OutputStream; public abstract calss OutputStream 此类常用的写入数据的基本方法如下: ...

  5. eclipse get set 自动添加注释

    编码的时候通常要用到 JavaBean ,而在我们经常把注释写在字段上面,但生成的Get/Set方法不会生成,通过修改Eclipse源码可解决,直接上例子: /** * 员工ID */ private ...

  6. linux系统下如何挂载NTFS移动硬盘

    前言 数据迁移是我们经常会遇到的,有时候做大数据量迁移时,为了快速迁移大数据,有可能在Linux服务器上临时挂载NTFS格式的移动硬盘, 一般情况下,Linux是识别不了NTFS格式移动硬盘的(需要重 ...

  7. 【C/C++】小坑们

    1.printf("%03d", a); // 输出 a,占 3 位,不够则左边用 0 填充 2.memcpy 所在头文件为 <string.h> 3.string s ...

  8. exadata cellcli

    cellcli [port_number] [-n] [-m] [-xml] [-v | -vv | -vvv] [-x] [-e command] The following table lists ...

  9. GDT临时分段

    GDT临时分段 GDT临时段说明 现在已经进入了保护模式, 目前的改变 可以访问1M以上的内存了 可以使用32位的指令操作 问题: 由于以前的是实式下段寄存器寻址方式无法使用了,我们必须切换到使用GD ...

  10. linux基本网络配置

    -- linux基本网络配置管理 rhel6开始有一个networkmanger的网络配置服务(可以图形配置网络,拔号,无线连接,vpn等)但此服务开启会造成你的ip不固定(会dhcp获取),而且后期 ...