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. java泛型使用教程

    参考: java 泛型    Java泛型中E.T.K.V等的含义 一.Java泛型中E.T.K.V等的含义 E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Jav ...

  2. [flask]gunicorn配置文件

    配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8 import multiprocessing # 监听端口 bind = '0 ...

  3. 『TensorFlow』流程控制

    『PyTorch』第六弹_最小二乘法对比PyTorch和TensorFlow TensorFlow 控制流程操作 TensorFlow 提供了几个操作和类,您可以使用它们来控制操作的执行并向图中添加条 ...

  4. Oracle的sql导入

    sqlldr: 一般用于导入以任何后缀结束的文件,我这次就是因为要导入一张以.20160101为后缀的文件,当初简直束手无策 结合input.ctl使用,可以在DOS下使用,可以对一张表导入数十万,百 ...

  5. volatile关键字的作用

    引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...

  6. Django框架(五)

    九.Django与Ajax 一.Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语 ...

  7. 【lintcode13】字符串查找

    问题: 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始).如果不存在,则返回 -1. 样例:如果 ...

  8. OpenResty安装使用教程(CentOS 6)

    一.安装OpenResty Linux官方建议直接通过官方提供的预编译包安装:http://openresty.org/cn/linux-packages.html # 确保yum周边工具已经安装 y ...

  9. sharing-jdbc实现读写分离及分库分表

    需求: 分库:按业务线business_id将不同业务线的订单存储在不同的数据库上: 分表:按user_id字段将不同用户的订单存储在不同的表上,为方便直接用非分片字段order_id查询,可使用基因 ...

  10. linux软件管理 YUM命令

    yum的优点 将所有软件包放到官方服务器上,当进行yum在线安装时可以自动解决依赖性问题 yum源文件 [root@ssgao1987 yum.repos.d]# cd /etc/yum.repos. ...