Remove all classes that begin with a certain string

JavascriptJqueryCss

Javascript Problem Overview


I have a div with id="a" that may have any number of classes attached to it, from several groups. Each group has a specific prefix. In the javascript, I don't know which class from the group is on the div. I want to be able to clear all classes with a given prefix and then add a new one. If I want to remove all of the classes that begin with "bg", how do I do that? Something like this, but that actually works:

$("#a").removeClass("bg*");

Javascript Solutions


Solution 1 - Javascript

A regex splitting on word boundary \b isn't the best solution for this:

var prefix = "prefix";
var classes = el.className.split(" ").filter(function(c) {
    return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ").trim();

or as a jQuery mixin:

$.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 = $.trim(classes.join(" "));
    });
    return this;
};

2018 ES6 Update:

const prefix = "prefix";
const classes = el.className.split(" ").filter(c => !c.startsWith(prefix));
el.className = classes.join(" ").trim();

Solution 2 - Javascript

With jQuery, the actual DOM element is at index zero, this should work

$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');

Solution 3 - Javascript

I've written a simple jQuery plugin - alterClass, that does wildcard class removal. Will optionally add classes too.

$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' ) 

Solution 4 - Javascript

You don't need any jQuery specific code to handle this. Just use a RegExp to replace them:

$("#a").className = $("#a").className.replace(/\bbg.*?\b/g, '');

You can modify this to support any prefix but the faster method is above as the RegExp will be compiled only once:

function removeClassByPrefix(el, prefix) {
    var regx = new RegExp('\\b' + prefix + '.*?\\b', 'g');
    el.className = el.className.replace(regx, '');
    return el;
}

Solution 5 - Javascript

Using 2nd signature of $.fn.removeClass :

// Considering:
var $el = $('<div class="  foo-1 a b foo-2 c foo"/>');

function makeRemoveClassHandler(regex) {
  return function (index, classes) {
    return classes.split(/\s+/).filter(function (el) {return regex.test(el);}).join(' ');
  }
}

$el.removeClass(makeRemoveClassHandler(/^foo-/));
//> [<div class=​"a b c foo">​</div>​]

Solution 6 - Javascript

For modern browsers:

let element = $('#a')[0];
let cls = 'bg';

element.classList.remove.apply(element.classList, Array.from(element.classList).filter(v=>v.startsWith(cls)));

Solution 7 - Javascript

An approach I would use using simple jQuery constructs and array handling functions, is to declare an function that takes id of the control and prefix of the class and deleted all classed. The code is attached:

function removeclasses(controlIndex,classPrefix){
    var classes = $("#"+controlIndex).attr("class").split(" ");
    $.each(classes,function(index) {
        if(classes[index].indexOf(classPrefix)==0) {
            $("#"+controlIndex).removeClass(classes[index]);
        }
    });
}
        

Now this function can be called from anywhere, onclick of button or from code:

removeclasses("a","bg");

Solution 8 - Javascript

http://www.mail-archive.com/[email protected]/msg03998.html says:

...and .removeClass() would remove all classes...

It works for me ;)

cheers

Solution 9 - Javascript

I was looking for solution for exactly the same problem. To remove all classes starting with prefix "fontid_" After reading this article I wrote a small plugin which I'm using now.

(function ($) {
		$.fn.removePrefixedClasses = function (prefix) {
			var classNames = $(this).attr('class').split(' '),
				className,
				newClassNames = [],
				i;
			//loop class names
			for(i = 0; i < classNames.length; i++) {
				className = classNames[i];
				// if prefix not found at the beggining of class name
				if(className.indexOf(prefix) !== 0) {
					newClassNames.push(className);
					continue;
				}
			}
			// write new list excluding filtered classNames
			$(this).attr('class', newClassNames.join(' '));
		};
	}(fQuery));

Usage:

$('#elementId').removePrefixedClasses('prefix-of-classes_');

Solution 10 - Javascript

In one line ... Removes all classes that match a regular expression someRegExp

$('#my_element_id').removeClass( function() { return (this.className.match(/someRegExp/g) || []).join(' ').replace(prog.status.toLowerCase(),'');});

Solution 11 - Javascript

I know it's an old question, but I found out new solution and want to know if it has disadvantages?

$('#a')[0].className = $('#a')[0].className
                              .replace(/(^|\s)bg.*?(\s|$)/g, ' ')
                              .replace(/\s\s+/g, ' ')
                              .replace(/(^\s|\s$)/g, '');

Solution 12 - Javascript

Prestaul's answer was helpful, but it didn't quite work for me. The jQuery way to select an object by id didn't work. I had to use

document.getElementById("a").className

instead of

$("#a").className

Solution 13 - Javascript

I also use hyphen'-' and digits for class name. So my version include '\d-'

$('#a')[0].className = $('#a')[0].className.replace(/\bbg.\d-*?\b/g, '');

Solution 14 - Javascript

(function($)
{
    return this.each(function()
    {
        var classes = $(this).attr('class');

        if(!classes || !regex) return false;

        var classArray = [];

        classes = classes.split(' ');

        for(var i=0, len=classes.length; i<len; i++) if(!classes[i].match(regex)) classArray.push(classes[i]);

        $(this).attr('class', classArray.join(' '));
    });
})(jQuery);

Solution 15 - Javascript

The top answer converted to jQuery for those wanting a jQuery only solution:

const prefix = 'prefix'
const classes = el.attr('class').split(' ').filter(c => !c.startsWith(prefix))
el.attr('class', classes.join(' ').trim())

Solution 16 - Javascript

$("#element").removeAttr("class").addClass("yourClass");

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBradView Question on Stackoverflow
Solution 1 - JavascriptKabir SarinView Answer on Stackoverflow
Solution 2 - JavascriptPatView Answer on Stackoverflow
Solution 3 - JavascriptPete BView Answer on Stackoverflow
Solution 4 - JavascriptPrestaulView Answer on Stackoverflow
Solution 5 - JavascriptabernierView Answer on Stackoverflow
Solution 6 - JavascriptMaxView Answer on Stackoverflow
Solution 7 - Javascriptuser4661317View Answer on Stackoverflow
Solution 8 - JavascriptIvanView Answer on Stackoverflow
Solution 9 - JavascriptPawelView Answer on Stackoverflow
Solution 10 - JavascriptAdam111pView Answer on Stackoverflow
Solution 11 - JavascriptJan.JView Answer on Stackoverflow
Solution 12 - JavascriptBradView Answer on Stackoverflow
Solution 13 - JavascriptjamlandView Answer on Stackoverflow
Solution 14 - JavascriptRobView Answer on Stackoverflow
Solution 15 - Javascriptdanday74View Answer on Stackoverflow
Solution 16 - Javascriptmajorsk8View Answer on Stackoverflow