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 属性,该属性保存着该表单所有 表单元素 的集 ...
随机推荐
- Win7远程桌面:发生身份验证错误
下载并安装KB4103718补丁,安装完成后重启计算机 http://www.catalog.update.microsoft.com/Search.aspx?q=KB4103718 根据操作系统选择 ...
- MongoDB、PyMongo数据操作
MongoDB 命令 C:\Program Files\MongoDB\Server\4.0\bin mongo 客户端 mongod 服务端 mongoexport 导出 普通格式,每条记录一行,整 ...
- Python MD5算法使用
## md5算法简介 1. **简介** MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值 ...
- elementUI中表格中表单的验证
表格中的表单验证,就是在将表格放在表单中,将表格绑定的数据也放在表单中. 最重要的是要给表格中需要验证的字段动态添加prop,再给其绑定规则. <el-form :model="tab ...
- Windows PowerShell基本语法及常用命令
PowerShell常用命令: 一 Get类 1.Get-Command : 得到所有PowerShell命令,获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的 ...
- java 日志体系(四)log4j 源码分析
java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...
- axios封装get方法和post方法
我们常用的ajax请求方法有get.post.put等方法,相信小伙伴都不会陌生.axios对应的也有很多类似的方法,不清楚的可以看下文档.但是为了简化我们的代码,我们还是要对其进行一个简单的封装.下 ...
- 解决拼音输入法会触发input事件的问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...
- ActivityThread 源码分析
ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行) ...
- HDU4460
#include <iostream> #include <queue> #include <vector> #include <cstring> #i ...