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 属性,该属性保存着该表单所有 表单元素 的集 ...
随机推荐
- Day3 -4.9!受到毕设的突然袭击,一脸蒙蔽,学习暂时停止,明晚继续
PS:啊啊啊啊,慌张的不行,不详的预感终于爆发了,第二次毕设评图好突然,没办法了,竹径和学习突然搁置,明晚健身/建模/补更Day3,感到崩溃 ————————————————————————————— ...
- windows 环境下 dbnamodb 环境搭建与使用
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/installing.html 安装 AWS Command Line Interface ...
- mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...
- Curl测试socks5 or http 代理命令
测试socks5命令:curl --socks5 125.119.175.48:8909 http://example.com/ 测试http命令: curl --connect-timeout 2 ...
- PHP 利用PHPExcel 文件导入(也可保存到本地或者服务器)、导出
首先需要去官网http://www.php.cn/xiazai/leiku/1491,下载后只需要Classes目录下的文件即可. 1.PHPExcel导出方法实现过程 1 2 3 4 5 6 7 8 ...
- nginx做yum源
我这边环境是原先有个nginx只是做了代理转发,现在需要在通过nginx做yum源方便后期安装源 1.原先的配置代理转发,为不影响原先配置及端口,在http中最末尾加“include include ...
- dubbo服务达成jar包
<build> <finalName>dubbo-provider</finalName> <!-- jar包名,一般设置为提供者服务名 --> < ...
- 《修炼之道:.NET开发要点精讲》读书笔记(四)
委托的作用:1)它允许把方法作为参数,传递给其它的模块:2)它允许我们同时调用多个具有相同签名的方法:3)它允许我们异步调用任何方法. “方法签名”指方法的参数个数.参数类型以及返回值等,具有相同签名 ...
- django中views中方法的request参数
知其然亦要知其所以然 views每个方法的参数都是request,那么问题来了,request为何物? 首先,几乎每个方法都是取数据(无论是从数据库,还是从第三方接口),然后进行一定的处理,之后传给前 ...
- vue中created、mounted、 computed,watch,method 等方法整理
created:html加载完成之前,执行.执行顺序:父组件-子组件 mounted:html加载完成后执行.执行顺序:子组件-父组件 methods:事件方法执行 watch:watch是去监听一个 ...