javascript - 如何为 Firefox、Opera 和 Safari 浏览器处理 Javascript 中的自定义协议检测?
问题描述
我已经使用代码来处理各种浏览器的自定义协议,但它不适用于 Firefox、Opera 和 Safari。这个你能帮我吗。
请检查下面是我使用过的代码。
对于 Firefox 版本 >= 64
const openUriWithHiddenFrame = (uri, failCb, successCb) => {
const timeout = setTimeout(function() {
failCb();
handler.remove();
}, DEFAULT_CUSTOM_PROTOCOL_FAIL_CALLBACK_TIMEOUT);
let iframe = document.querySelector("#hiddenIframe");
if (!iframe) {
iframe = createHiddenIframe(document.body, "about:blank");
}
const handler = registerEvent(window, "blur", () => {
clearTimeout(timeout);
handler.remove();
successCb();
});
iframe.contentWindow.location.href = uri;
};
对于 Firefox 版本 < 64
const openUriUsingFirefox = (uri, failCb, successCb) => {
let 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();
}
}
};
对于 Opera 和 Safari
在 Opera 的情况下,如果应用程序存在,那么它会询问是否打开,但当不存在时,它会显示未知协议而不是失败回调。
const openUriWithTimeoutHack = (uri, failCb, successCb) => {
const timeout = setTimeout(function() {
failCb();
handler.remove();
}, DEFAULT_CUSTOM_PROTOCOL_FAIL_CALLBACK_TIMEOUT);
// Handle page running in an iframe (blur must be registered with top level window)
let target = window;
while (target.parent && target != target.parent) {
target = target.parent;
}
const handler = registerEvent(target, "blur", () => {
clearTimeout(timeout);
handler.remove();
successCb();
});
window.location = uri;
};