我们正在使用注册自己协议的软件.我们可以从浏览器运行应用程序然后通过以下链接
customprotocol://do_this.
Run Code Online (Sandbox Code Playgroud)
但有没有办法检查用户系统支持的自定义协议?如果不是,我们首先要求用户安装软件.
例如:
if (canHandle ('customprotocol')) {
// run software
}
else {
// ask to install
}
Run Code Online (Sandbox Code Playgroud)
编辑 我知道protocolLong属性,但它只适用于IE.
And*_*y E 46
不幸的是,没有简单的方法来实现这一目标.当然没有预先确定是否安装协议处理程序的方法.
正如您所提到的,Internet Explorer具有该protocolLong
属性,但是我无法为所有自定义协议处理程序返回除"未知协议"之外的任何内容 - 如果有人知道如何让IE返回正确的值,请告诉我所以我可以更新这一节.我在IE中找到的最佳解决方案是附加到用户代理字符串或安装浏览器扩展以及暴露Javascript可访问属性的应用程序.
Firefox是迄今为止最主要的浏览器,因为它允许您尝试捕获失败的导航尝试.返回的错误对象包含一个name
属性,其值为NS_ERROR_UNKNOWN_PROTOCOL
:
try {
iframe.contentWindow.location.href = "randomprotocolstring://test/";
} catch(e) {
if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL")
window.location = "/download/";
}
Run Code Online (Sandbox Code Playgroud)
Firefox将弹出自己的警告框:
Firefox不知道如何打开此地址,因为协议(randomprotocolstring)与任何程序都没有关联.
关闭此框后,该catch
块将执行,并且您有一个工作后备.
其次是Opera,它允许您使用可预测性定律来检测单击的自定义协议链接的成功.如果自定义协议单击有效,则页面将保持相同的位置.如果没有安装处理程序,Opera将导航到错误页面.这样可以很容易地使用iframe进行检测:
iframe.contentWindow.location = "randomprotocolstring://test/";
window.setTimeout(function () {
try {
alert(ifr.contentWindow.location);
} catch (e) { window.location = "/download/"; }
}, 0);
Run Code Online (Sandbox Code Playgroud)
这setTimeout
是为了确保我们在导航后检查位置.重要的是要注意,如果您尝试访问该页面,Opera会抛出ReferenceException(跨域安全性错误).这没关系,因为我们需要知道的是位置改变了about:blank
,所以一切try...catch
正常.
Chrome在这方面正式糟透了.如果自定义协议处理程序失败,它绝对会拉链.如果处理程序有效...你猜对了......它绝对是拉链的.我害怕,无法区分这两者.
我还没有测试Safari,但我担心它会和Chrome一样.
欢迎您在调查时尝试我编写的测试代码(我自己对此感兴趣).它与Opera和Firefox交叉兼容,但目前在IE和Chrome中无效.
Gea*_*phy 11
为了充分利用我们自己的经验,我们使用FireBreath创建一个简单的跨平台插件.安装完成后,此插件会注册一个mime类型,可以在页面刷新后从浏览器javascript中检测到该类型.检测mime类型表示已安装协议处理程序.
if(IE) { //This bastard always needs special treatment
try {
var flash = new ActiveXObject("Plugin.Name");
} catch (e) {
//not installed
}
else { //firefox,chrome,opera
navigator.plugins.refresh(true);
var mimeTypes = navigator.mimeTypes;
var mime = navigator.mimeTypes['application/x-plugin-name'];
if(mime) {
//installed
} else {
//not installed
}
}
Run Code Online (Sandbox Code Playgroud)
Windows 8上的Internet Explorer 10引入了非常有用的navigator.msLaunchUri方法,用于启动自定义协议URL并检测成功或失败.例如:
if (typeof (navigator.msLaunchUri) == typeof (Function)) {
navigator.msLaunchUri(witchUrl,
function () { /* Success */ },
function () { /* Failure */ showError(); });
return;
}
Run Code Online (Sandbox Code Playgroud)
Windows 7/IE 9及更低版本支持@ mark-kahn建议的条件注释.