关于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");


推荐阅读

    linux命令清除日志?

    linux命令清除日志?,系统,软件,信息,最新,首次,传播,情况,工具,日志,管理系

    linux命令快速清除?

    linux命令快速清除?,系统,档案,命令,位置,名称,不了,文件夹,目录,文件,权限,l

    linux系统删除的命令?

    linux系统删除的命令?,软件,系统,名称,工具,不了,命令,文件夹,电脑,通用,信

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux删除命令文件夹?

    linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

    linux删除本行命令?

    linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

    linux清除安装命令?

    linux清除安装命令?,软件,系统,名称,工具,信息,电脑,终端,命令,程序,面板,lin

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux删除本行命令?

    linux删除本行命令?,系统,本行,档案,命令,资料,商业,文件,终端,目录,文件名,L

    linux删除命令文件夹?

    linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

    linux清除当前命令?

    linux清除当前命令?,系统,工具,命令,文件,指令,终端,进程,步骤,下面,之前,lin

    linux的常用命令清除?

    linux的常用命令清除?,数据,工作,命令,文件夹,网络,系统,百度,管理,名字,文

    linux删除第一行命令?

    linux删除第一行命令?,单位,系统,命令,标的,不了,数字,连续,名称,档案,文件,m

    linux命令行清除一行?

    linux命令行清除一行?,数字,数据,命令,时间,资料,系统,文件,光标,文本,功能,L

    linux命令替换字符串?

    linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结

    linux里删除区间命令?

    linux里删除区间命令?,系统,命令,情况,档案,不了,名称,目录,文件,文件夹,分

    linux命令安条件删除?

    linux命令安条件删除?,系统,命令,不了,通用,名称,文件夹,文件,目录,软件,子

    linux文件夹删除命令?

    linux文件夹删除命令?,系统,命令,不了,档案,名称,通用,文件夹,文件,目录,指

    删除命令linux命令?

    删除命令linux命令?,系统,不了,档案,名称,命令,文件夹,文件,环境,数据,目录,l

    linux删除最近命令?

    linux删除最近命令?,档案,名称,不了,命令,文件,系统,目录,文件夹,指令,参数,l