JS检测客户端软件是否安装

通过浏览器打开某个客户端,需要检测看客户端是否已经安装过了,未安装则提示安装该客户端,已安装则直接打开

打开客户端的方法
通过客户端软件在注册表注册的自定义协议打开。例如:js代码location.href = 'baseonline://';
查看注册表方法: 在键盘上按“win+R”,打开运行窗口,在里面输入regedit,回车即可进入注册表编辑器

实现


方案1: 首先github上找到这个方案https://github.com/ismailhabib/custom-protocol-detection。对多个浏览器都实现了,基本都是hack方法。不足点是,若检测页面在iframe里面,谷歌浏览器的检测方法不起作用。如果检测页面不在iframe下,方案1就能满足使用。


方案2: 针对所在检测页面是iframe下的页面。找到另外一个方法去实现。在谷歌浏览器测试通过。
由于方案2只在谷歌,火狐,qq,uc,搜狗,edge,都测试过(360极速发稿时还没过),可以把方案1和方案2结合使用。覆盖更多浏览器类型

方案2的具体实现

   /**
     * uri 打开客户端的uri
     * failCb 打开客户端失败回调
     * successCb 打开客户端成功回调
     */
    function openUriWithInputTimeoutHack(uri, failCb, successCb) {
	    let target = document.createElement('input')
	    target.style.width = '0'
	    target.style.height = '0'
    	    target.style.position = 'fixed'
	    target.style.top = '0'
	    target.style.left = '0'
	    document.body.appendChild(target)
 
	    target.focus();
	    var handler = _registerEvent(target, "blur", onBlur);
	    console.log('focus')
	    function onBlur() {
		    console.log('blur')
		    successCb && successCb()
		    handler.remove()
		    clearTimeout(timeout)
		    document.body.removeChild(target)
	    };
 
	    //will trigger onblur
	    location.href = uri
 
	    // Note: timeout could vary as per the browser version, have a higher value
	    var timeout = setTimeout(function () {
		    console.log('setTimeout')
		    failCb && failCb()
		    handler.remove()
		    document.body.removeChild(target)
	    }, 1000);
    }
 
    function _registerEvent(target, eventType, cb) {
        if (target.addEventListener) {
            target.addEventListener(eventType, cb);
            return {
                remove: function () {
                    target.removeEventListener(eventType, cb);
                }
            };
        } else {
            target.attachEvent(eventType, cb);
            return {
                remove: function () {
                    target.detachEvent(eventType, cb);
                }
            };
        }
    }
    
    // 测试:方法使用
    let protocalUrl = `baseonline://`
    openUriWithInputTimeoutHack(protocalUrl, () => {
    	console.log('检测到,未安装客户端')
    }, () => {
        // 浏览器弹窗提示
    	console.log('检测到:已安装了客户端')
    })

原理:同样是hack方法,利用input聚焦失焦去判断。点击打开客户端按钮,input聚焦。

1. 如果浏览器检测到本地系统有对应的注册码,则会弹窗提示是否打开客户端软件,input失去焦点,判断安装了客户端。

2. 否则1s后还没弹窗,判断没有安装客户端。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: checkforobjects.action 是一个指向特定URL地址的动作。具体来说,它可能是一个Web应用程序中的一个请求动作或链接,用来检查某个对象是否存在或可用。 在Web开发中,我们可以通过这种方式来验证用户输入是否合法或有效。例如,当用户填写一个表单并点击提交按钮时,后台服务器可以通过checkforobjects.action 来检查用户输入的数据。这种检查通常包括验证用户输入是否符合规定的格式、是否存在于数据库中、是否满足特定的条件等等。如果检查失败,后台服务器可以返回错误信息给用户,以便他们进行相应的修改。 此外,checkforobjects.action 还可以在前端 JavaScript 或其他客户端脚本中使用。在这种情况下,它可以用来检测页面上特定元素是否存在,以便进行相应的操作。例如,我们可以在一个网页加载时使用 checkforobjects.action 来检查是否已加载了所需的 JavaScript 库或插件,如果没有,则可以触发加载操作。 总之,checkforobjects.action 是一个用于检查特定对象是否存在或可用的动作。它可以应用在各种场景中,包括Web开发中的后台验证和前端脚本中的元素检测。 ### 回答2: checkforobjects.action 是一个动作,可以用来检查物体的存在性或者获取某个对象的详细信息。它通常被用在软件开发或者网络编程中,用于验证某个对象是否存在或者获取这个对象的相关属性。 在软件开发中,checkforobjects.action 可以用于检查对象是否被正确创建,以防止空指针异常等错误。通过调用 checkforobjects.action,程序可以判断某个对象是否存在,并根据结果来做出相应的处理。 在网络编程中,checkforobjects.action 可以用于检查服务器端是否存在某个对象。通过发送请求至服务器,通过 checkforobjects.action 来判断服务器上的某个对象是否存在。这样可以在客户端上根据结果进行不同的操作,比如显示不同的界面或者执行不同的逻辑。 总之,checkforobjects.action 是一个用于检查物体存在性或获取对象详细信息的动作。它在软件开发和网络编程中起到重要的作用,帮助我们验证对象的存在性,以及根据结果做出相应的处理。 ### 回答3: checkforobjects.action是一个在软件开发中常用的动作。这个动作的目的是在执行特定操作之前检查是否存在特定的对象或资源。 在软件开发中,我们常常需要对一些对象或资源进行一些操作,比如数据库的增删改查操作、文件的读写操作等。在执行这些操作之前,我们需要先检查是否已经存在相关的对象或资源,以确保操作的顺利进行。 checkforobjects.action可以通过访问数据库或文件系统等来检查对象或资源的存在与否。如果对象或资源不存在,我们可以根据具体的需求采取一些相应的处理方式,比如创建新的对象、从其他途径获取资源等。如果对象或资源存在,我们可以继续执行后续的操作。 这个动作的使用可以帮助我们避免一些潜在的错误或异常情况。通过事先检查对象或资源的存在与否,我们可以提前做好相应的准备工作,避免在执行操作时出现一些意外情况,从而提高软件的稳定性和可靠性。 总之,checkforobjects.action是一个在软件开发中常用的动作,它用于在执行特定操作之前检查是否存在特定的对象或资源。通过使用这个动作,我们可以提前检查并处理潜在的错误情况,确保操作的顺利进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学而时习之不亦说乎。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值