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



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

我需要启动一个应用程序或允许用户下载和运行配置应用程序

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

我试图通过检查用户代理服务器端(IE)来确定这一点

微软软件 Wow6432Node [HKEY_LOCAL_MACHINE Windows CurrentVersion 互联网设置5.0User AgentPost Platform] "myapp"="

发送

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

用户代理

这是一个很好的,干净的方式,简单的配置:

只需下载。reg文件并运行它或通过ms Windows策略传播

我无法为Chrome和Firefox修复这个问题

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

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

有一种古老的把戏,它总是不会让我失望。

您需要的核心功能是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";

现在你提到它可能是一个或多个链接,所以我做了这个很好的函数,只是为了方便你:

<a href="myapp://superlink" data-href-alt="http://itunes.com/app/yourapplocation">Click here</a>
<<p> JS代码/strong>
$("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();
});

希望这对你有帮助:)

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

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

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

由于某些原因,

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>

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

所以我的建议是不要坚持试图让它工作

最好的情况是,如果你试图得到这个工作,你成功了,直到某些浏览器删除了允许你"破解"的机制。你检查url协议的方式,然后你又回到了原点。

一个更简单的方法是做一些非常大的网站所做的,并在你的页面上写一些javascript,比如:

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

,不管它能不能工作,然后在页面上显示一条消息,上面写着"如果这个不能工作,那么请在这样那样的链接上下载我们的软件"

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

Salaam

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

最新更新