español ejemplos descargar definicion curso caracteristicas javascript

ejemplos - javascript html



Cómo verificar si un protocolo personalizado es compatible (7)

Estamos usando un software que registra su propio protocolo. Podemos ejecutar la aplicación desde el navegador y luego mediante un enlace como:

customprotocol://do_this.

pero, ¿hay alguna manera de verificar si ese protocolo personalizado es compatible con el sistema del usuario? Si no, nos gustaría pedirle al usuario que instale primero el software.

P.ej:

if (canHandle (''customprotocol'')) { // run software } else { // ask to install }

Editar Sé acerca de la propiedad protocolLong pero funciona solo en IE.


Aquí hay una respuesta fuera de lo normal: instale una fuente inusual en el momento en que registre su protocolo personalizado. Luego use javascript para verificar si esa fuente existe, utilizando algo como esto .

Claro que es un truco, pero a diferencia de las otras respuestas, funcionaría en todos los navegadores y sistemas operativos.


Desafortunadamente, no hay una manera fácil de lograr esto. Ciertamente no hay un método para predeterminar si el controlador de protocolo está instalado o no.

Internet Explorer , como mencionaste, tiene la propiedad protocolLong , pero estoy teniendo problemas para que devuelva algo más que "Unknown Protocol" para todos los manejadores de protocolo personalizados. Si alguien sabe cómo conseguir que IE devuelva el valor correcto, déjame. saber para poder actualizar esta sección. La mejor solución que he encontrado con IE es agregar a la cadena de agente de usuario o instalar una extensión de navegador junto con su aplicación que expone una propiedad accesible de JavaScript.

Firefox es, de lejos, el más fácil de los principales navegadores, ya que le permitirá intentar atrapar un intento de navegación que falla. El objeto de error devuelto contiene una propiedad de name cuyo valor es NS_ERROR_UNKNOWN_PROTOCOL :

try { iframe.contentWindow.location.href = "randomprotocolstring://test/"; } catch(e) { if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL") window.location = "/download/"; }

Firefox aparecerá con su propio cuadro de alerta:

Firefox no sabe cómo abrir esta dirección, porque el protocolo (randomprotocolstring) no está asociado a ningún programa.

Una vez que cierre esta casilla, se ejecutará el bloque catch y tendrá una alternativa de trabajo.

El segundo es Opera , que le permite emplear las leyes de predictibilidad para detectar el éxito de un clic en un enlace de protocolo personalizado. Si un clic de protocolo personalizado funciona, la página seguirá siendo la misma. Si no hay ningún controlador instalado, Opera navegará a una página de error. Esto hace que sea bastante fácil de detectar con un iframe:

iframe.contentWindow.location = "randomprotocolstring://test/"; window.setTimeout(function () { try { alert(ifr.contentWindow.location); } catch (e) { window.location = "/download/"; } }, 0);

El setTimeout aquí es para asegurarnos de verificar la ubicación después de la navegación. Es importante tener en cuenta que si intenta acceder a la página, Opera lanza una ReferenceException (error de seguridad entre dominios). Eso no importa, porque todo lo que necesitamos saber es que la ubicación cambió de about:blank , así que try...catch funciona bien.

Chrome apesta oficialmente con este aspecto. Si un controlador de protocolo personalizado falla, se comprime completamente. Si el manejador funciona ... lo adivinaste ... se trata de un zip. No hay forma de diferenciar entre los dos, me temo.

No he probado Safari pero me temo que sería lo mismo que Chrome.

Le invitamos a probar el código de prueba que escribí mientras investigaba esto (yo tenía un gran interés en él). Es compatible con Opera y Firefox, pero actualmente no hace nada en IE y Chrome.


En dispositivos móviles, puede usar un iframe incorporado para cambiar automáticamente entre el protocolo personalizado y uno conocido (web o tienda de aplicaciones), consulte https://gist.github.com/2662899


Internet Explorer 10 en Windows 8 introdujo el muy útil método navigator.msLaunchUri para iniciar una URL de protocolo personalizado y detectar el éxito o el fracaso. Por ejemplo:

if (typeof (navigator.msLaunchUri) == typeof (Function)) { navigator.msLaunchUri(witchUrl, function () { /* Success */ }, function () { /* Failure */ showError(); }); return; }

Windows 7 / IE 9 y versiones posteriores admiten comentarios condicionales tal como sugiere @ mark-kahn.



Solo para compartir nuestra experiencia, utilizamos FireBreath para crear un plugin multiplataforma simple. Una vez instalado, este complemento registra un tipo de mimo que se puede detectar desde el navegador javascript después de actualizar la página. La detección del tipo mime indica que el controlador de protocolo está instalado.

if(IE) { //This bastard always needs special treatment try { var flash = new ActiveXObject("Plugin.Name"); } catch (e) { //not installed } else { //firefox,chrome,opera navigator.plugins.refresh(true); var mimeTypes = navigator.mimeTypes; var mime = navigator.mimeTypes[''application/x-plugin-name'']; if(mime) { //installed } else { //not installed } }


Solo quiero explicar más respuestas anteriores de Mark (algunas personas no entendieron, por ejemplo, user7892745).

1) Cuando inicia su página web o aplicación web, busca una fuente inusual (algo así como Chinese Konfuciuz font http://www.fontspace.com/apostrophic-lab/konfuciuz ).

A continuación se muestra el código de la página web de muestra con función que verifica la fuente (llamada isFontAvailable):

<!DOCTYPE html> <html> <head> </head> <body> <script> /** * Checks if a font is available to be used on a web page. * * @param {String} fontName The name of the font to check * @return {Boolean} * @license MIT * @copyright Sam Clarke 2013 * @author Sam Clarke <[email protected]> */ (function (document) { var width; var body = document.body; var container = document.createElement(''span''); container.innerHTML = Array(100).join(''wi''); container.style.cssText = [ ''position:absolute'', ''width:auto'', ''font-size:128px'', ''left:-99999px'' ].join('' !important;''); var getWidth = function (fontFamily) { container.style.fontFamily = fontFamily; body.appendChild(container); width = container.clientWidth; body.removeChild(container); return width; }; // Pre compute the widths of monospace, serif & sans-serif // to improve performance. var monoWidth = getWidth(''monospace''); var serifWidth = getWidth(''serif''); var sansWidth = getWidth(''sans-serif''); window.isFontAvailable = function (font) { return monoWidth !== getWidth(font + '',monospace'') || sansWidth !== getWidth(font + '',sans-serif'') || serifWidth !== getWidth(font + '',serif''); }; })(document); function isProtocolAvailable() { if (isFontAvailable(''Konfuciuz'')) { return true; } else { return false; } } function checkProtocolAvail() { if (isProtocolAvailable()) { alert(''Custom protocol is available!''); } else { alert(''Please run executable to install protocol!''); } } </script> <h3>Check if custom protocol was installed or not</h3> <pre> <input type="button" value="Check if custom protocol was installed!" onclick="checkProtocolAvail()"> </body> </html>

2) La primera vez que el usuario abre esta página, la fuente no se instalará, por lo que recibirá un mensaje que dice "Ejecute el archivo ejecutable para instalar el protocolo personalizado ...".

3) Ejecutará el ejecutable que instalará la fuente. Su ejecutable solo puede copiar el archivo de fuente (en mi caso es KONFUC __. Ttf) en el directorio C: / Windows o usando un código como este (ejemplo en Delphi):

// Adding the font .. AddFontResource(PChar(''XXXFont.TTF'')); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

4) Después de eso, cuando el usuario ejecuta nuevamente la aplicación web, obtiene "¡El protocolo personalizado está disponible!" mensaje porque la fuente se instaló esta vez.

Probado en Google Chrome, Internet Explorer y Firefox: ¡funciona genial!