JS中getElementsByClassName与classList兼容性问题解决方案分析


Posted in Javascript onAugust 07, 2019

本文实例讲述了JS中getElementsByClassName与classList兼容性问题解决方案。分享给大家供大家参考,具体如下:

document(element).getElementsByClassName(classNames:classString);

HTML5新添加了这个方法,这个方法可以通过document和html元素调用,接受一个参数,这个参数包含一个或多个类名的字符串,返回带有制定类型的NodeList(存在性能问题),传入的多个类型顺序不重要。这个方法仅仅在标准浏览器下有效,在非标准浏览器下无效。

<body>
    <p class="p1 p">p1 p</p>
    <p class="p"> p</p>
    <script type="text/javascript">
        var aP = document.getElementsByClassName(' p p1' );
        alert(aP.length);
        /*标准 : 1*/
        /*非标准:Error:对象不支持“getElementsByClassName”属性或方法*/
    </script>
</body>

解决兼容性的方式:

var getElementsByClassName = (function (classList,/*optional*/parent){
    if(typeof classList !== "string") throw TypeError("the type of classList is error");
    var parent = parent || window.document;/*添加默认值*/
    if(parent.getElementsByClassName){/*如果是标准浏览器支持该方法*/
      return parent.getElementsByClassName(classList);
    }else{/*如果不支持该方法即非标准浏览器*/
      var child = parent.getElementsByTagName("*");
      var nodeList = [];
      /*获得classList的每个类名 解决前后空格 以及两个类名之间空格不止一个问题*/
      var classAttr = classList.replace(/^\s+|\s+$/g,"").split(/\s+/);
      for(var j = 0,len_j = child.length; j<len_j; j++){
        var element = child[j];
        for(var i = 0,len_i = classAttr.length; i< len_i; i++){
          var _className = classAttr[i];
          if(element.className.search(new RegExp("(\\s+)?"+_className+"(\\s+)?")) === -1){
            break;
          }
        }
        if(i===len_i) nodeList.push(element);
      }
      return nodeList;
    }
});

classList属性

classList属性是HTML5新增的一个属性,在这个属性下有几个方法:

Add(value)将给定的字符串值增加到列表中,如果存在,就不会添加。
Contains(value)表示列表中是否存在给定的值,如果存在返回true,否则返回false。
Remove(value)从列表中删除给定的字符串。
Toggle(value)如果列表中已经存在给定的值,删除它,如果没有给定的值,增加它。

支持classList的浏览器有Firefox3.6+和chrome和IE10+。

解决兼容性:

var classList = null;
(function(){
    classList = function (obj){
      this.obj = obj;
    };
    classList.prototype.add = function(value){
      if(typeof value !== "string") throw TypeError("the type of value is error");
      if(this.obj.classList){
        this.obj.classList.add(value);
      }else{
        var arr = value.replace(/^\s+|\s+$/g,"").split(/\s+/);
        this.obj.classList +=" "+arr.join(" ");
      }
    };
    classList.prototype.contains = function(value){
      if(typeof value !== "string") throw TypeError("the type of value is error");
      if(this.obj.classList){
        return this.obj.classList.contains(value);
      }else{
        var arr = value.replace(/^\s+|\s+$/g,"").split(/\s+/);
        var _className = this.obj.className;
        for(var i = 0,len= arr.length; i<len; i++){
          if(_className.search(new RegExp("(\\s+)?"+arr[i]+"(\\s+)?"))===-1){
            return false;
          }
        }
        return true;
      }
    };
    classList.prototype.remove = function(value){
      if(typeof value !== "string") throw TypeError("the type of value is error");
      if(this.obj.classList){
        return this.obj.classList.remove(value);
      }else{
        var arr = value.replace(/^\s+|\s+$/g,"").split(/\s+/);
        var _className = this.obj.className;
        for(var i = 0, len = arr.length;i<len; i++){
          if(_className.search(new RegExp("(\\s+)?"+arr[i]+"(\\s+)?"))!==-1){
            _className = _className.replace(new RegExp("(\\s+)?"+arr[i]+"(\\s+)?"),"");
          }
        }
        this.obj.className = _className;
      }
    };
    classList.prototype.toggle = function(value){
      if(typeof value !== "string") throw TypeError("the type of value is error");
      if(this.contains(value)){
        this.remove(value);
      }else{
        this.add(value);
      }
    };
})();

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
JavaScript中实现sprintf、printf函数
Jan 27 Javascript
Javascript中this关键字的一些小知识
Mar 15 Javascript
js实现select下拉框菜单
Dec 08 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
jQuery实现的倒计时效果实例小结
Apr 16 Javascript
Bootstrap表单布局
Jul 19 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
Jan 08 jQuery
JS实现调用本地摄像头功能示例
May 18 Javascript
AngularJS 前台分页实现的示例代码
Jun 07 Javascript
vue组件创建的三种方式小结
Feb 03 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 Javascript
javascript for循环性能测试示例
Aug 07 #Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 #Javascript
解决一个微信号同时支持多个环境网页授权问题
Aug 07 #Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 #Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 #Javascript
javascript中的数据类型检测方法详解
Aug 07 #Javascript
scrapyd schedule.json setting 传入多个值问题
Aug 07 #Javascript
You might like
php中的一个中文字符串截取函数
2007/02/14 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php绘制一个扇形的方法
2015/01/24 PHP
微信支付扫码支付php版
2016/07/22 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
奇妙的js
2007/09/24 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
python关闭windows进程的方法
2015/04/18 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
python求最大连续子数组的和
2018/07/07 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
护士试用期自我鉴定
2014/02/08 职场文书
锦旗标语大全
2014/06/23 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
就业意向书
2014/07/29 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
煤矿安全保证书
2015/02/27 职场文书
小学六年级毕业感言
2015/07/30 职场文书