Как мне справиться с настраиваемым протоколом, не установленным в Safari, который все еще вызывает событие onblur?

У меня есть специальная программа проверки протокола, которая проверяет, установлен ли протокол.

Для Safari (так же, как и для Chrome) он фокусируется на элементе, запускает протокол и прослушивает размытие.

Однако в Safari, если протокол не установлен, браузер выдает всплывающее окно с предупреждением: «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);

}

person alasdair009    schedule 09.12.2019    source источник


Ответы (1)


Раньше я использовал здесь 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;
}

источник

Источник также содержит стратегии для всех браузеров.

person dcchuck    schedule 09.12.2019
comment
Интересно - я обновил свой вопрос выше на основе вашего ответа, но что-то все еще не работает. Любые идеи, что я пропустил? - person alasdair009; 10.12.2019
comment
Неважно, я использовал неправильный снифф агента пользователя для iOS, поэтому ваше решение в итоге сработало отлично. Спасибо за вашу помощь :) - person alasdair009; 10.12.2019