JavaScript-浏览器兼容之客户端检测

Posted 项脊轩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript-浏览器兼容之客户端检测相关的知识,希望对你有一定的参考价值。

 前端开发最让人头痛的一件事就是浏览器兼容,正是由于浏览器间存在差异,所以我们需要根据不同的浏览器编写不同的代码,我们通常的做法是客户端检测。下面是三个比较常用的检测方法:

一、能力检测(优先考虑)

在编写代码之前先检测待定浏览器的能力,只要确定浏览器支持特定能力,就可以给出解决方案,举个例子:

IE5之前的版本不支持document.getElemnetById(),但是可以用非标准的document.all()代替,我们的代码就可以写成这样:

function getId(id){
    if(document.getElementById()){
        return document.getElementById(id);
    }else if(document.all()){
        return document.add(id);
    }else{
        throw new Error("不能获取元素");
    }
}

在能力检测中,请记住这两个重要概念:

1、先检测达成目标的最常用的特性保证代码最优化,因为多数条件下可以避免检测多个条件

2、必须测试实际要用到的特性,一个特性不存在,不代表另一个特性也不存在

 

二、怪癖检测(第二选择)

怪癖检测的目标是识别浏览器的特殊行为,想要知道浏览器存在什么“缺陷”,通常是需要运行一段小代码,用来确定某一个特性不能工作。

来看例子

IE8及之前的版本存在一个bug,如果某个实例属性与[[Enumerable]]标记为false的某个原型属性同名,那么该原型属性将不会出现在for-in循环中。在Safari3之前的版本会枚举出被隐藏的属性。

var hasEnumQuik=function(){
    var obj={
        toString:function(){}
    };
    for(var property in obj){
        if(property=="toString"){//被枚举出来了,说明存在bug
            return true;
        }
    }
    return false;
};

var hasEnumShadowQuik=function(){
    var obj={
        toString:function(){}
    };
    var count=0;
    for(var property in obj){
        if(property=="toString"){
            count++;//被枚举出来了的数目如果超过2,说明被枚举出来了
        }
    }
    return (count>1);
}

通常我们的做法是在脚本一开始就执行怪癖检测,以便尽早解决问题,给出解决方案。

 

三、用户代理检测(最后的手段)

 用户代理字符串包含了大量与浏览器相关的信息,包括浏览器,平台,操作系统以及浏览器版本。但是浏览器可以在自己的用户代理字符串里面加入一些错误的信息,达到欺骗服务器的目的,也叫“电子欺骗”。

 

以上是关于JavaScript-浏览器兼容之客户端检测的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级程序设计之客户端检测

检测浏览器文件兼容性

客户端检测

JavaScript:如果它处于 IE7 或 IE8 兼容模式,我可以检测到 IE9 吗?

BOM之navigator对象和用户代理检测

JavaScript跨浏览器兼容之事件