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 相关文章推荐
extjs ColumnChart设置不同的颜色实现代码
May 17 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
JavaScipt中栈的实现方法
Feb 17 Javascript
jQuery中的Deferred和promise 的区别
Apr 03 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
May 03 Javascript
JS查找字符串中出现次数最多的字符
Sep 05 Javascript
不使用script导入js文件的几种方法
Oct 27 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
Vue 获取数组键名的方法
Jun 21 Javascript
vue实现input输入模糊查询的三种方式
Aug 14 Vue.js
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
Home Coffee Roasting
2021/03/03 咖啡文化
php仿QQ验证码的实例分析
2013/07/01 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
python3实现随机数
2018/06/25 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
职业生涯规划设计步骤
2014/01/12 职场文书
高一生物教学反思
2014/01/17 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
学校节能减排方案
2014/06/13 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
离婚案件被告代理词
2015/05/23 职场文书
党支部培养考察意见
2015/06/02 职场文书
岁月神偷观后感
2015/06/11 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
浅谈怎么给Python添加类型标注
2021/06/08 Python
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL