重看Javascript高级程序设计,第9章:客户端检测

本章内容

  1. 使用能力检测
  2. 用户代理检测的历史
  3. 选择检测方式

 1. 能力检测

最广泛的客户端检测模式,又称特性检测。能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。这种方式只需要确定浏览器支持特定的能力,就可以给出解决方案。如下:

if(object.properyInQuestion){
				//使用object.properyInQuestion
			}
			//举例说明,早期IE5不支持document.getElementById()
			//类似下面的能力检测代码
			function getId(id){
				if(document.getElementById(id)){
					return document.getElementById(id)
				}else if(document.all){
					return document.all(id)
				}else{
					throw new Error('都不支持')
				}
			}
			
			//理解能力检测,首先理解两个重要概念.
			//第一就是先检测达成目的的最常用的特性.先检测最常用的特性可以保证代码最优化.
			//第二就是必须测试实际要用到的特性.一个特性存在,不一定意味着另一个特性也存在.如下:
			function getWidth(){
				if(document.all){
					//假设是IE 
					return document.documentElement.clientWidth	//错误的用法
				}else{
					return window.innerWidth
				}
			}
			

1.1 更可靠的能力检测

//更可靠的能力检测
			function isSort(object){
				return !!object.sort
			}
			//检测某个属性是否存在并不能确定对象是否支持排序.更好的方式是检测sort是不是一个函数
			function isSorttable(object){
				return typeof object.sort == 'function'
			}
			//在可能的情况下,要尽量使用typeof进行能力检测.
			
			//在IE8以及之前版本中不行
			function hasElement(){
				return typeof document.createElement == 'function'
			}
			//IE9修复了
			
			//在IE中会导致错误
			var xhr = new ActiveXObject('Microsoft.XMLHttp')
			if(xhr.open){		//这里会发生错误
				//执行操作
			}
			
			//在浏览器环境下测试任何对象的某个特性是否存在,如下:
			function isHostMethod(obj,pro){
				var t = typeof obj[pro]
				return t == 'function' || (!!(t == 'object' && obj[pro])) || t == 'unknow'
			}

 1.2 能力检测,不是浏览器检测

var isFirefox = !!(navigator.vendor && navigator.vendorSub)
			//
			var isIe = !!(document.all && document.uniqueID)
			
			//检测浏览器是否支持Netscape风格的插件
			var hs = !!(navigator.plugins && navigator.plugins.length);
			//确定浏览器是否具有DOM1级规定的能力
			var hsdom1 = !!(document.getElementById && document.createElement && document.getElementsByTagName)

 2.怪癖检测

//也就是检测浏览器中存在什么缺陷bug
			var hasBug = function(){
				var o = {toString:function(){}},
				for(var prop in o){
					if(prop == 'toString'){
						return false
					}
				}
				return true
			}();
			//另一个
			var hasBug1 = function(){
				var o = {toString:function(){}},
				var count = 0;
				for(var prop in o){
					if(prop == 'toString'){
						count++
					}
				}
				return (count > 1)
			}()

 3. 用户代理检测

 用户代理检测通过检测用户代理字符串来确定实际使用的浏览器。在每一次HTTP请求过程中,用户代理字符串作为相应首部发送的,而且该字符串可以通过JS的navigator.userAgent属性访问。

电子欺骗就是指浏览器通过在自己的用户代理字符串加入一些错误或误导性信息,来达到欺骗服务器的目的。

3.2 用户代理字符串检测技术 

//该方式不推荐
			if(isIE6 || isIE7){						//不推荐
				//代码
			}
			//可以优化成下面的
			if(ieVer >= 6){
				//代码
			}
			//封装的检测脚本.基本代码结构如下:
			var client = function(){
				var engine = {
					//呈现引擎
					ie:0,
					gecko:0,
					webkit:0,
					khtml:0,
					opera:0,
					//具体版本号
					ver:null
				};
				//浏览器
				var browser = {
					ie:0,
					firefox:0,
					safari:0,
					konq:0,
					opera:0,
					chrome:0,
					//具体的版本
					ver:null
				};
				//识别平台
				var system = {
					win:false,
					mac:false,
					x11:false
				}
				//在此检测呈现引擎.平台和设备
				return {
					engine : engine,
					browser:browser,
					system:system
				}
			}()
			//可以配套使用下面的检测代码
			if(client.engine.ie){						//如果是ie,client.id的值应该大于0
				//针对IE的代码
			}else if{client.engine.gecko > 1.5}{
				if(clinet.engine.ver == '1.8.1'){
					//针对这个版本执行某些操作
				}
			}
			//将版本的字符串保存在了engine.ver中,浮点数值的版本保存在了engine.opera中
			//检测opera
			if(window.opera){
				
			}
			//检测webkit
			var ua = navigator.userAgent
			if(window.opera){
				engine.ver = browser.ver = window.opera.version()
				engine.opera = browser.opera = parseFloat(engine.ver)
			}else if(/AppleWebKit\/(\S+)/.test(ua)){
				engine.ver = RegExp["$1"];
				engine.webkit = parseFloat(engine.ver)
				//确定是chrome还是safari
				if(/Chrome\/(\S+)/.test(ua)){
					browser.ver = RegExp["$1"]
					browser.chrome = parseFloat(browser.ver)
				}else if(/Version\/(\S+)/.test(ua)){
					browser.ver = RegExp["$1"];
					browser.safari = parseFloat(browser.ver)
				}else{
					//近似的确定版本号
					var safariVersion = 1;
					if(engine.webkit < 100){
						safariVersion = 1
					}else if(engine.webkit < 312){
						safariVersion = 1.2;
					}else if(engine.webkit < 412){
						safariVersion = 1.3
					}else{
						safariVersion = 2
					}
					browser.safari = browser.ver = safariVersion
				}
			}else if(/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){
				engine.ver = browser.ver = RegExp["$1"];
				engine.khtml = browser.konq = parseFloat(engine.ver)
			}else if(/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){
				engine.ver = RegExp["$1"]
				engine.gecko = parseFloat(engine.ver)
				//确定是不是firefox
				if(/Firefox\/(\S+)/.test(ua)){
					browserver = RegExp["$1"]
					browser.firefox = parseFloat(browser.ver)
				}
			}else if(/MSIE([^;]+)/.test(ua)){
				engine.ver = browser.ver = RegExp["$1"]
				engine.ie = browser.ie = parseFloat(engine.ver)
			}
			
			//有了上面的代码,可以在配套使用下面的直接使用逻辑
			if(client.engine.webkit){
				if(client.browser.chrome){
					//执行针对chrome的代码
				}else if(client.browser.safari){
					//执行针对safari的代码
				}
			}else if(client.engine.gecko){
				if(client.browser.firefox){
					//执行针对firefox的代码
				}else{
					//执行针对其他gecko的代码
				}
			}
			
			
			//检测平台
			var p = navigator.platform
			system.win = p.indexOf("Win") == 0
			system.mac = p.indexOf("Mac") == 0;
			system.x11 = (p.indexOf("X11") == 0) || (p.indexOf("Linux") == 0)

4. 小结

由于浏览器间存在差别,所以需要根据不同的浏览器能力编写不同的代码。下列常用的方法:

能力检测:编写代码之前检测特定浏览器的能力。例如,脚本在调用某个函数之前,可能要先检测该函数是否存在,能力检测无法精确的检测特定的浏览器和版本 。

怪癖检测:怪癖实际上是浏览器实现中存在的bug。怪癖检测无法精确的检测特定的浏览器和版本。

用户代理检测:通过检测用户代理字符串来识别浏览器。用户代理字符串中包含大量与浏览器有关的信息,包括浏览器、平台、操作系统以及浏览器版本。通过用户代理字符串可以检测出浏览器所用的呈现引擎以及所在的平台,包括移动设备和游戏系统。

在决定使用哪种客户端检测方式时,一般应优先考虑使用能力检测。怪癖检测是确定应该如何处理代码的第二选择。而用户代理检测是客户端检测的最后一种方案,因此这种方法对用户代理字符串具有很强的依赖性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值