模拟jQuery--添加类名和移除类名的封装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟jQuery--添加类名和移除类名的封装相关的知识,希望对你有一定的参考价值。

     之前自己用原生的js添加类名和移除类名,用起来感觉还算顺手。在使用jQuery框架添加类名和移除类名时候更是觉得“傻瓜式”使用了。前两天在封装别的模块,今天想起自己也来搞一下添加类名和移除类名,,,不动手不知道,敲起来遇到不少bug。主要还是起初考虑的不够周到,不过调试工具真是个‘宝’;

    这里直接附上我的代码了:

 //添加类(可以一次添加多个类名)
    function addClass() {
        var arg = Array.prototype.slice.call(arguments);
        var dom = arg[0];  //取得dom
        var className = arg.slice(1); //取得要添加的类名(数组形式)
        var doms =document.querySelectorAll(dom);      //获取所有符合的dom成员
        for (var i = 0; i < doms.length;i++) {
            //为了避免当第一次设置类名且以前没有类名,会出现第一个有空格的现象

            if (doms[i].className) {
                //如果之前有类名了
                addOne(doms[i]);
            } else {
                //首次添加类名
                firstaddOne(doms[i]);
            }
        }
        function addOne(dom) {
            for (var j = 0; j < className.length; j++) {
                var itemName = dom.className;
                var itemNames = [].push.call([],itemName);
                console.log(typeof itemNames);
                dom.className = dom.className + ‘ ‘ + className[j];
            }
        }

        function firstaddOne(dom) {
            for (var j = 0; j < className.length; j++) {
                dom.className = dom.className + className[j];
            }
        }
    }

//移除类
    function removeClass() {
        var arg = Array.prototype.slice.call(arguments);
        var dom = arg[0];  //取得dom
        var className = arg.slice(1); //取得要删除的类名(数组形式)
        var doms = document.querySelectorAll(dom);      //获取所有符合的dom成员
        //遍历dom
        for(var i=0;i<doms.length;i++){
            var getAttr = doms[i].getAttribute(‘class‘);
             var arr1 = getAttr.split(‘ ‘);
            //双重循环判断删除的类名是否与已有的类名一样
            for(var j=0;j<arr1.length;j++){
                for(var k=0;k<className.length;k++){
                    if(arr1[j]===className[k]){
                        arr1.splice(j,1);
                        console.log(arr1.length);
                        j--;
                        break;
                    }
                }

            }
            //一样--〉连同类名属性删除
            if(arr1.length==0){
                doms[i].removeAttribute(‘class‘);
            }else{
                //否则删除要删除的类名
                removeOne(doms[i]);

            }

        }

        function removeOne(dom){
            for (var j = 0; j < className.length; j++) {
                var getAttr = doms[i].getAttribute(‘class‘);
                var arr1 = getAttr.split(‘ ‘);
                if(className[0]===arr1[0]){
                    dom.className = dom.className.replace(className[j], ‘‘);
                }else{
                    dom.className = dom.className.replace(‘ ‘ + className[j], ‘‘);
                }



            }
        }
    }

快乐的学习,才能快速的成长^_^

以上是关于模拟jQuery--添加类名和移除类名的封装的主要内容,如果未能解决你的问题,请参考以下文章

jQuery事件委托为动态添加的全部元素移除类名

jQuery 属性操作

前端基础-jQuery中的如何操作标签

jQuery基础之二(操作标签)

js实现类名的添加与移除

js实现类名的添加与移除