Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检测浏览器';s协议处理程序?_Javascript_Browser_Protocols_Moniker - Fatal编程技术网

Javascript 如何检测浏览器';s协议处理程序?

Javascript 如何检测浏览器';s协议处理程序?,javascript,browser,protocols,moniker,Javascript,Browser,Protocols,Moniker,我已经创建了一个自定义URL协议处理程序 http:// mailto:// 自定义:// 我已经注册了一个WinForms应用程序,以便做出相应的响应。这一切都很好 但我希望能够优雅地处理用户尚未安装自定义URL协议处理程序的情况 为了能够做到这一点,我需要能够检测浏览器的已注册协议处理程序,我假设使用JavaScript。但我一直无法找到一种方法来调查这些信息。我希望能找到解决这个问题的办法 感谢您能分享的任何想法。这将是一种非常,非常黑客式的方法。。。但这行得通吗 将链接按正常方式放入

我已经创建了一个自定义URL协议处理程序

http://

mailto://

自定义://

我已经注册了一个WinForms应用程序,以便做出相应的响应。这一切都很好

但我希望能够优雅地处理用户尚未安装自定义URL协议处理程序的情况

为了能够做到这一点,我需要能够检测浏览器的已注册协议处理程序,我假设使用JavaScript。但我一直无法找到一种方法来调查这些信息。我希望能找到解决这个问题的办法

感谢您能分享的任何想法。

这将是一种非常,非常黑客式的方法。。。但这行得通吗

  • 将链接按正常方式放入
  • 但是在它上面附加一个onclick处理程序,它会设置一个计时器并为窗口添加一个onblur处理程序
  • (理论上)如果浏览器处理链接(应用程序X)将加载从窗口窃取焦点
  • 如果触发onblur事件,请清除计时器
  • 否则,在3-5秒内让超时触发。。。并通知用户“嗯,看起来您没有安装Mega Uber Cool应用程序……您想现在安装吗?(确定)(取消)”

远离防弹。。。但它可能会有所帮助?

这不是一项微不足道的任务;一个选项可能是使用签名代码,您可以利用它访问注册表和/或文件系统(请注意,这是一个选项)。代码签名也没有统一的API或规范,因此需要为每个目标浏览器生成特定的代码。支持噩梦


另外,我知道,游戏内容交付系统似乎也没有解决这个问题。

你说你需要检测浏览器的协议处理程序-真的吗


如果您做了类似于从sourceforge下载文件时发生的事情,会怎么样?假设你想打开myapp://something. 与其简单地创建指向它的链接,不如创建指向另一个通过HTTP访问的HTML页面的链接。然后,在该页面上,说您正试图为他们打开应用程序。如果不起作用,他们需要安装你的应用程序,他们可以通过点击你提供的链接来完成。如果它真的能工作,那么你就万事大吉了。

似乎没有直接的方法通过javascript来检测是否存在已注册协议处理程序的已安装应用程序

在iTunes模式中,苹果向其服务器提供URL,然后服务器提供运行某些javascript的页面:

因此iTunes安装程序显然为主要浏览器部署了插件,然后可以检测到这些浏览器的存在


如果安装了插件,那么您可以合理地确定重定向到特定于应用程序的url会成功。

最简单的解决方案是第一次询问用户

每个示例使用Javascript确认对话框:

You need this software to be able to read this link. Did you install it ?

if yes: create a cookie to not ask next time; return false and the link applies
if false: window.location.href = '/downloadpage/'

我正在尝试做类似的事情,我刚刚发现了一个与Firefox兼容的技巧。如果你把它和IE的技巧结合起来,你可以有一个在两个主要浏览器上都能工作的(我不确定它是否在Safari中工作,我知道它在Chrome中不工作)

为了使其正常工作,您还需要在页面上的某个位置有一个隐藏链接,如下所示:

<a id="testprotocollink" href="custom://testprotocol" style="display: none;">testprotocollink</a>
function OpenCustomLink(link) {

    var w = window.open(link, 'xyz', 'status=0,toolbar=0,menubar=0,height=0,width=0,top=-10,left=-10');
    if(w == null) {            
        //Work Fine
    }
    else {
        w.close();
        if (confirm('You Need a Custom Program. Do you want to install?')) {
            window.location = 'SetupCustomProtocol.exe'; //URL for installer
        }
    }
}


这有点粗糙,但它可以工作。不幸的是,Firefox版本仍然会弹出当您尝试访问未知协议的链接时出现的默认警报,但在警报解除后,它将运行您的代码。

您可以尝试以下操作:

<a id="testprotocollink" href="custom://testprotocol" style="display: none;">testprotocollink</a>
function OpenCustomLink(link) {

    var w = window.open(link, 'xyz', 'status=0,toolbar=0,menubar=0,height=0,width=0,top=-10,left=-10');
    if(w == null) {            
        //Work Fine
    }
    else {
        w.close();
        if (confirm('You Need a Custom Program. Do you want to install?')) {
            window.location = 'SetupCustomProtocol.exe'; //URL for installer
        }
    }
}

这是Microsoft支持部门推荐的IE方法

“如果您对安装在用户机器上的二进制文件有一定的控制权,那么在脚本中检查UA似乎是一种相关的方法: HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform “--以百万美元支持

每个网页都可以访问userAgent字符串,如果您删除一个自定义的post平台值,那么使用navigator.userAgent在javascript中检测这个值是非常简单的

幸运的是,其他主要浏览器如Firefox和Chrome(Safari除外:())不会抛出“未找到页面”单击带有自定义协议的链接时出错,并且该协议未安装在用户计算机上。IE在这里是非常不可原谅的,任何在不可见的框架中单击或捕获javascript错误的技巧都不起作用,并最终导致丑陋的“网页无法显示”错误。在我们的案例中,我们使用的技巧是通知具有特定于浏览器的图像的用户,单击自定义协议链接将打开一个应用程序。如果他们没有发现该应用程序正在打开,他们可以单击“安装”页。就XD而言,此WPRK方法优于IE的ActiveX方法。 对于FF和Chrome,只需在没有任何检测的情况下启动自定义协议。让用户告诉您他看到了什么。
对于Safari,:(HTML5定义还没有答案(据我所知,Firefox是迄今为止唯一一款),但不幸的是,目前无法检查处理程序是否已经存在,但没有后续操作。这似乎是有效使用自定义处理程序的一个关键功能,我们作为开发人员应该注意这个问题,以便将其实现。

如果您可以控制尝试运行的程序(代码),查看用户是否成功运行应用程序的一种方法是:

  • 在尝试打开自定义协议之前,向服务器脚本发出AJAX请求,该脚本将用户的意图保存在数据库中(例如,保存用户ID和他想要做的事情)

  • 尝试打开程序,并传递意图数据

  • 让程序请求服务器删除数据库条目(使用意图数据查找
    function launchCustomProtocol(elem, url, callback) {
        var iframe, myWindow, success = false;
    
        if (Browser.name === "Internet Explorer") {
            myWindow = window.open('', '', 'width=0,height=0');
            myWindow.document.write("<iframe src='" + url + "'></iframe>");
    
            setTimeout(function () {
                try {
                    myWindow.location.href;
                    success = true;
                } catch (ex) {
                    console.log(ex);
                }
    
                if (success) {
                    myWindow.setTimeout('window.close()', 100);
                } else {
                    myWindow.close();
                }
    
                callback(success);
            }, 100);
        } else if (Browser.name === "Firefox") {
            try {
                iframe = $("<iframe />");
                iframe.css({"display": "none"});
                iframe.appendTo("body");
                iframe[0].contentWindow.location.href = url;
    
                success = true;
            } catch (ex) {
                success = false;
            }
    
            iframe.remove();
    
            callback(success);
        } else if (Browser.name === "Chrome") {
            elem.css({"outline": 0});
            elem.attr("tabindex", "1");
            elem.focus();
    
            elem.blur(function () {
                success = true;
                callback(true);  // true
            });
    
            location.href = url;
    
            setTimeout(function () {
                elem.off('blur');
                elem.removeAttr("tabindex");
    
                if (!success) {
                    callback(false);  // false
                }
            }, 1000);
        } else if (Browser.name === "Safari") {
            if (myappinstalledflag) {
                location.href = url;
                success = true;
            } else {
                success = false;
            }
    
            callback(success);
        }
    }
    
    window.postMessage("myappinstalled", window.location.origin);
    
    window.addEventListener('message', function (msg) {
        if (msg.data === "myappinstalled") {
            myappinstalledflag = true;
        }
    }, false);