Obecne akceptowane rozwiązanie ma problem z Chrome dla protokołu SSL https.Oglądając dziennik konsoli Chrome zablokuje żądania, ponieważ uważa, że protokół niestandardowy adres URL nie jest bezpieczny:
[blocked] The page at reports blah blah ran insecure content from customproto//blah blah
Oto rozwiązanie (to zajęło mi kilka dni na badania):
<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>
ten kod nie będzie działał w IE. Zauważyłem, że przy użyciu tej techniki IE ogranicza argument protokołu niestandardowego do wartości mniejszej niż 1000, gdzie użycie techniki IF iFrame pozwoli na użycie 2083 znaków.
Jedynym sposobem na przezwyciężenie limitu URL w JavaScript jest Chuck danych i wywołać wiele razy. Jeśli ktoś chce to zrobić, daj mi znać, jak to działa. Chciałbym go użyć.
Do obsługi długich adresów URL w aplikacji wykonującego przekazać token do aplikacji i to idź danych z GET url.
Więc na razie używam jednej funkcji dla Chrome/FF i innej funkcji dla IE.
Linki te pomogły mi rozwinąć tego rozwiązania:
https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
Simulating a click in jQuery/JavaScript on a link
(szkoda, że nie wiadomo, to kilka dni temu .... nadzieję, że to pomoże ktoś)
= =================================================
Update: (8 godz później)
=============================================== ===
Jake napisali świetne rozwiązanie dla chrome: https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
to działa tylko w chrome:
window.location.assign("customprotocol://");
nie powiedzie się w iframe tak to działa:
var w = (window.parent)?window.parent:window
w.location.assign(service + '://' + data)
===================================== =============
Update: (tydzień później)
======================= ===========================
Wszystkie przykłady od otwarcia własnego protokołu, w tym moje własne, mają „:// "w adresie URL. I właśnie to powoduje ostrzeżenia SSL.
Okazuje się, że rozwiązaniem jest zmiana ": //" na ":"
więc to zrobić:
src="x-myproto:query" .....
i ostrzeżenia SSL odejdzie.
============================================== ====
następująco: (po miesiącach użytkowania produkcji)
============================= =====================
zostało to działa dobrze dla chorme. Wykryj przeglądarkę i jeśli to zrobisz:
var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')
Dla IE i innych przeglądarek robię coś nieco innego.
Zauważ, że przeglądarek nakładają ograniczenia na ile danych można umieścić w niestandardowego protokołu url. Tak długo jak twój ciąg ma mniej niż 800 znaków, wydaje się, że jest to magiczna liczba, która działa we wszystkich przeglądarkach.
Oh, więc zamiast wpisywać 'x-myproto: // zapytanie furries' w pasku adresu, otwierasz iframe z nim, a następnie Chrome wykorzystuje istniejące zarejestrowanym aplikacja do pobierania rzeczy do wyświetlania wewnątrz iframe? –
Jest to konieczne w przypadku naszej wtyczki do przeglądarki Chrome, nikt nie podaje adresu bezpośrednio na pasku adresu użytkownika, więc ukryte elementy iframe są najlepszym rozwiązaniem. – UncleMiF