浏览器提供商虽然在实现公共接口方面投入了很多精力。但结果仍然是每一种浏览器都有自己的长处和缺点。即使是跨平台的浏览器,虽然从技术上看版本相同,也照样存在不一致性问题。面对这种问题,我们程序员能怎么办呢——giao你你有脾气吗?
那么我们能做什么呢?我们只能找办法解决嘛~~
解决方法不唯一,今天给大家讲一下最常用也最被人们接受的客户端检测形式——能力检查
能力检测
能力检测的目标不是识别特定的浏览器,而是识别浏览器的功能。就好像售货员卖东西不看你是谁,而看你有没有足够的钱一样。能力检测的基本模式如下:
if(object.propertyInQuestion){
//使用object.propertyInQuestion
}
//上面方法意思,用if进行判断,如果有这个功能,使用这个功能。
实例如下:
function getElement(id){
if(document.getElementById){ //判断是否有这个方法
return document.getElementById(id);//有,调用这个方法
}else{
return document.all(id); //没有,调用document.all(id)
}
}
实例解读:IE5.0之前,浏览器并不支持document.getElementById()的方法。不过可以通过document.all属性实现相同的目的。所以就有了上面的能力测试代码。
需要注意的是:进行能力测试的时候,需要先判断最常用的方法。
如下:虽然也是能力测试,但是先判断不常用的,就会造成很多问题。
function getElement(id){
if(document.all){ //判断是否有这个方法
return document.all(id); //有,调用这个方法
}else{
return document.getElementById(id);//没有,调用ById方法
}
}
第二个需要注意的是:进行能力测试,一定要测试实际要用到的特性。一个特性存在,不一定意味着另一个属性也存在。就好像商店卖可乐,并不代表他就卖雪碧一样。
如下:
function getWindowWidth(){
if(document.all){ //判断是否是ie浏览器
return document.documentElement.clientWidth; //有,调用这个方法
}else{
return window.innerWidth; //没有,此方法
}
}
如上,支持浏览器document.all的不只有IE,Opera也支持,就会产生问题。
更可靠的能力测试
能力测试对于想知道某个特性是否会按照特定方式行事也很有用。有时候我们需要更精确的进行查询,
如下:
function isSortable(object){
return !!object.sort; //如果参数属性有sort,就会返回true。
}
以上方法能判断对象是否有sort属性,但是并不能判断这个属性是否为我们想要的sort属性。
就好像你知道商店卖辣条,于是你兴高采烈的去了,却发现卖的辣条里面没有你想买的卫龙一样。 所以我们需要更加精确的能力测试。
检测sort这个属性是否存在还不够,我们还需要检测这个sort是不是一个函数,如下:
function isSortable(object){
return typeof object.sort == "function";
}
如上,这样就会更精确的检测,避免不必要的错误。