Étant donné que element.classList
n'est pas pris en charge dans IE 9 et Safari-5, quelle solution de remplacement pour plusieurs navigateurs?
Pas de cadre s'il vous plaît.
Solution doit fonctionner dans au moins IE 9, Safari 5, FireFox 4, Opera 11.5 et Chrome.
Articles connexes (mais ne contient pas de solution):
Une façon de jouer avec des classes sans framework/bibliothèque serait d'utiliser la propriété Element.className, qui "obtient et définit la valeur de l'attribut class de l'élément spécifié." (À partir de documentation MDN ).
Comme @ matías-fidemraizer déjà mentionné dans sa réponse, une fois que vous avez obtenu la chaîne de classes de votre élément, vous pouvez utiliser toutes les méthodes associées aux chaînes pour le modifier.
Voici un exemple:
En supposant que vous avez un div avec l’ID "myDiv" et que vous souhaitez y ajouter la classe "main__section" lorsque l’utilisateur clique dessus,
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
}
Voici la solution pour addClass, removeClass, hasClass en solution javascript pure.
En fait, c'est de 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,' ');
}
}
Je viens d'écrire ceci:
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;
}
Je pense qu'ils fonctionneront dans tous les navigateurs.
Le plus simple est element.classList
qui a les méthodes remove(name)
, add(name)
, toggle(name)
et contains(name)
et est maintenant pris en charge par tous les principaux navigateurs .
Pour anciens navigateurs, vous modifiez element.className
. Voici deux aides:
function addClass(element, className){
element.className += ' ' + className;
}
function removeClass(element, className) {
element.className = element.className.replace(
new RegExp('( |^)' + className + '( |$)', 'g'), ' ').trim();
}
Lisez cet article du réseau de développeurs Mozilla:
Comme la propriété element.className est de type chaîne, vous pouvez utiliser les fonctions d'objet String habituelles de toute implémentation JavaScript:
Si vous souhaitez ajouter une classe, utilisez d'abord String.indexOf
afin de vérifier si la classe est présente dans className. S'il n'est pas présent, concaténez simplement un caractère vide et le nouveau nom de classe dans cette propriété. Si c'est présent, ne faites rien.
Si vous souhaitez supprimer une classe, utilisez simplement String.replace
, en remplaçant "[NomClasse]" par une chaîne vide. Enfin, utilisez String.trim
pour supprimer les caractères vides au début et à la fin de element.className
.
Regardez ces oneliners:
Supprimer la classe:
element.classList.remove('hidden');
Toggle class (ajoute la classe si elle n'est pas déjà présente et la supprime si c'est le cas)
element.classList.toggle('hidden');
C'est tout! J'ai fait un test - 10000 itérations. 0.8s.
Correction de la solution de @Paulpro
removeClass
était cassée, car elle a été détruite après une utilisation répétée.`
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;
}
La solution est de
Shim .classList
:
Utilisez soit le DOM-shim ou utilisez la cale d’Eli Grey ci-dessous
Disclaimer: Je crois que le support est 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));
}
Juste au cas où quelqu'un voudrait faire construire des fonctions prototypes pour les éléments, voici ce que j'utilise lorsque je dois manipuler des classes d'objets différents:
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(' ')
}
Utilisez-les comme: document.body.addClass('whatever')
ou document.body.removeClass('whatever')
Au lieu de body, vous pouvez également utiliser n’importe quel autre élément (div, span, vous le nommez)
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(' ');
}
Version améliorée du code emil (avec 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();
}
}
ajouter des classes css: cssClassesStr += cssClassName;
supprimer les classes css: cssClassStr = cssClassStr.replace(cssClassName,"");
ajouter un attribut 'Classes': object.setAttribute("class", ""); //pure addition of this attribute
enlever l'attribut: object.removeAttribute("class");
Un moyen facile à comprendre:
// 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/ff8db48c4dbf4f50009820726119552