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)
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 :)
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.
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>
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();
});
});
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>