如何在JavaScript中添加/删除类?

如何在JavaScript中添加/删除类?,javascript,dom,cross-browser,Javascript,Dom,Cross Browser,既然IE 9和Safari-5中不支持,那么什么是替代的跨浏览器解决方案 求你了 解决方案必须至少在IE 9、Safari 5、FireFox 4、Opera 11.5和Chrome中运行 相关帖子(但不包含解决方案): 阅读这篇Mozilla开发者网络文章: 由于element.className属性的类型为string,因此可以使用任何JavaScript实现中的常规字符串对象函数: 如果要添加类,请首先使用String.indexOf检查类是否存在于className中。如果

既然IE 9和Safari-5中不支持,那么什么是替代的跨浏览器解决方案

求你了

解决方案必须至少在IE 9Safari 5、FireFox 4、Opera 11.5和Chrome中运行

相关帖子(但不包含解决方案):


  • 阅读这篇Mozilla开发者网络文章:

    由于element.className属性的类型为string,因此可以使用任何JavaScript实现中的常规字符串对象函数:

    • 如果要添加类,请首先使用
      String.indexOf
      检查类是否存在于className中。如果不存在,只需将空白字符和新类名连接到此属性。如果有,什么都不要做

    • 如果要删除类,只需使用
      String.replace
      ,用空字符串替换“[className]”。最后使用
      String.trim
      删除
      元素.className
      开头和结尾的空白字符


    添加css类:
    cssclassstr+=cssClassName

    删除css类:
    cssclasssstr=cssclasssstr.replace(cssClassName,”)

    添加属性“类”:
    object.setAttribute(“类”,“类”)//仅添加此属性

    移除属性:
    object.removeAttribute(“类”)

    我刚刚写了这些:

    function addClass(el, classNameToAdd){
        el.className += ' ' + classNameToAdd;   
    }
    
    function removeClass(el, classNameToRemove){
        var elClass = ' ' + el.className + ' ';
        while(elClass.indexOf(' ' + classNameToRemove + ' ') !== -1){
             elClass = elClass.replace(' ' + classNameToRemove + ' ', '');
        }
        el.className = elClass;
    }
    
    我认为它们适用于所有浏览器。

    解决方案是

    垫片
    .classList

    使用或使用下面的Eli Grey垫片

    免责声明:我相信支持是FF3.6+、Opera10+、FF5、Chrome和IE8+

    /*
     * classList.js: Cross-browser full element.classList implementation.
     * 2011-06-15
     *
     * By Eli Grey, http://eligrey.com
     * Public Domain.
     * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
     */
    
    /*global self, document, DOMException */
    
    /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
    
    if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) {
    
    (function (view) {
    
    "use strict";
    
    var
          classListProp = "classList"
        , protoProp = "prototype"
        , elemCtrProto = (view.HTMLElement || view.Element)[protoProp]
        , objCtr = Object
        , strTrim = String[protoProp].trim || function () {
            return this.replace(/^\s+|\s+$/g, "");
        }
        , arrIndexOf = Array[protoProp].indexOf || function (item) {
            var
                  i = 0
                , len = this.length
            ;
            for (; i < len; i++) {
                if (i in this && this[i] === item) {
                    return i;
                }
            }
            return -1;
        }
        // Vendors: please allow content code to instantiate DOMExceptions
        , DOMEx = function (type, message) {
            this.name = type;
            this.code = DOMException[type];
            this.message = message;
        }
        , checkTokenAndGetIndex = function (classList, token) {
            if (token === "") {
                throw new DOMEx(
                      "SYNTAX_ERR"
                    , "An invalid or illegal string was specified"
                );
            }
            if (/\s/.test(token)) {
                throw new DOMEx(
                      "INVALID_CHARACTER_ERR"
                    , "String contains an invalid character"
                );
            }
            return arrIndexOf.call(classList, token);
        }
        , ClassList = function (elem) {
            var
                  trimmedClasses = strTrim.call(elem.className)
                , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
                , i = 0
                , len = classes.length
            ;
            for (; i < len; i++) {
                this.push(classes[i]);
            }
            this._updateClassName = function () {
                elem.className = this.toString();
            };
        }
        , classListProto = ClassList[protoProp] = []
        , classListGetter = function () {
            return new ClassList(this);
        }
    ;
    // Most DOMException implementations don't allow calling DOMException's toString()
    // on non-DOMExceptions. Error's toString() is sufficient here.
    DOMEx[protoProp] = Error[protoProp];
    classListProto.item = function (i) {
        return this[i] || null;
    };
    classListProto.contains = function (token) {
        token += "";
        return checkTokenAndGetIndex(this, token) !== -1;
    };
    classListProto.add = function (token) {
        token += "";
        if (checkTokenAndGetIndex(this, token) === -1) {
            this.push(token);
            this._updateClassName();
        }
    };
    classListProto.remove = function (token) {
        token += "";
        var index = checkTokenAndGetIndex(this, token);
        if (index !== -1) {
            this.splice(index, 1);
            this._updateClassName();
        }
    };
    classListProto.toggle = function (token) {
        token += "";
        if (checkTokenAndGetIndex(this, token) === -1) {
            this.add(token);
        } else {
            this.remove(token);
        }
    };
    classListProto.toString = function () {
        return this.join(" ");
    };
    
    if (objCtr.defineProperty) {
        var classListPropDesc = {
              get: classListGetter
            , enumerable: true
            , configurable: true
        };
        try {
            objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
        } catch (ex) { // IE 8 doesn't support enumerable:true
            if (ex.number === -0x7FF5EC54) {
                classListPropDesc.enumerable = false;
                objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
            }
        }
    } else if (objCtr[protoProp].__defineGetter__) {
        elemCtrProto.__defineGetter__(classListProp, classListGetter);
    }
    
    }(self));
    
    }
    
    /*
    *classList.js:跨浏览器完整元素.classList实现。
    * 2011-06-15
    *
    *伊莱·格雷,http://eligrey.com
    *公共领域。
    *没有明示或暗示的保证。使用风险自负。
    */
    /*全局自我、文档、DomeException*/
    /*! @来源http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
    if(文档的类型!==“未定义”&&&!(“document.createElement(“a”)中的类列表”){
    (功能(视图){
    “严格使用”;
    变量
    classListProp=“classList”
    ,protoProp=“原型”
    ,elemCtrProto=(view.HTMLElement | | view.Element)[protoProp]
    ,objCtr=Object
    ,strTrim=String[protoProp].trim | |函数(){
    返回此值。替换(/^\s+|\s+$/g,”);
    }
    ,arrIndexOf=Array[protoProp].indexOf | |函数(项){
    变量
    i=0
    ,len=this.length
    ;
    对于(;i
    修复了@Paulpro的解决方案

  • 不要使用“class”,因为它是一个保留字
  • removeClass
    函数 由于反复使用后被窃听出而损坏
  • `

    最简单的是有
    remove(name)
    add(nam)的
    
    function addClass(el, newClassName){
        el.className += ' ' + newClassName;   
    }
    
    function removeClass(el, removeClassName){
        var elClass = el.className;
        while(elClass.indexOf(removeClassName) != -1) {
            elClass = elClass.replace(removeClassName, '');
            elClass = elClass.trim();
        }
        el.className = elClass;
    }
    
    function addClass(element, className){
        element.className += ' ' + className;   
    }
    
    function removeClass(element, className) {
        element.className = element.className.replace(
            new RegExp('( |^)' + className + '( |$)', 'g'), ' ').trim();
    }
    
    window.onload = init;
    
    function init() {
      document.getElementById("myDiv").onclick = addMyClass;
    }
    
    function addMyClass() {
      var classString = this.className; // returns the string of all the classes for myDiv
      var newClass = classString.concat(" main__section"); // Adds the class "main__section" to the string (notice the leading space)
      this.className = newClass; // sets className to the new string
    }
    
    function hasClass(ele,cls) {
      return !!ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
    }
    
    function addClass(ele,cls) {
      if (!hasClass(ele,cls)) ele.className += " "+cls;
    }
    
    function removeClass(ele,cls) {
      if (hasClass(ele,cls)) {
        var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
        ele.className=ele.className.replace(reg,' ');
      }
    }
    
    function hasClass(ele,cls) {
      return !!ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
    }
    
    function addClass(ele,cls) {
      if (!hasClass(ele,cls)) ele.className = ele.className.trim() + " " + cls;
    }
    
    function removeClass(ele,cls) {
      if (hasClass(ele,cls)) {
        var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
        ele.className = ele.className.replace(reg,' ');
        ele.className = ele.className.trim();
      }
    }
    
    element.classList.remove('hidden');
    
    element.classList.toggle('hidden');
    
    function addClass(element, classString) {
        element.className = element
            .className
            .split(' ')
            .filter(function (name) { return name !== classString; })
            .concat(classString)
            .join(' ');
    }
    
    function removeClass(element, classString) {
        element.className = element
            .className
            .split(' ')
            .filter(function (name) { return name !== classString; })
            .join(' ');
    }
    
    Element.prototype.addClass = function (classToAdd) {
      var classes = this.className.split(' ')
      if (classes.indexOf(classToAdd) === -1) classes.push(classToAdd)
      this.className = classes.join(' ')
    }
    
    Element.prototype.removeClass = function (classToRemove) {
      var classes = this.className.split(' ')
      var idx =classes.indexOf(classToRemove)
      if (idx !== -1) classes.splice(idx,1)
      this.className = classes.join(' ')
    }
    
    // Add class 
    DOMElement.className += " one";
    // Example:
    // var el = document.body;
    // el.className += " two"
    
    // Remove class 
    function removeDOMClass(element, className) {
        var oldClasses      = element.className,
            oldClassesArray = oldClasses.split(" "),
            newClassesArray = [],
            newClasses;
    
        // Sort
        var currentClassChecked,
            i;     
        for ( i = 0; i < oldClassesArray.length; i++ ) { 
            // Specified class will not be added in the new array
            currentClassChecked = oldClassesArray[i];
            if( currentClassChecked !== className ) { 
                newClassesArray.push(currentClassChecked);
            }
        }
    
        // Order 
        newClasses = newClassesArray.join(" ");
    
        // Apply     
        element.className = newClasses;
    
        return element;
    
    }
    // Example:
    // var el = document.body;
    // removeDOMClass(el, "two")