浏览器自定义协议检测

桌面客户端通过向操作系统注册私有自定义协议的方式,可以在web页面中以url的方式的调起桌面客户端。


我们常见的协议是http:// https:// ftp://等


当我们的桌面客户端注册了某个自定义协议之后,web页面就可以方便地跟PC客户端打交道了。

例如:

thunder:// 迅雷的
item:// itunes的
ed2k:// 电驴的


通过自定义协议的方式,比安装插件的方式更加简单且自然。通用性强。当然,功能上没有插件的方式强大。这要取决于产品设计的需求了。


不同浏览器使用自定义协议调起桌面客户端的提示:

Chrome

浏览器自定义协议检测_第1张图片


IE10:

浏览器自定义协议检测_第2张图片


Firefox:

浏览器自定义协议检测_第3张图片


但有一个问题是,如果本地没有安装桌面客户端的话,此时自定义协议就没有注册。没有注册的情况下,如果我们想处理一些引导用户下载及安装客户端的行为,就需要我们去检测浏览器是否支持该自定义协议了。不同的浏览器在没有注册该自定义协议时,表现出的行为也不尽相同。


因此我们有必要找到一种可以在检测到自定义协议没有注册时,处理该情形的方法。




    test
     


    
    
    
    



代码比较简单,主要解释一下launchApplication这个函数

function launchApplication(url, success, fail) {
	if('msLaunchUri' in navigator){//如果是windows8,IE10+,可以支持这种方式调起客户端。
		navigator.msLaunchUri(url, success, fail);
		return;
	}
	if (!isDone) return;//如果上次调起客户端没有完成,则直接返回,防止重复调用。
		isDone = false;

		assistEl.focus();
		assistEl.onblur = function () {
		if (document.activeElement && document.activeElement !== assistEl) {
			assistEl.focus(); //防止用户因为随机操作,而误认为是调起了客户端。
		} else {
			done();
			success();//如果焦点元素,快速失去了焦点,说明客户端已经被调起。
		}
	};
	timeout = setTimeout(function () {
		done();
		fail();//如果超过一定时间仍然没有变化,说明没有注册协议
	},1200);
	triggerEl.onerror = function () {
		done();
		fail();//进入错误事件回调函数说明没有注册协议
	};
	try {
		triggerEl.src = url;
	} catch(e) {
		done();
		fail(); //捕获到异常说明没有注册协议
	}
}
 
  

以上方法主要假定如果客户端调起,则页面会失去焦点。用这样的方式来“推测”客户端是否被调起。但这种做法并不准确。

有赖于客户端调起的速度,还可能会被一些特殊的操作干扰而导致判断错误。


虽然有以上缺点,但仍不失为一种可行的方法。


你可能感兴趣的:(浏览器自定义协议检测)