Javascript 如何检测浏览器';s协议处理程序?
我已经创建了一个自定义URL协议处理程序Javascript 如何检测浏览器';s协议处理程序?,javascript,browser,protocols,moniker,Javascript,Browser,Protocols,Moniker,我已经创建了一个自定义URL协议处理程序 http:// mailto:// 自定义:// 我已经注册了一个WinForms应用程序,以便做出相应的响应。这一切都很好 但我希望能够优雅地处理用户尚未安装自定义URL协议处理程序的情况 为了能够做到这一点,我需要能够检测浏览器的已注册协议处理程序,我假设使用JavaScript。但我一直无法找到一种方法来调查这些信息。我希望能找到解决这个问题的办法 感谢您能分享的任何想法。这将是一种非常,非常黑客式的方法。。。但这行得通吗 将链接按正常方式放入
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是迄今为止唯一一款),但不幸的是,目前无法检查处理程序是否已经存在,但没有后续操作。这似乎是有效使用自定义处理程序的一个关键功能,我们作为开发人员应该注意这个问题,以便将其实现。如果您可以控制尝试运行的程序(代码),查看用户是否成功运行应用程序的一种方法是:
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);