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 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
Json和Jsonp理论实例代码详解
Nov 15 Javascript
javascript中的undefined和not defined区别示例介绍
Feb 26 Javascript
js中的cookie的读写操作示例详解
Apr 17 Javascript
javascript高级编程之函数表达式 递归和闭包函数
Nov 29 Javascript
JS 对象(Object)和字符串(String)互转方法
May 20 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
Jun 22 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
Dec 05 Javascript
探讨Vue.js的组件和模板
Oct 27 Javascript
JS中使用new Option()实现时间联动效果
Dec 10 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
Feb 05 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
php sybase_fetch_array使用方法
2014/04/15 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
python切换hosts文件代码示例
2013/12/31 Python
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python更改已存在excel文件的方法
2018/05/03 Python
Python中的函数作用域
2018/05/07 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
团组织关系介绍信
2014/01/12 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
三十年同学聚会感言
2015/07/30 职场文书
导游词之日月潭
2019/11/05 职场文书
Python实现天气查询软件
2021/06/07 Python
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python
python绘制云雨图raincloud plot
2022/08/05 Python
关于MySQL中explain工具的使用
2023/05/08 MySQL