Как добавить/удалить класс в JavaScript?
С element.classList не поддерживается в IE 9 и Safari-5, Что такое альтернативное кросс-браузерное решение?
нет-фреймворков пожалуйста.
решение должны работать не менее IE 9,Safari 5, FireFox 4, Opera 11.5 и Chrome.
связанные сообщения (но не содержит решения):
Как добавить и удалить css класс
добавление и удаление класса с анимацией
добавить удалить класс?
13 ответов:
один из способов поиграть с классами без фреймворков / библиотек будет использовать элемент property.имя класса, которое "возвращает и задает значение атрибута class указанного элемента." (С документация MDN).
Как @matías-fidemraizer уже упоминалось в его ответе, как только вы получите строку классов для вашего элемента, вы можете использовать любые методы, связанные со строками, чтобы изменить его.вот пример:
Предполагая, что у вас есть div с идентификатором " myDiv "и что вы хотите добавить к нему класс" main__section", когда пользователь нажимает на него,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 }
вот решение для addClass, removeClass, hasClass в чистом решении javascript.
на самом деле это от http://jaketrent.com/post/addremove-classes-raw-javascript/
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 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; }Я думаю, что они будут работать во всех браузерах.
самый простой способ-это
element.classListимеющегоremove(name),add(name),toggle(name)иcontains(name)методы и теперь поддерживается всеми основными браузерами.на старше браузеры вы измените
element.className. Вот два помощника:function addClass(element, className){ element.className += ' ' + className; } function removeClass(element, className) { element.className = element.className.replace( new RegExp('( |^)' + className + '( |$)', 'g'), ' ').trim(); }
прочитайте эту статью Mozilla Developer Network:
С элемент.имя_класса свойство имеет тип string, вы можете использовать обычные строковые функции объекта, найденные в любой реализации JavaScript:
если вы хотите добавить класс, сначала используйте
String.indexOfдля того, чтобы проверить, если класс присутствует в имя_класса. Если это не представьте, просто объедините пустой символ и новое имя класса для этого свойства. Если он присутствует, ничего не делать.если вы хотите удалить класс, просто использовать
String.replace, заменив "[className] " пустой строкой. Наконец используйтеString.trimудалить пустые символы в начале и концеelement.className.
решение:
сим
.classList:использовать DOM-shim или используйте прокладку Эли Грея ниже
отказ от ответственности: Я считаю, что поддержка 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)); }
посмотрите на этих oneliners:
удалить класс:
element.classList.remove('hidden');переключить класс (это будет добавлено к className если не так класс и удалены, если это так)
element.classList.toggle('hidden');все! Я делаю тест-10000 итераций. 0.8 сек.
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(' ') }использовать их как:
document.body.addClass('whatever')илиdocument.body.removeClass('whatever')вместо тела, вы также можете использовать любой другой элемент (как div, span, вы называете его)
улучшенная версия кода Эмиля (с trim ())
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(); } }
добавить классы css:
cssClassesStr += cssClassName;удалить классы css:
cssClassStr = cssClassStr.replace(cssClassName,"");добавить атрибут 'Classes':
object.setAttribute("class", ""); //pure addition of this attributeудалить атрибутов:
object.removeAttribute("class");
простой для понимания способ:
// 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")https://gist.github.com/sorcamarian/ff8db48c4dbf4f5000982072611955a2
Comments