В текущем принятом решении есть проблема с Chrome для SSL https. Наблюдая за журналом консоли, Chrome блокирует запрос, поскольку считает, что пользовательский протокол URL-адресов небезопасен:
[blocked] The page at reports blah blah ran insecure content from customproto//blah blah
Вот решение (на поиски которого у меня ушло несколько дней):
<input type='button' value='Test Custom Url' onclick='exec()'>
<script>
function submitRequest(buttonId) {
var d = (window.parent)?window.parent.document:window.document
if (d.getElementById(buttonId) == null || d.getElementById(buttonId) == undefined) return;
if (d.getElementById(buttonId).dispatchEvent) {
var e = d.createEvent("MouseEvents");
e.initEvent("click", true, true);
d.getElementById(buttonId).dispatchEvent(e);
}
else {
d.getElementById(buttonId).click();
}
}
function exec(){
var d = (window.parent)?window.parent.document:window.document
var f = d.getElementById('customUrlLink')
if (f ) {f.parentNode.removeChild(f);}
var a = d.createElement('a');
a.href = 'mycustomproto://arg1';
a.innerHTML = "Link"
a.setAttribute('id', 'customUrlLink');
a.setAttribute("style", "display:none; ");
d.body.appendChild(a);
submitRequest("customUrlLink");
}
</script>
Этот код не будет работать для IE. Я обнаружил, что при использовании этой техники IE ограничивает аргумент пользовательского протокола менее 1000, тогда как при использовании техники iFrame IE допускает 2083 символа.
Единственный способ преодолеть ограничение URL в javascript - это перебрасывать данные и вызывать их несколько раз. Если кто-то захочет нанести удар, пожалуйста, дайте мне знать, как это происходит. Я хотел бы использовать это.
Чтобы обработать длинные URL-адреса в исполняемом приложении, передайте токен в приложение и попросите его получить данные из URL-адреса GET.
Так что сейчас я использую одну функцию для Chrome / FF и другую функцию для IE.
Эти ссылки помогли мне разработать это решение:
https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
Имитация клика в jQuery / JavaScript по ссылке
(жаль, что я знал это несколько дней назад .... надеюсь, это кому-нибудь поможет)
=============================================== ===
Обновление: (через 8 часов)
=============================================== ===
Джейк опубликовал отличное решение для хрома: https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
Это работает только в Chrome:
window.location.assign("customprotocol://");
В iframe произойдет сбой, поэтому это работает:
var w = (window.parent)?window.parent:window
w.location.assign(service + '://' + data)
=============================================== ===
Обновление: (недели спустя)
=============================================== ===
Все примеры открытия пользовательского протокола, включая мой собственный, имеют в URL ": //". И это то, что вызывает предупреждения SSL.
Оказывается, решение состоит в том, чтобы изменить ": //" на ":"
так сделайте это:
src="x-myproto:query" .....
и предупреждения SSL исчезнут.
=============================================== ===
Следуйте: (после нескольких месяцев использования продукции)
=============================================== ===
Это хорошо работает для chorme. Определите браузер и, если Chrome сделает это:
var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')
Для IE и других браузеров я делаю что-то немного другое.
Обратите внимание, что браузеры накладывают ограничение на объем данных, которые вы можете поместить в собственный протокол URL. Пока ваша строка меньше 800 символов, похоже, это магическое число, которое работает во всех браузерах.