首页 文章 精选 留言 我的

精选列表

搜索[信息窗口],共10000篇文章
优秀的个人博客,低调大师

js判断是否安装某个android app,没有安装下载该应用(websocket通信,监听窗口失去焦点事件)

现在经常有写场景需要提示用户下载app, 但是如果用户已经安装,我们希望是直接打开app。 实际上,js是没有判断app是否已经安装的方法的,我们只能曲线救国。 首先,我们需要有call起app的schema, 以及一个下载地址,比如: var schema = 'myApp://main'; var downUrl = 'https://yourmain.com/downloadUrlTag'; 一、使用websocket通信实现页端和app的通信 1. android app需要实现websocket的连接功能,开放一个特定的端口如8899; 2. 页端js建立websocket连接 1 var download = function (schema, downUrl) { 2 var ws = "ws://localhost:8899/websocket"; 3 4 function onMessage(event) { 5 if (event.data != 'SUCCESS') { 6 console.log(event.data + "!= 'SUCCESS'"); 7 window.location.href = downUrl; 8 } 9 socket.close(); 10 } 11 12 function onError(event) { 13 console.log("websocket error"); 14 window.location.href = downUrl; 15 } 16 17 function onOpen() { 18 } 19 20 function onClose() { 21 } 22 // 判断浏览器 23 if (navigator.userAgent.match(/android/i) && (navigator.userAgent.match(/Chrome/) || navigator.userAgent.match(/Opera/))) { 24 if (window.WebSocket) { 25 try { 26 socket = new WebSocket(ws);27 } catch (ex) { 28 window.location.href = downUrl; 29 } 30 var message = ""; 31 socket.onmessage = onMessage; 32 socket.onopen = onOpen; 33 socket.onclose = onClose; 34 socket.onerror = onError; 35 36 if (socket.readyState == WebSocket.CONNECTING) { 37 setTimeout(function () { // websocket建立连接需要一段时间 38 if (socket.readyState == WebSocket.OPEN) { 39 if (schema != '') { 40 window.location.href = schema; 41 socket.send(message); 42 } 43 } else { 44 socket = new WebSocket(ws);45 if (socket.readyState != WebSocket.OPEN) { 46 window.location.href = downUrl; 47 } 48 } 49 }, 1000); 50 } 51 } 52 } else { 53 window.location.href = downUrl; 54 } 55 }; 当点击下载按钮的时候,调用download(schema,downUrl)方法即可。 但是这种方法存在一个严重的问题:当app不在进程中存活时,我们是无法成功call起的,这样,我们就需要在客户端做一些工作,让你的app一直存活在进程中。 二、监听当前页面是否失去焦点,来判断是否需要调用下载 首先,我们的想法是,当用户点击下载后,先尝试call起APP,使用setTimeout做延时处理,在延时中判断是否call起成功,如果不成功,则直接下载,我们如何认为call其成功呢,当一个应用被调用的时候,浏览器会被隐藏,那么当前页面会失去焦点。 首先,我们的想法是,当用户点击下载后,先尝试call起APP,使用setTimeout做延时处理,在延时中判断是否call起成功,如果不成功,则直接下载,我们如何认为call其成功呢,当一个应用被调用的时候,浏览器会被隐藏,那么当前页面会失去焦点。 var isBlur = false; location.href = schema; setTimeout(function() { if (!isBlur) { location.href = url; } }, 1000); 那么如何来设置isBlur的值呢,这里提供两种方法: 1. 监听window的blur事件 // window 每次失去焦点 window.onblur = function() { console.log('失去焦点'); isBlur = true; }; // window 每次获得焦点 // window.onfocus = function() { // console.log('获得焦点'); // isBlur = false; // } 2. 自定义事件监听visibilityChange事件,来判断document的hidden属性, 简单写法: document.addEventListener("visibilitychange", function(){ console.log(document.hidden ? "失去焦点" : "获得焦点"); isBlur = document.hidden; }); 兼容写法: var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); var onVisibilityChange = function(){ if (!document[hiddenProperty]) { console.log('获得焦点'); isBlur = false; } else { console.log('失去焦点'); isBlur = true; } } document.addEventListener(visibilityChangeEvent, onVisibilityChange); 完整代码: var download = function() { var isBlur = false; location.href = schema; setTimeout(function() { if (!isBlur) { location.href = url; } }, 1000); // window 每次失去焦点 window.onblur = function() { console.log('失去焦点'); isBlur = true; }; var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); var onVisibilityChange = function(){ if (document[hiddenProperty]) { console.log('失去焦点'); isBlur = true; } } document.addEventListener(visibilityChangeEvent, onVisibilityChange); } 如果有哪里写的不对的,欢迎讨论!

优秀的个人博客,低调大师

固态电池量产突围:界面阻抗动态抑制、干法电极工艺窗口与全生命周期安全验证体系实战

当动力电池从“液态易燃”迈向“固态本征安全”,一场关乎电动汽车能否彻底消除里程焦虑与安全恐慌的产业革命正从“实验室高能量密度”走向“车规级量产一致性”。2025年末至2026年初,固态电池产业化迎来决定性拐点:宁德时代凝聚态电池装车蔚来ET9实现1000km续航实测,循环寿命突破1500次;丰田宣布硫化物全固态电池中试线良率提升至85%,单Wh成本降至$60以下;更关键的是,中国工信部联合联合国UNECE于2026年8月正式发布《车用固态电池安全与性能强制性国家标准》(GB/T 45XXX-2026),首次将“固-固界面阻抗增长率<5%/百圈”和“干法电极厚度均匀性CV<3%”纳入公告准入与型式认证前置条件。这标志着行业竞争焦点已从“电解质离子电导率”全面转向可界面、可制造、可验证的工程化固态电池能力构建。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册