热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js检测自定义协议是否存在

js检测自定义协议是否存在-1.自定义协议的用途使用自定义协议可以使浏览器调起客户端本地程序,详情请点击大佬写的文章:通用URL协议实现在浏览器中打开本机任意程序。那么在实际应

1.自定义协议的用途

使用自定义协议可以使浏览器调起客户端本地程序,详情请点击大佬写的文章:通用URL协议实现在浏览器中打开本机任意程序。

那么在实际应用中,如何检测自定义的协议是否存在呢?ie下可以通过activex检测注册表项,chrome该怎么办呢?当然是有解决办法的,已经有人将该功能封装成了通用JS,下面来具体了解下吧。

2.源码浅析

protocolcheck.js 源码中对不同的浏览器做了兼容处理,重点在这一段:

 function openUriWithTimeoutHack (uri, failCb, successCb) {
     var timeout = setTimeout(function () {
        failCb()
        handler.remove()
     }, 2000)

     // handle page running in an iframe (blur must be registered with top level window)
     var target = window
     while (target != target.parent) {
        target = target.parent
     }
     var handler = _registerEvent(target, 'blur', onBlur)
     function onBlur () {
        clearTimeout(timeout)
        handler.remove()
        successCb()
     }
     window.location = uri
  }

函数有三个传参

  • uri:调用本地客户端的url
  • failCb:打开客户端失败的回调
  • successCb:打开客户端成功的回调

里面设置一个2秒的定时器(时间可以根据项目具体调整一下),使用window.location打开uri,因为打开uri后页面会失焦,所以可以监测window的blur事件,如果捕获到失焦,就可以认为自定义协议存在,本地客户端打开,然后调用成功的回调函数,并且清除定时器等,如果2秒后没有捕捉到页面失焦,就可以认为自定义协议不存在,打开本地客户端失败,调用失败的回调。

3.踩坑记录

实际在项目实践中发现了一些问题:

  1. 有时候既打开了客户端,又执行了失败的回调。

原因:看了源码就不难发现问题。检测blur的实现方式并不是100%可靠,有可能启用本地客户端需要一段时间,有时候由于各种原因比较慢,在2s以后打开也是可能的,但是代码认为2s后就是启用客户端失败,自然会执行失败的回调。

解决方法:对于这个问题并没有比较完美的解决办法,只能把时间稍微设置的长一点,尽量避免这种情况的发生。但是这样对用户的体验不大好,用户需要等一段时间才能看到失败回调的逻辑,造成卡顿的感觉。所以这个时间要拿捏好。

  1. 对于用window.open打开的子窗口,无法用protocolcheck.js检测到自定义协议是否存在

原因:还是从源码中找问题,注意那一行注释 handle page running in an iframe (blur must be registered with top level window),blur事件必须要在顶层window注册。

解决方法:我的解决方法是,不要使用window.open,而是新建一个路由,再去检测自定义协议是否存在。或者在父窗口检测完成后保存下这个状态,在子窗口中直接使用。

4.项目中使用

1.下载文件

git地址:protocolcheck.js。

我将这个js文件放在vue项目中static文件夹下了。

2.引入

添加到index.html文件中

html>
<html>
  <head>
     ...
    <script src="/static/protocolcheck.js">script>
  head>
  <body>
    <div id="app">div>
  body>
html>

引入之后,打开控制台Console,输入window,可以看到protocolCheck已经挂载到window下面啦,就可以使用了。

3.使用

openMultiDisplayWebview () {
  let expandScreenUrl = 'xxxxxx'
  try {
    window.protocolCheck(expandScreenUrl, function () {
      console.log('协议未注册')
      ...
    })
  } catch (e) {
   // 捕捉异常
  }
}

文章参考 JS检测自定义协议


推荐阅读
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
author-avatar
任我闯2502871177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有