web-dev-qa-db-fra.com

vérification inter-navigateur la plus simple si le gestionnaire de protocole est enregistré

Lorsque l'utilisateur clique sur le lien avec un protocole personnalisé (comme myapp://superlink)

J'ai besoin de lancer une application ou d'autoriser l'utilisateur à télécharger et à exécuter l'application de configuration

Je cherche un moyen multi-navigateur pour vérifier si un protocole personnalisé est enregistré

J'ai essayé de déterminer cela en vérifiant l'agent utilisateur côté serveur (pour IE)

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform] "myapp" = ""

envoie

`....NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; **myapp**`

comme agent utilisateur

C'est une bonne façon, une configuration simple et facile:

il suffit de télécharger le fichier .reg et de l'exécuter ou de le propager via la politique ms windows

Je ne peux pas résoudre ce problème pour Chrome et Firefox

Existe-t-il une solution côté client (en js)?

Mon environnement: IE8 +, Chrome (dernier), Firefox (dernier)

29
jonny

Il y a ces vieilles astuces qui ne me manquent jamais.

La fonctionnalité principale dont vous avez besoin est setTimeout. Je vais vous dire en détail:

setTimeout(function() {
  window.location = "http://iTunes.com/app/yourapplocation";
}, 200);

// once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
window.location = "myapp://superlink";

Maintenant, vous avez mentionné que c'était peut-être un lien ou des liens, alors j'ai créé cette fonction Nice juste pour votre commodité:

code HTML

<a href="myapp://superlink" data-href-alt="http://iTunes.com/app/yourapplocation">Click here</a>

code JS

$("a[href*='myapp://']").click(function(e)
{
  var el = $(this);
  setTimeout(function() {
    window.location = el.data("data-href-alt");
  }, 200);

  // once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
  window.location = el.data("href");

  e.preventDefault();
});

J'espère que ceci vous aidera :)

21
kororo

J'ai eu un problème similaire où je devais vérifier si un protocole personnalisé est déjà enregistré (ce qui ouvrira un fichier exécutable), ou sinon ouvrir une page de téléchargement ou faire autre chose. Malheureusement, il n'y a pas de moyen facile de gérer cela car chaque navigateur se comporte différemment. J'ai essayé de collecter toutes les informations et de créer une bibliothèque plutôt générique pour cette question, vous pouvez jeter un oeil à:

https://github.com/ismailhabib/custom-protocol-detection

ps: la solution pour non Windows 8 IE est plutôt moche, mais je n'ai pas pu trouver de meilleure solution.

16
habsq

la solution de kororo ne fonctionnerait pas pour moi pour une raison quelconque, j'ai donc géré avec cette solution légèrement modifiée à la place.

<html>
<a id="link">Click Me</a>
<script>
var link = document.getElementById('link');
var timeout;
window.addEventListener('blur',function(e){
    window.clearTimeout(timeout);
})

link.addEventListener('click', function(e) { 

    timeout = window.setTimeout(function() {
      console.log('timeout');
      window.location = "https://myapp.net";
    }, 1000);

    window.location = "myapp://";
    e.preventDefault();
});
</script>
</html>
6
Houseman

Mise à jour de la réponse de Korono, cela a fonctionné pour moi:

$(function() {
    var timeIndex;
    $("a[href*='myapp://']").blur(function(e)
    {
        clearTimeout(timeIndex);
    });

    $("a[href*='myapp://']").click(function(e)
    {
      var el = $(this);
      timeIndex = setTimeout(function() {
        window.location = el.attr("data-href-alt");
      }, 200);

      // once you do the custom-uri, it should properly execute the handler, otherwise, the settimeout that you set before will kick in
      window.location = el.attr("href");
      e.preventDefault();
    });
});
2
Ron Teitelbaum

Salaam

Installer ismailhabib/custom-protocol-detection

En incluant ce fichier JS protocolcheck.js

Ensuite, écrivez du code quelque chose comme ça

<div id="protocol" href="myprotocol:[email protected]">Check Protocol</div>

<script>
        $("#protocol").click(function (event) {
            protocolCheck($(this).attr("href"), function () {
                    alert("protocol not recognized");
                });
            event.preventDefault ? event.preventDefault() : event.returnValue = false;
        });
</script>
0
Ali Jamal