关于javascript:删除所有以特定字符串开头的类

关于javascript:删除所有以特定字符串开头的类

Remove all classes that begin with a certain string

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

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

在单词边界\b上进行正则表达式分割不是最佳解决方案:

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

或作为jQuery mixin:

1
2
3
4
5
6
7
8
9
$.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更新:

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

使用jQuery,实际的DOM元素的索引为零,这应该可以工作

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


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

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

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

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

您可以修改它以支持任何前缀,但是更快的方法在上面,因为RegExp将仅编译一次:

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

使用$.fn.removeClass的第二个签名:

1
2
3
4
5
6
7
8
9
10
11
// Considering:
var $el = $('');

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

$el.removeClass(makeRemoveClassHandler(/^foo-/));
//> [??]

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

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

这个对我有用 ;)

干杯


我将使用简单的jQuery构造和数组处理函数使用的一种方法是声明一个函数,该函数采用控件的ID和类的前缀并删除所有已分类的类。附带的代码:

1
2
3
4
5
6
7
8
function removeclasses(controlIndex,classPrefix){
    var classes = $("#"+controlIndex).attr("class").split("");
    $.each(classes,function(index) {
        if(classes[index].indexOf(classPrefix)==0) {
            $("#"+controlIndex).removeClass(classes[index]);
        }
    });
}

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

1
removeclasses("a","bg");

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(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));

用法:

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

对于现代浏览器:

1
2
3
4
let element = $('#a')[0];
let cls = 'bg';

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

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

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

一行...
删除所有与正则表达式someRegExp匹配的类

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(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);

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

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

Prestaul的回答很有帮助,但对我而言并不奏效。通过id选择对象的jQuery方法无效。我不得不用

1
document.getElementById("a").className

代替

1
$("#a").className

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


推荐阅读