方式一:
项目中引入下面JS
(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); });
方式一调用:
window.protocolCheck("hyvss://", () => { alert('检测到当前电脑未安装,确认是否下载!') });方式二(Vue中使用):
export function openUrlWithInputTimeoutHack(url, 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 = url // 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); } }; } }
引入文件:
import { openUrlWithInputTimeoutHack } from '@/utils/arouse'
方式二调用:
openUrlWithInputTimeoutHack('EaglEye:\\', () => {
console.log('未安装');
window.location.href = 'xxx软件下载路径'
}, () => {
console.log('已安装,自动唤起');
})
标签:function,failCb,vue,target,successCb,uri,JS,exe,var From: https://www.cnblogs.com/han024/p/17013026.html