Malheureusement, il n'y a pas de moyen facile d'y parvenir. Il n'y a certainement pas de méthode pour déterminer à l'avance si le gestionnaire de protocole est installé ou non.
Internet Explorer Comme vous l'avez mentionné, le protocolLong
mais j'ai du mal à faire en sorte qu'il renvoie autre chose que "Protocole inconnu" pour tous les gestionnaires de protocole personnalisés - si quelqu'un sait comment faire pour qu'IE renvoie la bonne valeur, merci de me le faire savoir afin que je puisse mettre à jour cette section. La meilleure solution que j'ai trouvée avec IE est de ajouter à la chaîne de l'agent utilisateur ou installez une extension de navigateur avec votre application qui expose une propriété accessible en Javascript.
Firefox est de loin le plus simple des principaux navigateurs, car il vous permet d'essayer de rattraper une tentative de navigation qui échoue. L'objet d'erreur renvoyé contient un name
dont la valeur est NS_ERROR_UNKNOWN_PROTOCOL
:
try {
iframe.contentWindow.location.href = "randomprotocolstring://test/";
} catch(e) {
if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL")
window.location = "/download/";
}
Firefox affichera sa propre boîte d'alerte :
Firefox ne sait pas comment ouvrir cette adresse, car le protocole (randomprotocolstring) n'est associé à aucun programme.
Une fois que vous avez fermé cette boîte, le catch
s'exécutera et vous disposerez d'une solution de repli efficace.
Le deuxième est Opéra qui vous permet d'utiliser les lois de la prévisibilité pour détecter le succès d'un protocole personnalisé de lien cliqué. Si un clic de protocole personnalisé fonctionne, la page restera au même endroit. Si aucun gestionnaire n'est installé, Opera naviguera vers une page d'erreur. Il est donc assez facile de le détecter à l'aide d'une iframe :
iframe.contentWindow.location = "randomprotocolstring://test/";
window.setTimeout(function () {
try {
alert(ifr.contentWindow.location);
} catch (e) { window.location = "/download/"; }
}, 0);
Les setTimeout
Il s'agit de s'assurer que nous vérifions l'emplacement après la navigation. Il est important de noter que si vous essayez d'accéder à la page, Opera lance une ReferenceException (erreur de sécurité inter-domaine). Cela n'a pas d'importance, car tout ce que nous avons besoin de savoir, c'est que l'emplacement est passé de about:blank
, donc a try...catch
fonctionne parfaitement.
Chrome est officiellement nulle à cet égard. Si un gestionnaire de protocole personnalisé échoue, il ne fait absolument rien. Si le gestionnaire fonctionne... vous l'avez deviné... il ne fait absolument rien. Il n'y a aucun moyen de faire la différence entre les deux, je le crains.
Je n'ai pas testé Safari mais je crains que ce soit la même chose que Chrome.
Nous vous invitons à essayer le code de test que j'ai écrit Je n'ai pas eu l'occasion de faire des recherches à ce sujet (j'avais moi-même un intérêt direct dans cette affaire). Il est compatible avec Opera et Firefox, mais ne fonctionne pas avec IE et Chrome.
4 votes
Vous pouvez consulter le document suivant stackoverflow.com/questions/836777/
1 votes
Merci, j'ai déjà essayé la plupart des méthodes décrites ici. Il semble qu'il n'y ait pas de bonne façon de réaliser cela dans tous les navigateurs populaires sans alertes ou autres problèmes.