JS学习笔记之客户端检测

     一、解决游览器兼容性问题:客户端检测。

     最常用的方法是“能力检测”,其目标不是识别特定的游览器,而是识别游览器的能力。采用这种方式不必估计特定的游览器如何如何,只要确定游览器支持特定的能力即可。

     EG:
     function getElement(id){
     if(document.getElementById){
     return document.getElementById(id);
     }else if(document.all){
     return document.all[id];
     }else{
     throw new Error ("没有获取element的方法!");
     }
     }
 
     原则:注意检测条件要先使用能达成目标的最常用条件进行判断,保证代码的最优化效率,避免条件的缺陷。(逻辑判断要充分条件)
     能力检测是不仅要检测某个特性是否存在,而是要检测其是否可以达成具体功能的实现,例如:通过判断object.sort是否存在来判断对象是否支持排序时不合理的,必须检测sort是否是函数。
     EG:
     function isSortable(o){
         return typeof object.sort == "function";
     }
     (其实就是保证判断条件的充分性,包含.sort属性的对象不一定支持排序)
     再例如,IE9之前的版本 document.createElement 的类型为object.而IE9之后所有DOM方法统一返回“function”。(原因是IE之前的宿主对象是通过COM而非JScript实现的)


      综合目前游览器环境,测试任何对象的某个特性是否存在,要使用下面的函数:
    
     MD:
     //au :Peter Michaux
     function isHostMethod(Object,property){
     var t = typeof object[property];
     return t =='function' || (!!(t=='object'&&object[property])) ||
     t=='unknow';
     }

     注:此方法随着时间的推移,可能会出现不合理或不完全的地方,应用时要进行合理的测试。
     参考:Peter Michaux的文章《Feature Detection:State of the Art Browser Scripting》
     http://peter.michaux.ca/

     二、能力检测>>游览器检测

     实际开发中,游览器检测被竟然应用,如:
     var isFirefox = !!(navigator.vendor && navigator.vendorSub);
     var isIE = !!(document.all && document.uniqueID);

     这是典型的游览器检测,曾经.vendor和vendorSub确实可以确定Firefox,因为只有其具备此属性,但Safari实现了相同属性后此方法就会带来误判。
     所以,通过检测游览器来确定某些方法、属性的可行性是十分被动的,在游览器做出更改后必须修改判断逻辑。。
   
     合理的解决方案是将能力检测作为确定下一步解决方案的一句,而不是用它来判断用户使用的是什么游览器,即如果使用某方法,检测其是否可用后执行,而不是通过判断游览器来分别执行某些方法。
 
     简言之,游览器不具有相对稳定、逻辑严谨的却分性质。

     当然,某些特定的需求要展示用户所用游览器的话,,另当别论。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值