最简单的跨浏览器检查协议处理程序是否已注册

时间:2014-07-16 11:13:40

标签: javascript protocol-handler

当用户点击自定义协议(如myapp://superlink

的链接时

我需要启动应用或允许用户下载并运行配置应用

我正在寻找跨浏览器方式来检查自定义协议是否已注册

我试图通过检查用户代理服务器端(对于IE)

来确定这一点
  

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion \互联网   设置\ 5.0 \用户代理\发布平台]" myapp" =""

发送

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

作为用户代理

这很好,干净,配置简单:

只需下载.reg文件并运行或通过ms windows策略传播

我无法解决Chrome和Firefox的问题

是否有任何客户端解决方案(在js中)?

我的环境:IE8 +,Chrome(最新),Firefox(最新)

6 个答案:

答案 0 :(得分:19)

有这些老技巧,它永远不会让我失望。

您需要的核心功能是setTimeout。我会详细告诉你:

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";

现在你提到它可能是一个链接或链接所以我为了你的方便而做了这个很好的功能:

HTML代码

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

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

希望这会对你有所帮助 :)

答案 1 :(得分:14)

我遇到了类似的问题,我需要检查自定义协议是否已经注册(将打开可执行文件),或者打开下载页面或执行其他操作。不幸的是,没有简单的方法可以解决这个问题,因为每个浏览器的行为都不同我试图收集所有信息并为此提出一个相当通用的库,你可以看一下:

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

ps:非Windows 8 IE的解决方案相当丑陋,但我找不到更好的解决方案。

答案 2 :(得分:5)

由于某些原因,kororo的解决方案对我不起作用,所以我设法使用这个稍微修改过的解决方案。

<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>

答案 3 :(得分:2)

更新Korono的答案,这对我有用:

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

答案 4 :(得分:1)

请注意,截至 2020 年 2 月,似乎没有可行的方法来做到这一点。 仅考虑 Chrome,@kororo 或 @habsq 的解决方案目前都不起作用。 原因是我们试图通过检查 URL 协议处理程序是否存在来实现的目标实际上被 some people 视为存在安全风险。

所以我的建议是不要坚持尝试让它发挥作用。

如果您尝试完成这项工作,最好的情况是您会成功,直到某些浏览器删除了让您“破解”检查 url 协议的机制,然后您又回到了原点。< /p>

这里的一个更简单的方法是做甚至非常大的网站都会做的事情,并在您的页面上使用 javascript 说明:

window.location = "myprotocol://asdf";

这会起作用或不起作用,然后在页面上显示一条消息,上面写着“如果这不起作用,那么请从某某链接下载我们的软件”

答案 5 :(得分:0)

萨拉姆

安装ismailhabib/custom-protocol-detection

通过包含此JS文件protocolcheck.js

然后编写类似这样的代码

<div id="protocol" href="myprotocol:johndoe@somewhere.com">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>