Javascript高级编程学习笔记(32)—— 客户端检测(1)能力检测
能力检测
浏览器厂商虽然在实现公共接口方面投入了大量的精力
但是每种浏览器仍旧存在许多差异
为了让网页能跨浏览器的运行,对浏览器差异做的兼容处理自然无法避免
其中最常用的也就是我们现在所说的能力检测
什么是能力检测呢?
说白了,能力检测就是判断浏览器是否具备某个特定功能
然后进行对应的操作
这和浏览器检测有什么区别呢??
在很多情况下,我们纠结的不是用户使用的是什么浏览器
而是用户使用的浏览器是否有我们将要使用的功能,我们没有必要去管用户用的是什么浏览器,只需要知道用户浏览器有没有这项功能,有,怎么操作;没有,又如何替代
这就是所谓的能力检测(特性检测)
这种客户端检测模式的目标不是识别特定浏览器,而是根据浏览器的能力进行相应的操作
比如下面的例子:
function getElement(id){
if(document.getElementById){
return document.getElementById(id);
}else if(document.all){
return document.all[id];
}else{
throw new Error("No way to retrieve element!");
}
}
这个例子取自书中,由于书的版本较老,所以这里给出的是IE5以下对 getElementById 方法的兼容的处理
在进行类似上述的能力检测时
我们要注意一下几点:
1、先检测最通用的功能(保证代码的最优性能避免繁琐的多次判断)
2、不能根据能力来判断浏览器,因为有这一个功能的不一定只有一个浏览器,反之亦然
更可靠的能力检测
上方的例子存在一个问题,如果一个不支持document.all的浏览器,有开发人员给其设置了该属性,那么就会出现问题
所以更可靠的能力检测,就是不光要判断这个对象是否存在这个属性,我们还要判断这个属性值的类型
即在判断时不要直接 if 判断,而是使用typeof
typeof 除了避免开发人员导致的问题之外
还有一个作用,那就是针对IE中的 ActiveX 对象
这个对象如果不使用 typeof 检测其属性,那么将会报错
除此而外,浏览器也没有义务让 typeof 返回你认为正确的值,因为这和浏览器的内部实现有关
下面给出一个检测属性的函数,这个函数可能存在问题,但是至少在我的测试中没有发现,如果有错请大家留言告知
需要的小伙伴拿走就行
function isHostMethod(object, property){
var t = typeof object[property];
return t === "function" || (!!(t === 'object' && object[property])) || t === 'unknown';
}
// 参数 1、要检测的对象
// 2、要检测的属性名称
// 返回值 Boolean
PS. 就算这个方法现在没有问题,也不代表今后没有问题
因为有向下兼容,可是你见过向上兼容的嘛?毕竟浏览器厂商没有义务保证,一直维持实现方式不变
所以希望大家心里有个底,emm....
最后:能力检测不是浏览器检测!能力检测不是浏览器检测!!能力检测不是浏览器检测!!!
Javascript高级编程学习笔记(32)—— 客户端检测(1)能力检测的更多相关文章
- Javascript高级编程学习笔记(34)—— 客户端检测(3)用户代理检测
用户代理检测 前面的文章介绍的是如何检测浏览器对某一功能的支持情况 但是在实践中我们有些时候免不了需要知道用户到底是用的什么浏览器对我们的站点进行访问 这也是统计用户行为的一部分 用户代理检测这种方式 ...
- Javascript高级编程学习笔记(33)—— 客户端检测(2)怪癖检测
怪癖检测 和能力检测类似,但其目标不同 能力检测的目的是判断浏览器支不支持某种能力 而怪癖检测的目的是判断浏览器是否存在某些缺陷 这种时候需要我们执行一段代码来判断浏览器是否有这样的缺陷 或者说是怪癖 ...
- Javascript高级编程学习笔记(31)—— BOM(5)screen、history对象
screen对象 screen对象应该是BOM对象中最不常用的对象了 其主要用于提供客户端的显示能力信息 包括浏览器外部显示的信息,和像素的宽高等 这个对象的主要用于检测客户端能力,一般不会影响功能 ...
- Javascript高级编程学习笔记(49)—— DOM2和DOM3(1)DOM变化
DOM变化 我们知道DOM有许多的版本,其中DOM0和DOM2这两个级别以对事件的纳入标准而为人所知 但是呢,这里不讲事件,在后面会有专门和事件有关的部分作为详细讲解 这里就只讲一下DOM2和DOM3 ...
- Javascript高级编程学习笔记(36)—— DOM(2)Document
Documet类型 了解了基础的Node类型过后,我们来聊聊Node中的Document类型 我们知道所有的节点都继承自Node类型 所以除了Node类型公有的方法和类型之外,Document类型还有 ...
- Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)
错误 Javascript与WebGL之间的一个最大区别在于,WebGL的操作一般不会抛出错误 如果希望获取WebGL的错误信息,那么就需要手动调用 gl.getError() 方法 该方法会返回以 ...
- Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)
WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...
- Javascript高级编程学习笔记(96)—— WebGL(2) 类型化视图
类型化视图 类型化视图一般也被认为是一种类型化数组. 因为其元素必须是某种特定的数据类型,类型化视图都继承自 Dataview Int8Array: 表示8位二补整数(即二进制补数) Uint8Arr ...
- Javascript高级编程学习笔记(75)—— 表单(3)表单字段
表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...
随机推荐
- (三)Bootstrap.jar
catalina.bat 在最后启动了bootstrap.jar, 传递了start作为参数(如果多个参数的话,start在尾部). 然后org.apache.catalina.startup.Boo ...
- 检查手机是否安装外置SD卡
/** * 检测是否安装外置SD卡 * * @return */ public boolean checkSDcard() { StorageList list = new StorageList(t ...
- docker使用代理(测试docker 17.06)
环境:debian9 service docker stop sudo HTTP_PROXY=http://127.0.0.1:1080 dockerd sudo docker pull gcr.io ...
- skynet记录2:模块简介
稍后填坑 bson.so client.so lpeg.so md5.so skynet.so sproto.so gate.so harbor.so logger.so snlua. ...
- java常用集合浅层解析-面试必备
ArrayList 1.动态数组 2.线程不安全 3.存储空间连续 4.查询快,添加删除慢 构造方法 /** + Shared empty array instance used for defaul ...
- c#简单的数据库查询与绑定DataGridView。
1配置文件 (两种写法) <connectionStrings> <add name="connStr" connectionString="se ...
- Python之路(第三十三篇) 网络编程:socketserver深度解析
一.socketserver 模块介绍 socketserver是标准库中的一个高级模块,用于网络客户端与服务器的实现.(version = "0.4") 在python2中写作S ...
- mysql_事物
1) set autocommit=0 关闭自动提交 插入修改,只有commit 才最终存入 2) start transaction commit/rollback 3) show var ...
- 【Linux】vim的使用
使用vi和vim的原因:linux很多软件默认调用vi进行编辑,因此有必要熟悉它的使用规则 vi: 打开文件: vi 文件名 [一般模式]打开文件时进入一般模式,这个模式下的操作: 上下左右移动光标 ...
- DNN原理探究系列之目录与序章篇
序言: 神经网络结构,作为最成功的机器学习模型之一,其工作原理一直被埋藏得比较深,其解释性以至于被称为黑盒. 自己对于DNN的理解也只能算刚踏入了门槛,对于人脑的原理与DNN原理之间的互通性,一直是非 ...