La solución aceptada actualmente tiene un problema con Chrome para SSL https.Viendo el registro de la consola, Chrome bloquea la solicitud, ya que piensa el protocolo URL personalizada no es segura:
[blocked] The page at reports blah blah ran insecure content from customproto//blah blah
Aquí es una solución (esto me tomó unos días para investigar):
<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>
Este el código no funcionará para IE. He encontrado que al utilizar esta técnica, IE limita el argumento del protocolo personalizado a menos de 1000, ya que al usar la técnica de iFrame, IE permitirá 2083 caracteres.
La única manera de superar el límite de URL en JavaScript es chuck los datos y llamar varias veces. Si alguien quiere echar un vistazo a eso, por favor, hágame saber cómo va. Me gustaría usarlo
Para manejar las direcciones URL largas en la aplicación de la ejecución, pasar una ficha en la aplicación y hacer que ir a buscar los datos de una URL GET.
Así que por ahora estoy usando una función para Chrome/FF y otra función para IE.
Estos enlaces me ayudaron a desarrollar esta solución:
https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
Simulating a click in jQuery/JavaScript on a link
(Ojalá hubiera sabido esto hace unos días .... espero que esto ayude a alguien)
= =================================================
actualización: (8 horas más tarde)
=============================================== ===
Jake registró una gran solución para el cromo: https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
esto funciona solamente en cromo:
window.location.assign("customprotocol://");
se producirá un error en un iframe por lo que este está funcionando:
var w = (window.parent)?window.parent:window
w.location.assign(service + '://' + data)
================================== =============
Actualización: (semanas más tarde)
======================= ==============================
Todos los ejemplos de apertura del protocolo personalizado, incluido el mío, tienen un ":// "en la url. Y esto es lo que está causando las advertencias SSL.
Resulta que la solución es cambiar ": //" a ":"
dé su explicación:
src="x-myproto:query" .....
y las advertencias SSL desaparecerá.
============================================== ====
Seguimiento: (después de meses de uso en producción)
============================= =====================
Esto ha funcionado bien para chorme. Detecta el navegador y si Chrome hace esto:
var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')
Para IE y otros navegadores hago algo ligeramente diferente.
Tenga en cuenta que los navegadores imponen un límite a la cantidad de datos que puede poner en el protocolo url personalizado. Siempre que su cadena tenga menos de 800 caracteres, este parece ser el número mágico que funciona en todos los navegadores.
Ah, así que, en lugar de escribir 'x-myproto: // query? Furries' en la barra de direcciones, ¿abres un iframe con él, y luego Chrome usa la aplicación registrada existente para buscar lo que se va a mostrar dentro del iframe? –
Esto es necesario para nuestro complemento de Chrome, nadie ingresa la dirección directamente en la barra de ubicación del usuario, por lo que el iframe oculto es la mejor solución. – UncleMiF