Existe-t-il un moyen simple de supprimer toutes les classes correspondantes, par exemple,
color-*
donc si j'ai un élément:
<div id="hello" class="color-red color-brown foo bar"></div>
après avoir enlevé, ce serait
<div id="hello" class="foo bar"></div>
Merci!
La fonction removeClass prend un argument de fonction depuis jQuery 1.4 .
$("#hello").removeClass (function (index, className) {
return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});
Exemple vivant: http://jsfiddle.net/xa9xS/1409/
$('div').attr('class', function(i, c){
return c.replace(/(^|\s)color-\S+/g, '');
});
J'ai écrit un plugin appelé alterClass - Supprimer les classes d'éléments avec correspondance de caractère générique. Ajoutez éventuellement des classes: https://Gist.github.com/1517285
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
J'ai généralisé cela dans un plugin Jquery qui prend comme argument une expression rationnelle.
Café:
$.fn.removeClassRegex = (regex) ->
$(@).removeClass (index, classes) ->
classes.split(/\s+/).filter (c) ->
regex.test c
.join ' '
Javascript:
$.fn.removeClassRegex = function(regex) {
return $(this).removeClass(function(index, classes) {
return classes.split(/\s+/).filter(function(c) {
return regex.test(c);
}).join(' ');
});
};
Donc, dans ce cas, l'utilisation serait (à la fois Coffee et Javascript):
$('#hello').removeClassRegex(/^color-/)
Notez que j'utilise la fonction Array.filter
qui n'existe pas dans IE <9. Vous pouvez utiliser la fonction de filtre Underscore à la place ou Google pour un remplissage multiple comme ce WTFPL .
Si vous voulez l'utiliser ailleurs, je vous suggère une extension. Celui-ci fonctionne bien pour moi.
$.fn.removeClassStartingWith = function (filter) {
$(this).removeClass(function (index, className) {
return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
});
return this;
};
Usage:
$(".myClass").removeClassStartingWith('color');
nous pouvons obtenir toutes les classes par .attr("class")
, et à Array, And loop & filter:
var classArr = $("#sample").attr("class").split(" ")
$("#sample").attr("class", "")
for(var i = 0; i < classArr.length; i ++) {
// some condition/filter
if(classArr[i].substr(0, 5) != "color") {
$("#sample").addClass(classArr[i]);
}
}
Similaire à answer de @ tremby, voici le answer de @ Kobi en tant que plug-in qui correspond aux préfixes ou aux suffixes.
btn-mini
et btn-danger
mais pas btn
lorsque stripClass("btn-")
.horsebtn
et cowbtn
mais pas btn-mini
ou btn
quand stripClass('btn', 1)
$.fn.stripClass = function (partialMatch, endOrBegin) {
/// <summary>
/// The way removeClass should have been implemented -- accepts a partialMatch (like "btn-") to search on and remove
/// </summary>
/// <param name="partialMatch">the class partial to match against, like "btn-" to match "btn-danger btn-active" but not "btn"</param>
/// <param name="endOrBegin">omit for beginning match; provide a 'truthy' value to only find classes ending with match</param>
/// <returns type=""></returns>
var x = new RegExp((!endOrBegin ? "\\b" : "\\S+") + partialMatch + "\\S*", 'g');
// https://stackoverflow.com/a/2644364/1037948
this.attr('class', function (i, c) {
if (!c) return; // protect against no class
return c.replace(x, '');
});
return this;
};
Basé sur ARS81 's answer (qui correspond uniquement aux noms de classe commençant par), voici une version plus flexible. Également une version regex hasClass()
.
Usage: $('.selector').removeClassRegex('\\S*-foo[0-9]+')
$.fn.removeClassRegex = function(name) {
return this.removeClass(function(index, css) {
return (css.match(new RegExp('\\b(' + name + ')\\b', 'g')) || []).join(' ');
});
};
$.fn.hasClassRegex = function(name) {
return this.attr('class').match(new RegExp('\\b(' + name + ')\\b', 'g')) !== null;
};
J'ai eu le même problème et a proposé ce qui suit qui utilise la méthode _.filter de soulignement. Une fois que j'ai découvert que removeClass prenait une fonction et vous fournissait une liste de noms de classe, il était facile de le transformer en tableau et de filtrer le nom de la classe pour revenir à la méthode removeClass.
// Wildcard removeClass on 'color-*'
$('[class^="color-"]').removeClass (function (index, classes) {
var
classesArray = classes.split(' '),
removeClass = _.filter(classesArray, function(className){ return className.indexOf('color-') === 0; }).toString();
return removeClass;
});
Cela supprimera effectivement tous les noms de classe qui commencent par prefix
de l'attribut class
d'un nœud. Les autres réponses ne supportent pasSVGelements (au moment de l'écriture), mais cette solution:
$.fn.removeClassPrefix = function(prefix){
var c, regex = new RegExp("(^|\\s)" + prefix + "\\S+", 'g');
return this.each(function(){
c = this.getAttribute('class');
this.setAttribute('class', c.replace(regex, ''));
});
};
Vous pouvez également utiliser la propriété className
de l'objet DOM de l'élément:
var $hello = $('#hello');
$('#hello').attr('class', $hello.get(0).className.replace(/\bcolor-\S+/g, ''));
Pour un plugin jQuery essayez ceci
$.fn.removeClassLike = function(name) {
return this.removeClass(function(index, css) {
return (css.match(new RegExp('\\b(' + name + '\\S*)\\b', 'g')) || []).join(' ');
});
};
ou ca
$.fn.removeClassLike = function(name) {
var classes = this.attr('class');
if (classes) {
classes = classes.replace(new RegExp('\\b' + name + '\\S*\\s?', 'g'), '').trim();
classes ? this.attr('class', classes) : this.removeAttr('class');
}
return this;
};
Un fractionnement de regex sur la limite de Word \b
n'est pas la meilleure solution pour cela:
var prefix = "prefix";
var classes = el.className.split(" ").filter(function(c) {
return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ");
ou en tant que mixin jQuery:
$.fn.removeClassPrefix = function(prefix) {
this.each(function(i, el) {
var classes = el.className.split(" ").filter(function(c) {
return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ");
});
return this;
};
si vous avez plus d'un élément ayant un nom de classe 'exemple', pour supprimer toutes les classes de 'couleur', vous pouvez faire ceci: [using jquery]
var objs = $('html').find('.example');
for(index=0 ; index < obj1s.length ; index++){
objs[index].className = objs[index].className.replace(/col-[a-z1-9\-]*/,'');
}
si vous ne mettez pas [a-z1-9 -] * dans votre regex, cela ne supprimera pas les classes qui ont un nombre ou des "-" dans leurs noms.
Vous pouvez également le faire avec JavaScript JavaScript à l’aide de Element.classList . Pas besoin d'utiliser une expression régulière non plus:
function removeColorClasses(element)
{
for (let className of Array.from(element.classList))
if (className.startsWith("color-"))
element.classList.remove(className);
}
Remarque: Notez que nous créons une copie Array
de la classList
avant de commencer, ce qui est important car classList
est une variable DomTokenList
active qui sera mise à jour à mesure que les classes sont supprimées.
Si vous devez simplement supprimer la dernière couleur définie, les éléments suivants pourraient vous convenir.
Dans ma situation, je devais ajouter une classe de couleur à la balise body lors d'un événement click et supprimer la dernière couleur définie. Dans ce cas, vous stockez la couleur actuelle, puis recherchez la balise de données pour supprimer la dernière couleur définie.
Code:
var colorID = 'Whatever your new color is';
var bodyTag = $('body');
var prevColor = bodyTag.data('currentColor'); // get current color
bodyTag.removeClass(prevColor);
bodyTag.addClass(colorID);
bodyTag.data('currentColor',colorID); // set the new color as current
Ce n’est peut-être pas exactement ce dont vous avez besoin, mais c’était pour moi la première SO question que j’ai examinée. J’ai donc pensé partager ma solution au cas où elle aiderait quelqu'un.
Une fonction générique qui supprime toute classe commençant par begin
:
function removeClassStartingWith(node, begin) {
node.removeClass (function (index, className) {
return (className.match ( new RegExp("\\b"+begin+"\\S+", "g") ) || []).join(' ');
});
}
http://jsfiddle.net/xa9xS/2900/
var begin = 'color-';
function removeClassStartingWith(node, begin) {
node.removeClass (function (index, className) {
return (className.match ( new RegExp("\\b"+begin+"\\S+", "g") ) || []).join(' ');
});
}
removeClassStartingWith($('#hello'), 'color-');
console.log($("#hello")[0].className);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="hello" class="color-red color-brown foo bar"></div>