JQeury添加和删除class内部实现代码(简化版)

Posted 三十亿少女的梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JQeury添加和删除class内部实现代码(简化版)相关的知识,希望对你有一定的参考价值。

     下面是JQuery对元素class操作的简单实现,请看代码:

 

添加class:

    //增加class
    function addClass(elem,value) {   

        var classes, cur, clazz, j, finalValue
        // 如果参数是多个样式设置"a b c"按照\/S+\g空格分割
        classes = (value || "").match(/\S+/g) || [];

        //如果是元素节点,并且有class属性
        //拼接成 " a b c "形式,加上前后空格
        cur = elem.nodeType === 1 && (elem.className ?
            (" " + elem.className + " ").replace(/[\t\r\n\f]/g, " ") :
            " "
        );

        //如果存在样式
        if (cur) {
            j = 0;
            while ((clazz = classes[j++])) {
                //查找下是否不是有重复的,没有就叠加
                if (cur.indexOf(" " + clazz + " ") < 0) {
                    cur += clazz + " ";
                }
            }

            // 去掉前后的空格
            finalValue = jQuery.trim(cur);

            if (elem.className !== finalValue) {
                //赋值
                elem.className = finalValue;
            }
        }
    }

 

移除class:

    //移除样式 
    function removeClass(elem, value) {

        var classes, cur, clazz, j, finalValue
            // 如果参数是多个样式设置"a b c"按照\/S+\g空格分割
        classes = (value || "").match(/\S+/g) || [];

        //如果是元素节点,并且有class属性
        //拼接成 " a b c "形式,加上前后空格
        cur = elem.nodeType === 1 && (elem.className ?
            (" " + elem.className + " ").replace(/[\t\r\n\f]/g, " ") :
            " "
        );

        //如果存在样式
        if (cur) {
            j = 0;
            while ((clazz = classes[j++])) {
                //与addClass的区别在这里
                while (cur.indexOf(" " + clazz + " ") >= 0) {
                    cur = cur.replace(" " + clazz + " ", " ");
                }
            }

            // 去掉前后的空格
            finalValue = jQuery.trim(cur);

            if (elem.className !== finalValue) {
                //赋值
                elem.className = finalValue;
            }
        }
    }

 

其实原理就是通过元素原生className属性获得元素class值(一串字符),然后对这串字符进行各种奇淫技巧拼接,最后再赋值到元素的className属性。

以上是关于JQeury添加和删除class内部实现代码(简化版)的主要内容,如果未能解决你的问题,请参考以下文章

Jqeury获取table当前行与指定列

jqeury源码之变量解析

匿名内部类

原生js实现删除class和添加class

匿名内部类创建线程,简化线程创建代码

在ng-class中删除和添加类