zoukankan      html  css  js  c++  java
  • 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....

    最后:能力检测不是浏览器检测!能力检测不是浏览器检测!!能力检测不是浏览器检测!!!

  • 相关阅读:
    android136 360 拖拽
    android134 360 07 归属地查询
    android133 360 06 一键锁频,清楚数据
    转载:必须收藏!50个最流行的免费Kubernetes工具集
    SQL Data Compare 对比 SQLserver数据
    PLSQL 使用ODBC 数据源导入来自SQLSERVER的数据
    PLSQL 使用技巧汇总贴(一个坑)
    简单的数据库备份语句--Oracle+SQLSERVER
    SQLSERVER 导出表数据为insert 语句
    Oracle 使用PLSQL 导出 一个表的insert 语句
  • 原文地址:https://www.cnblogs.com/lhyxq/p/10218389.html
Copyright © 2011-2022 走看看