Простейшая кросс-браузерная проверка регистрации протокола
Когда пользователь нажимает ссылку на собственный протокол (например, myapp://superlink
)
Мне нужно либо запустить приложение, либо разрешить пользователю загружать и запускать конфигурационное приложение
Я ищу кросс-браузерный способ проверить, зарегистрирован ли пользовательский протокол
Я попытался определить это, проверив сервер пользователя на стороне сервера (для IE)
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Настройки\5.0\Пользовательский агент\Почтовая платформа] "myapp" = ""
посылает
`....NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; **myapp**`
как пользовательский агент
Это хороший, чистый способ, простая конфигурация:
просто загрузите файл .reg и запустите его или пропустите через политику windows ms
Я не могу исправить это для Chrome и Firefox
Есть ли клиентское решение (в js)?
My enviroment: IE8 +, Chrome (последняя версия), Firefox (последняя версия)
Ответы
Ответ 1
Это старые трюки, которые всегда меня не терпят.
Основная функциональность, которая вам нужна, - setTimeout
. Я расскажу вам подробно:
setTimeout(function() {
window.location = "http://itunes.com/app/yourapplocation";
}, 200);
// once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
window.location = "myapp://superlink";
Теперь вы упомянули, что это, возможно, ссылка или ссылки, поэтому я сделал эту приятную функцию только для вашего удобства:
HTML-код
<a href="myapp://superlink" data-href-alt="http://itunes.com/app/yourapplocation">Click here</a>
JS-код
$("a[href*='myapp://']").click(function(e)
{
var el = $(this);
setTimeout(function() {
window.location = el.data("data-href-alt");
}, 200);
// once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
window.location = el.data("href");
e.preventDefault();
});
Надеюсь, это поможет вам
:)
Ответ 2
У меня была аналогичная проблема, когда мне нужно было проверить, зарегистрирован ли пользовательский протокол (который откроет исполняемый файл), или иначе открыть страницу загрузки или сделать что-то еще. К сожалению, нет простого способа справиться с этим, поскольку каждый браузер ведет себя по-разному. Я попытался собрать всю информацию и придумать довольно общую библиотеку по этому вопросу, вы можете взглянуть на:
https://github.com/ismailhabib/custom-protocol-detection
ps: решение для не Windows 8 IE довольно уродливо, но я не мог найти лучшего решения.
Ответ 3
Решение kororo для меня не сработало по какой-то причине, поэтому мне удалось это немного модифицированное решение.
<html>
<a id="link">Click Me</a>
<script>
var link = document.getElementById('link');
var timeout;
window.addEventListener('blur',function(e){
window.clearTimeout(timeout);
})
link.addEventListener('click', function(e) {
timeout = window.setTimeout(function() {
console.log('timeout');
window.location = "https://myapp.net";
}, 1000);
window.location = "myapp://";
e.preventDefault();
});
</script>
</html>
Ответ 4
Обновление для ответа Короно, это сработало для меня:
$(function() {
var timeIndex;
$("a[href*='myapp://']").blur(function(e)
{
clearTimeout(timeIndex);
});
$("a[href*='myapp://']").click(function(e)
{
var el = $(this);
timeIndex = setTimeout(function() {
window.location = el.attr("data-href-alt");
}, 200);
// once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
window.location = el.attr("href");
e.preventDefault();
});
});
Ответ 5
селям
Установите ismailhabib/пользовательский протокол обнаружения
Включая этот файл JS protocolcheck.js
Затем напишите код примерно так
<div id="protocol" href="myprotocol:[email protected]">Check Protocol</div>
<script>
$("#protocol").click(function (event) {
protocolCheck($(this).attr("href"), function () {
alert("protocol not recognized");
});
event.preventDefault ? event.preventDefault() : event.returnValue = false;
});
</script>