关于浏览器方法检测能力实现的逻辑

问题分析:例如在IE8浏览器及以下,不兼容getElementsByClassName,那么问题1是如何判断浏览器是否支持,问题2是如何实现自己的方法

  • 首先拿到这个问题,一般想到的是用if判断条件,如下

if(node.getElementsByClassName){
                return node.getElementsByClassName(className);
            }else{
                //其他方法
            }

上述方法每调用一次,浏览器都会进行一次判断,随着代码和框架的增多,那么浏览器的性能会严重损耗,那么如何处理以上问题呢?

  • 对于上述问题进行分析,我们试着可以在js加载开始的时候就进行能力判断,判断属性方法是否存在,存储布尔值真和假

实现逻辑:
   在全局作用域中( 最终都要变成沙箱 )提供一个 support对象,里面提供所有的与方法名相同的属性, 值均为 boolean, 那么凡是涉及到 能力检查的时候 就直接使用 support 即可

var support = {};
            support.getElementsByClassName = !!document.getElementsByClassName;
            if ( support.getElementsByClassName ) {
                // return node.getElementsByClassName( className );
                alert(‘支持该方法‘);

            } else {
                // 自己实现( className );
                alert(‘不支持该方法‘);
            }
  • 拓展:以上方法实现了是否存在该方法和属性,那么现在需求是不仅判断其是否存在,还要判断是否符合要求

    var support = {};
            support.getElementsByClassName = (function () {

                var isExist = !!document.getElementsByClassName;
                //判断是否存在,并且它还是一个方法
                if ( isExist && typeof document.getElementsByClassName == ‘function‘ ) {
                    // 自己创建一些元素, 并且加上 class 属性, 看是否可以获得到加上的所有元素(假设其他方法都是存在的)
                    var div = document.createElement( ‘div‘ ),
                        divClass = document.createElement( ‘div‘ );
                    divClass.className = ‘cn‘;
                    div.appendChild( divClass );
                    var bool = div.getElementsByClassName( ‘cn‘ )[ 0 ] === divClass;            return bool;

                }

                return false;//如果不满足
            })();

判断返回的布尔值,应用上面方法

if ( support.getElementsByClassName ) {
                // return node.getElementsByClassName( className );
                alert( ‘支持该方法‘ );
            } else {
                // 自己实现( className );
                alert( ‘不支持该方法‘ );
            }
            
  • 最后如何实现自己的方法呢

var nodes = document.getElementsByTagName(‘*‘);
            var arr = [],
                i;
            var getClassName = function (tag){
                for(i = 0;i < tag.length;i++){
                 if(tag[i].className){
//                     console.log(tag[i].className.split(‘ ‘))
                     arr.push(tag[i].className);//获得的类名存到数组中
                 }
            }
                return arr;
            }
                var classNames = getClassName(nodes);
                console.log(classNames);

自己在此做了小小的总结,我深知对于检测浏览器能力方法不仅仅如此,希望前辈批评指正

时间: 2024-08-26 14:38:21

关于浏览器方法检测能力实现的逻辑的相关文章

div+css 兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器方法(非原创)

div+css 兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器方法 1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中 4.FF: 设置 padding 后, div 会增加 height 和 wi

{转}div+css 兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器方法

div+css 兼容ie6 ie7 ie8 ie9和FireFox Chrome等浏览器方法 1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中 4.FF: 设置 padding 后, div 会增加 height 和 wi

判断浏览器方法

//判断浏览器方法   function get_userbrowser(){   var this_userAgent=navigator.userAgent;   var keywords=new Array("Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser","Firefox",&

JS - IE or not:判断是否为IE浏览器方法

问题:使用JS判断是否为IE浏览器 方法: 1.IE='\v'=='v' if('\v'=='v') // true only in IE 2.IE=(!+"\v1") if(!+"\v1") // true only in IE 3.IE=top.execScript?1:0 if(top.execScript?true:false) // true only in IE

封装常用的Javascript跨浏览器方法

var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListener){ element.addEventListener(type,handler,false); }else if(element.attachEvent){ element.attachEvent('on'+type,handler); }else{ element['on'+type]=ha

检测IE浏览器方法

var isIE=function(){ var b=document.createElement("b"); b.innerHTML="<!--[if IE]><i></i><![endif]-->"; return b.getElementsByTagName("i").length===1 } 该方法也仅限于IE9及以下版本

Selenium框架所有用例打开一次浏览器方法实现(Java)

之前写的自动化测试框架(PageObject设计思路)一直都是每执行一条用例,启动一次浏览器驱动就打开一次浏览器,一条用例执行结束之后就关闭浏览器.这样做不仅浪费时间而且每次都重启关闭chromedriver.exe也挺浪费资源的.所有根据TestNG生命周期的各个注解的执行顺序,对相关方法做了一点点的改动,实现了这一功能. 首先看一下PageFactory类,这个类主要是利用Java反射的机制,调用页面类的构造方法生成一个新的页面对象,这里我在这个类里面定义了一个WebDriver对象,以后这

识别浏览器方法

获取浏览器的类型.版本及操作系统信息 敬上代码,抛砖引玉 var browserInfo = function() { var NT = { '4.90': 'Windows ME', '4.0': 'Windows NT', '5.0': 'Windows 2000', '5.01': 'Windows 2000 SP1', '5.1': 'Windows XP', '5.2': 'Windows XP 64-bit / Windows Server 2003', '6.0': 'Window

浏览器方法及代码打包成APP的

<script src=" http://static.ydbimg.com/API/YdbOnline.js" type="text/javascript"></script><script type="text/javascript"> function OpenWithSafari(openurl){ var YDB = new YDBOBJ(); YDB.OpenWithSafari(openurl)}