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函数
Apr 09 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
Aug 09 Javascript
一个简单的jQuery计算器实现了连续计算功能
Jul 21 Javascript
node.js中的console.info方法使用说明
Dec 09 Javascript
jQuery中prependTo()方法用法实例
Jan 08 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
详谈javascript异步编程
Feb 21 Javascript
js实现可输入可选择的select下拉框
Dec 21 Javascript
js实现音频控制进度条功能
Apr 01 Javascript
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
javascript 避免闭包引发的问题
2009/03/17 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
Cpy和Python的效率对比
2015/03/20 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python中几种导入模块的方式总结
2017/04/27 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
创建青年文明号材料
2014/05/09 职场文书
模特大赛策划方案
2014/05/28 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
争先创优个人总结
2015/03/04 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
高老头读书笔记
2015/06/30 职场文书
运动会班级前导词
2015/07/20 职场文书