javascript - 如何处理未在 Safari 上安装的自定义协议(protocol)仍然触发 onblur 事件?

标签 javascript safari custom-protocol

我有一个自定义协议(protocol)检查器,用于检查是否安装了协议(protocol)。

对于 Safari(与 Chrome 相同),它专注于一个元素,触发协议(protocol)并监听 onblur。

但是,在 Safari 中,如果未安装该协议(protocol),浏览器会抛出警告 esc 弹出窗口,提示:“Safari 无法打开该页面,因为地址无效。”这又会触发 onblur 事件。

有没有人找到更好的方法来管理这个问题?如果需要,它可以是 Safari 特定的解决方案。

//Chrome (and default for other browsers)
function checkChrome(){
    bodyElement.append("<input type='text' id='focusInput' style='background: transparent;border: none;height: 0px;width: 0px;' />");
    var focusBodyElement = $('#focusInput')[0], temporaryResult = false;
    focusBodyElement.focus();
    focusBodyElement.onblur = function () {
        updateResult(true);
        return;
    };
    //will trigger onblur
    location.href = protocolStr;

    //Note: timeout could vary as per the browser version, have a higher value
    setTimeout(function () {
        focusBodyElement.onblur = null;
        if (protocolSupport[protocolStr]===null) {
            updateResult(false)
        }
    }, 1000);

}

最佳答案

我用过custom-protocol-detection过去在这里,虽然我的目标是所有浏览器。

话虽如此 - 在挖掘他们的源代码时,他们的策略似乎是将内容嵌入到由 javascript 创建的隐藏框架中。

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

source

源代码还包含适用于所有浏览器的策略。

关于javascript - 如何处理未在 Safari 上安装的自定义协议(protocol)仍然触发 onblur 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59248434/

相关文章:

javascript - Safari 和 Chrome 上的 Tinymce 换行问题

html - Windows(Chrome、Edge 等)和 Macos(Safari)中的边距不同

iphone - 调用协议(protocol)方法是否通过程序流控制?

javascript - 客户端如何知道发出是否失败? socket.emit() 有回调吗?

ios - 在 iPad 上,当浏览器为 'closed' 时,如何使网页上的嵌入声音停止播放?

javascript - 将日期作为查询字符串参数传递给共享点 ListView Web 部件

javascript - 在 chrome 86 中检测自定义协议(protocol)处理程序

javascript - 停止输入提交表单 - 得到奇怪的结果

javascript - 停止对依赖于 JSON-Pretty 的 JavaScript 进行缓存