首页 > 解决方案 > 如何为 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;
  };

标签: javascriptangularcross-browserdom-eventsangular8

解决方案


推荐阅读