Sfortunatamente, non esiste un modo semplice per raggiungere questo obiettivo. Non c'è certamente alcun metodo per predeterminare se il gestore del protocollo è installato o meno.
Internet Explorer, come lei ha ricordato, ha la proprietà protocolLong
ma sto avendo difficoltà a farla tornare qualcosa di diverso da "Sconosciuto Protocol" per tutti i gestori di protocollo su misura - se qualcuno sa come ottenere IE per tornare il valore corretto per favore fatemelo sapere così posso aggiornare questa sezione. La soluzione migliore che ho trovato con IE è append to the user agent string o installa un'estensione del browser insieme alla tua app che espone una proprietà accessibile Javascript.
Firefox è di gran lunga il più semplice tra i principali browser, in quanto consente di provare e rilevare un tentativo di navigazione che non riesce. L'oggetto di errore restituito contiene una proprietà name
il cui valore è NS_ERROR_UNKNOWN_PROTOCOL
:
try {
iframe.contentWindow.location.href = "randomprotocolstring://test/";
} catch(e) {
if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL")
window.location = "/download/";
}
Firefox si aprirà con una propria finestra di avviso:
Firefox non sa come aprire questo indirizzo, perché il protocollo (randomprotocolstring) non è associato ad alcun programma.
Una volta chiusa questa casella, verrà eseguito il blocco catch
e sarà disponibile un fallback funzionante.
Secondo è Opera, che consente di utilizzare le leggi di prevedibilità per rilevare il successo di un collegamento protocollo personalizzato cliccato. Se un clic del protocollo personalizzato funziona, la pagina rimarrà nella stessa posizione. Se non è installato alcun gestore, Opera passerà a una pagina di errore. Questo rende piuttosto facile da individuare con un iframe:
iframe.contentWindow.location = "randomprotocolstring://test/";
window.setTimeout(function() {
try {
alert(ifr.contentWindow.location);
} catch (e) { window.location = "/download/"; }
}, 0);
Il setTimeout
qui è quello di assicurarsi controlliamo la posizione dopo navigazione. È importante notare che se si tenta di accedere alla pagina, Opera genera una ReferenceException (errore di sicurezza tra domini). Non importa, perché tutto quello che dobbiamo sapere è che la posizione è cambiata da about:blank
, quindi un try...catch
funziona bene.
Chrome fa schifo ufficialmente con questo proposito. Se un gestore di protocollo personalizzato fallisce, lo fa assolutamente zip. Se il conduttore funziona ... hai indovinato ... lo fa assolutamente zip. Non ho modo di differenziare i due, temo.
Non ho provato Safari ma temo che sarebbe lo stesso di Chrome.
Si consiglia di provare lo test code I wrote mentre si esamina questo (ho avuto un interesse personale in esso stesso). Opera compatibile con Firefox e Firefox, ma attualmente non fa nulla in IE e Chrome.
Si potrebbe desiderare di avere una lettura di http://stackoverflow.com/questions/836777/how-to-detect-browsers-protocol-handlers –
Thx, già provato la maggior parte dei metodi descritti lì. Sembra che non ci sia un buon modo per ottenere questo risultato in tutti i browser più popolari senza avvisi o altri problemi. –