删除所有以某个字符串开头的类

时间:2008-09-11 22:32:28

标签: javascript jquery css

我有一个id="a"的div,可以从几个组中附加任意数量的类。每个组都有一个特定的前缀。在javascript中,我不知道该组中的哪个类在div上。我希望能够清除具有给定前缀的所有类,然后添加一个新类。如果我想删除所有以“bg”开头的类,我该怎么做?像这样的东西,但实际上有效:

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

16 个答案:

答案 0 :(得分:106)

对字边界\b进行正则表达式拆分不是最佳解决方案:

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

或作为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更新:

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

答案 1 :(得分:57)

使用jQuery,实际的DOM元素位于索引零处,这应该可以正常工作

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

答案 2 :(得分:29)

我写了一个简单的jQuery plugin - alterClass,它可以删除通配符类。 也可以选择添加类。

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

答案 3 :(得分:11)

您不需要任何特定于jQuery的代码来处理此问题。只需使用RegExp替换它们:

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

你可以修改它以支持任何前缀,但更快的方法是上面的,因为RegExp只会被编译一次:

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

答案 4 :(得分:9)

使用$.fn.removeClass的{​​{3}}:

// 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>​]

答案 5 :(得分:5)

http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html说:

...和.removeClass()将删除所有类...

对我有用;)

欢呼声

答案 6 :(得分:2)

我正在为完全相同的问题寻找解决方案。删除以前缀“fontid_”开头的所有类在阅读本文后,我写了一个小插件,我现在正在使用它。

(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));

用法:

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

答案 7 :(得分:2)

我将使用简单的jQuery构造和数组处理函数的方法是声明一个函数,它接受类的控件和前缀的id并删除所有类。代码附后:

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

现在可以从任何地方,按钮或按代码调用此函数:

removeclasses("a","bg");

答案 8 :(得分:1)

我知道这是一个老问题,但我找到了新的解决方案并想知道它是否有缺点?

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

答案 9 :(得分:0)

Prestaul的回答很有帮助,但对我来说并不是很有用。通过id选择对象的jQuery方法不起作用。我不得不使用

document.getElementById("a").className

而不是

$("#a").className

答案 10 :(得分:0)

我还使用连字符' - '和数字作为类名。所以我的版本包括'\ d - '

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

答案 11 :(得分:0)

(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);

答案 12 :(得分:0)

一行...... 删除与正则表达式 someRegExp

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

答案 13 :(得分:0)

对于现代浏览器:

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

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

答案 14 :(得分:0)

对于那些想要仅使用 jQuery 的解决方案的人来说,最佳答案已转换为 jQuery:

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

答案 15 :(得分:-6)

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