jQuery removeClass通配符

时间:2010-04-15 10:01:31

标签: jquery html

是否有任何简单的方法可以删除所有匹配的类,例如

color-*

所以,如果我有一个元素:

<div id="hello" class="color-red color-brown foo bar"></div>

删除后,它将是

<div id="hello" class="foo bar"></div>

谢谢!

17 个答案:

答案 0 :(得分:618)

removeClass函数从jQuery 1.4开始采用函数参数。

$("#hello").removeClass (function (index, className) {
    return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});

实例:http://jsfiddle.net/xa9xS/1409/

答案 1 :(得分:92)

$('div').attr('class', function(i, c){
    return c.replace(/(^|\s)color-\S+/g, '');
});

答案 2 :(得分:50)

我编写了一个名为alterClass的插件 - 使用通配符匹配删除元素类。可选择添加类:https://gist.github.com/1517285

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

答案 3 :(得分:15)

我将它概括为一个Jquery插件,它以正则表达式作为参数。

咖啡:

$.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(' ');
  });
};

因此,对于这种情况,使用将是(Coffee和Javascript):

$('#hello').removeClassRegex(/^color-/)

请注意,我正在使用IE&lt; 9中不存在的Array.filter函数。您可以使用Underscore's filter function代替Google,也可以使用Google代替this WTFPL one等填充。

答案 4 :(得分:8)

如果你想在其他地方使用它,我建议你扩展。这个对我来说很好。

 $.fn.removeClassStartingWith = function (filter) {
    $(this).removeClass(function (index, className) {
        return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
    });
    return this;
};

用法:

$(".myClass").removeClassStartingWith('color');

答案 5 :(得分:4)

与@ tremby的answer类似,这里是@ Kobi的answer作为插件,可以匹配前缀或后缀。

  • ex)在btn-mini时剥离btn-dangerbtn但不stripClass("btn-")
  • ex)在horsebtn
  • 时剥离cowbtnbtn-mini但不会btnstripClass('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;
};

https://gist.github.com/zaus/6734731

答案 6 :(得分:4)

我们可以通过.attr("class")以及Array,And循环和&amp;获取所有类。过滤器:

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]);
    }
}

演示:http://jsfiddle.net/L2A27/1/

答案 7 :(得分:2)

我遇到了同样的问题,并提出了使用下划线的_.filter方法的以下内容。一旦我发现removeClass接受一个函数并为你提供了一个类名列表,就可以很容易地将它转换成一个数组并过滤掉类名以返回到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;
});

答案 8 :(得分:2)

这将从节点的prefix属性中有效删除所有以class开头的类名。其他答案不支持 SVG 元素(截至撰写本文时),但此解决方案可以:

$.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, ''));
    });
};

答案 9 :(得分:2)

基于ARS81&#39; answer(只匹配以...开头的类名),这里的版本更灵活。也是hasClass()正则表达式版本。

用法:$('.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;
};

答案 10 :(得分:1)

您还可以使用元素DOM对象的className属性:

var $hello = $('#hello');
$('#hello').attr('class', $hello.get(0).className.replace(/\bcolor-\S+/g, ''));

答案 11 :(得分:1)

您也可以使用Element.classList使用普通JavaScript来执行此操作。无需使用正则表达式:

jupyter nbconvert --execute --inplace my_notebook.ipynb

注意:请注意,我们在开始之前创建了 function removeColorClasses(element) { for (let className of Array.from(element.classList)) if (className.startsWith("color-")) element.classList.remove(className); } 的{​​{1}}副本,这很重要,因为Array是实时classList,它将作为类进行更新被删除。

答案 12 :(得分:1)

解决此问题的另一种方法是使用数据属性,这些属性本质上是唯一的。

您将设置元素的颜色,例如:$el.attr('data-color', 'red');

您将使用[data-color="red"]{ color: tomato; }

这消除了使用类的需要,这具有需要删除旧类的副作用。

答案 13 :(得分:0)

如果您有多个具有类名称的元素&#39;示例&#39;,要删除所有类别中的&#39;颜色 - &#39;您可以执行此操作:[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\-]*/,'');
}

如果你没有在你的正则表达式中加上[a-z1-9 - ] *,它就不会删除那些有数字或者某些类别的课程。 - &#39;在他们的名字。

答案 14 :(得分:0)

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

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

或作为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 = classes.join(" ");
    });
    return this;
};

答案 15 :(得分:0)

如果您只需要删除最后设定的颜色,以下内容可能适合您。

在我的情况下,我需要在click事件的body标签上添加一个颜色类,并删除最后设置的颜色。在这种情况下,您存储当前颜色,然后查找数据标记以删除最后设置的颜色。

代码:

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

可能不是你需要的,但对我而言,这是我看到的第一个SO问题,所以我想我会分享我的解决方案以防万一。

答案 16 :(得分:0)

一个通用函数,用于删除任何以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>