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 相关文章推荐
HTML代码中标签的全部属性 中文注释说明
Mar 26 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
May 25 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
jquery图片切换插件
Mar 16 Javascript
JavaScript更改字符串的大小写
May 07 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
Sep 29 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
解决js ajax同步请求造成浏览器假死的问题
Jan 18 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
Jun 03 Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 Javascript
vue中element 的upload组件发送请求给后端操作
Sep 07 Javascript
JavaScript十大取整方法实例教程
Dec 03 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中header和session_start前不能有输出原因分析
2013/01/11 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
js切换光标示例代码
2013/10/10 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
BootStrap中
2016/12/10 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
jquery拖动改变div大小
2017/07/04 jQuery
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
django将数组传递给前台模板的方法
2019/08/06 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
自我鉴定思想方面
2013/10/07 职场文书
大学生简单自荐信
2013/11/10 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
货车司机岗位职责
2014/03/18 职场文书
交通文明倡议书
2014/05/16 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
喋血孤城观后感
2015/06/08 职场文书
Apache自带的ab压力测试工具的实现
2022/07/23 Servers