js 在web页面中判断某程序是否安装,未安装则下载

近期拿到一个需要,需要在web页面中判断我们的一个程序是否安装,未安装则下载

直接上代码

 //检查是否安装程序 begin
function check(uri, failCb, successCb, unsupportedCb) {
    function failCallback() {
        failCb && failCb();
    }
 
    function successCallback() {
        successCb && successCb();
    }
 
    if (navigator.msLaunchUri) { //for IE and Edge in Win 8 and Win 10
        openUriWithMsLaunchUri(uri, failCb, successCb);
    } else {
        var browser = checkBrowser();
 
        if (browser.isFirefox) {
            openUriUsingFirefox(uri, failCallback, successCallback);
        } else if (browser.isChrome || browser.isIOS) {
            openUriWithTimeoutHack(uri, failCallback, successCallback);
        } else if (browser.isIE) {
            openUriUsingIEInOlderWindows(uri, failCallback, successCallback);
        } else if (browser.isSafari) {
            openUriWithHiddenFrame(uri, failCallback, successCallback);
        } else {
            unsupportedCb();
            //not supported, implement please
        }
    }
}
 
//for IE and Edge in Win 8 and Win 10
function openUriWithMsLaunchUri(uri, failCb, successCb) {
    navigator.msLaunchUri(uri,
        successCb,
        failCb
    );
}
 
//检查浏览器类型
function checkBrowser() {
    var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    var ua = navigator.userAgent.toLowerCase();
    return {
        isOpera: isOpera,
        isFirefox: typeof InstallTrigger !== 'undefined',
        isSafari: (~ua.indexOf('safari') && !~ua.indexOf('chrome')) || Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0,
        isIOS: /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream,
        isChrome: !!window.chrome && !isOpera,
        isIE: /*@cc_on!@*/false || !!document.documentMode // At least IE6
    }
}
 
//Firefox
function openUriUsingFirefox(uri, failCb, successCb) {
    var iframe = document.querySelector("#hiddenIframe");
 
    if (!iframe) {
        iframe = _createHiddenIframe(document.body, "about:blank");
    }
 
    try {
        iframe.contentWindow.location.href = uri;
        successCb();
    } catch (e) {
        if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL") {
            failCb();
        }
    }
}
 
function openUriWithTimeoutHack(uri, failCb, successCb) {
 
    var timeout = setTimeout(function () {
        failCb();
        handler.remove();
    }, 1000);
 
    //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;
}
 
function openUriUsingIEInOlderWindows(uri, failCb, successCb) {
    if (getInternetExplorerVersion() === 10) {
        openUriUsingIE10InWindows7(uri, failCb, successCb);
    } else if (getInternetExplorerVersion() === 9 || getInternetExplorerVersion() === 11) {
        openUriWithHiddenFrame(uri, failCb, successCb);
    } else {
        openUriInNewWindowHack(uri, failCb, successCb);
    }
}
 
function openUriWithHiddenFrame(uri, failCb, successCb) {
 
    var timeout = setTimeout(function () {
        failCb();
        handler.remove();
    }, 1000);
 
    var iframe = document.querySelector("#hiddenIframe");
    if (!iframe) {
        iframe = _createHiddenIframe(document.body, "about:blank");
    }
 
    var handler = _registerEvent(window, "blur", onBlur);
 
    function onBlur() {
        clearTimeout(timeout);
        handler.remove();
        successCb();
    }
 
    iframe.contentWindow.location.href = uri;
}
 
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);
            }
        };
    }
}
 
function _createHiddenIframe(target, uri) {
    var iframe = document.createElement("iframe");
    iframe.src = uri;
    iframe.id = "hiddenIframe";
    iframe.style.display = "none";
    target.appendChild(iframe);
 
    return iframe;
}
 
function getInternetExplorerVersion() {
    var rv = -1;
    if (navigator.appName === "Microsoft Internet Explorer") {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    else if (navigator.appName === "Netscape") {
        var ua = navigator.userAgent;
        var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null) {
            rv = parseFloat(RegExp.$1);
        }
    }
    return rv;
}
 
function openUriInNewWindowHack(uri, failCb, successCb) {
    var myWindow = window.open('', '', 'width=0,height=0');
 
    myWindow.document.write("<iframe src='" + uri + "'></iframe>");
 
    setTimeout(function () {
        try {
            myWindow.location.href;
            myWindow.setTimeout("window.close()", 1000);
            successCb();
        } catch (e) {
            myWindow.close();
            failCb();
        }
    }, 1000);
}
 
function openUriUsingIE10InWindows7(uri, failCb, successCb) {
    var timeout = setTimeout(failCb, 1000);
    window.addEventListener("blur", function () {
        clearTimeout(timeout);
        successCb();
    });
 
    var iframe = document.querySelector("#hiddenIframe");
    if (!iframe) {
        iframe = _createHiddenIframe(document.body, "about:blank");
    }
    try {
        iframe.contentWindow.location.href = uri;
    } catch (e) {
        failCb();
        clearTimeout(timeout);
    }
}
//检查是否安装程序 end

function openUrl(protocolUrl){
        check(protocolUrl, function () {
                //no install, go download page
                console.log("程序未安装")
                myconfirm();
            },()=>{
              console.log("已安装")
            });
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    }
function myconfirm(){
  if (confirm("检测到程序未安装,是否需要安装?")) {
  // 用户点击了确认按钮
  // 在这里执行你想要执行的操作
  console.log("确认下载")
  var url='xxx';//下载链接
    window.location.href=url;//下载

  
} else {
  // 用户点击了取消按钮,不需要执行任何操作
    console.log("取消下载")
}
}

openUrl('xxx://'); //这里替换为你需要的自定义协议 比如微信程序就是weixin://
  

解释一下本段代码: 需要看到最后两个函数,前边的不需要改动

openUrl('xxx://'); //这里替换为你需要的自定义协议 比如微信程序就是weixin://

  var url='xxx';//下载链接
    window.location.href=url;//下载

这个url需要自行更改 http https下载链接均可。

具体效果如下

如有其他问题,欢迎在评论区沟通交流。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用 jsqrcode 库检测二维码时,我们需要将图片转换为 jsqrcode 库可以识别的数据格式,然后将其传递给 jsqrcode 库进行解析。在 Web 环境下,我们通常可以通过创建一个 Image 对象,并将图片加载到该对象上,然后获取 ImageData 数据来实现。但在小程序,由于小程序不支持直接创建 Image 对象,我们需要使用其他方法来获取图片数据。 一种方法是使用小程序的 wx.getImageInfo 接口获取图片信息,然后使用 wx.getFileSystemManager 接口将图片文件读取为二进制数据,最后将二进制数据转换为 jsqrcode 可以识别的格式。下面是一个在 uni-app 开发的小程序使用 jsqrcode 库检测二维码数量的示例代码: ```javascript // 引入相关库 import qrcode from 'jsqrcode'; // 获取图片信息并读取为二进制数据 uni.getImageInfo({ src: 'test.png', success: function (res) { uni.getFileSystemManager().readFile({ filePath: res.path, encoding: 'binary', success: function (data) { // 解析二维码,获取二维码数量 var imageData = qrcode.getImageData(data.data); var qrCodeCount = qrcode.process(imageData).length; // 输出结果 console.log('该图片包含 ' + qrCodeCount + ' 个二维码'); } }) } }); ``` 这段代码,我们首先使用 uni.getImageInfo 接口获取图片信息,然后通过 uni.getFileSystemManager 接口将图片文件读取为二进制数据。接下来,我们使用 jsqrcode 库的 getImageData 方法获取图片数据,使用 process 方法识别二维码,并通过返回的结果数组的长度来判断二维码数量。 需要注意的是,由于小程序没有 DOM,因此无法直接显示图片。如果你不想将图片显示在页面上,可以将其保存到本地或者将其转换为其他格式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值