js vue项目打开本地exe程序

注意:本方法只能打开电脑注册表中已注册的软件

1.首先我们需要去下载一下protocolcheck.js

 protocolcheck.js主要功能是检测是exe程序否唤醒成功

github下载地址:https://github.com/ismailhabib/custom-protocol-detection/blob/master/protocolcheck.js

如果github打开不了,也可复制下面代码

(function (f) {
  if (typeof exports === "object" && typeof module !== "undefined") {
    module.exports = f();
  } else if (typeof define === "function" && define.amd) {
    define([], f);
  } else {
    var g;
    if (typeof window !== "undefined") {
      g = window;
    } else if (typeof global !== "undefined") {
      g = global;
    } else if (typeof self !== "undefined") {
      g = self;
    } else {
      g = this;
    }
    g.protocolCheck = f();
  }
})(function () {
  var define, module, exports;
  return (function e(t, n, r) {
    function s(o, u) {
      if (!n[o]) {
        if (!t[o]) {
          var a = typeof require == "function" && require;
          if (!u && a) return a(o, !0);
          if (i) return i(o, !0);
          var f = new Error("Cannot find module '" + o + "'");
          throw ((f.code = "MODULE_NOT_FOUND"), f);
        }
        var l = (n[o] = { exports: {} });
        t[o][0].call(
          l.exports,
          function (e) {
            var n = t[o][1][e];
            return s(n ? n : e);
          },
          l,
          l.exports,
          e,
          t,
          n,
          r
        );
      }
      return n[o].exports;
    }
    var i = typeof require == "function" && require;
    for (var o = 0; o < r.length; o++) s(r[o]);
    return s;
  })(
    {
      1: [
        function (require, module, exports) {
          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 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 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 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 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 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);
            }
          }

          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 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
            };
          }

          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;
          }

          module.exports = function (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
              }
            }
          };
        },
        {},
      ],
    },
    {},
    [1]
  )(1);
});

 2.项目存放位置及使用

如果是在vue项目中使用的话,可以放置在vue项目的public文件夹下,我这里是在里面再新建一个文件夹去存放,如图所示:

 

 接着在public 文件夹下 的index.html中引入上面的js 因为 protocolcheck.js不能通过es6的import方式引入 所以只能挂载在全局的window上。

<script src="<%= BASE_URL %>js/protocolcheck.js"></script>
或
<script src="./js/protocolcheck.js"></script>

3.项目中使用

 因为我们已经把protocolcheck 挂载在window上。所以使用的时候如下:

openUrl:是要打开的软件的路径  比如打开 weixin://   qq://

第二个参数是检测电脑中是否安装了要打开的程序 如果不是测执行第二个函数中的内容


window.protocolCheck(openUrl, () => {
    alert('检测到未安装客户端,请确认是否下载?')
  });

猜你喜欢

转载自blog.csdn.net/weixin_49014702/article/details/127792934