К сожалению, нет простого способа достичь этого. Конечно, нет способа заранее определить, установлен ли обработчик протокола.
Internet Explorer , как вы упомянули, обладает свойством protocolLong
, но у меня возникают проблемы с его возвратом для всех обработчиков пользовательских протоколов, кроме «Неизвестный протокол» - если кто-нибудь знает, как чтобы IE вернул правильное значение, пожалуйста, дайте мне знать, чтобы я мог обновить этот раздел. Лучшее решение, которое я нашел с IE, это добавить к строке агента пользователя или установить расширение браузера вместе с вашим приложением, которое предоставляет доступное свойство Javascript.
Firefox - безусловно, самый простой из основных браузеров, поскольку он позволит вам попытаться поймать попытку навигации, которая не удалась. Возвращенный объект ошибки содержит свойство name
, значение которого NS_ERROR_UNKNOWN_PROTOCOL
:
try {
iframe.contentWindow.location.href = "randomprotocolstring://test/";
} catch(e) {
if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL")
window.location = "/download/";
}
Firefox появится со своим собственным окном оповещения:
Firefox не знает, как открыть этот адрес, потому что протокол (randomprotocolstring) не связан ни с одной программой.
Как только вы закроете это окно, блок catch
будет выполнен, и у вас будет рабочий запасной вариант.
Вторым является Opera , которая позволяет вам применять законы предсказуемости для определения успешности щелчка по пользовательскому протоколу. Если щелчок настраиваемого протокола работает, страница останется в том же месте. Если обработчик не установлен, Opera перейдет на страницу с ошибкой. Это облегчает обнаружение с помощью iframe:
iframe.contentWindow.location = "randomprotocolstring://test/";
window.setTimeout(function () {
try {
alert(ifr.contentWindow.location);
} catch (e) { window.location = "/download/"; }
}, 0);
setTimeout
здесь, чтобы убедиться, что мы проверяем местоположение после навигации. Важно отметить, что если вы пытаетесь получить доступ к странице, Opera создает исключение ReferenceException (междоменная ошибка безопасности). Это не имеет значения, потому что все, что нам нужно знать, это то, что местоположение изменилось с about:blank
, поэтому try...catch
работает просто отлично.
Chrome официально отстой в этом отношении. Если обработчик пользовательского протокола завершается неудачно, он делает абсолютно zip. Если обработчик работает ... как вы уже догадались ... он делает абсолютно zip. Боюсь, нет никакой разницы между ними.
Я не тестировал Safari , но боюсь, он будет таким же, как Chrome.
Вы можете попробовать тестовый код , который я написал во время исследования этого (я лично интересовался им). Он совместим с Opera и Firefox, но в настоящее время ничего не делает в IE и Chrome.