Javascript 使用JQuery removeClass()删除除一个类以外的所有类

Javascript 使用JQuery removeClass()删除除一个类以外的所有类,javascript,jquery,jquery-selectors,removeclass,Javascript,Jquery,Jquery Selectors,Removeclass,好的,我有一个有趣的(嗯,无论如何,对我来说很有趣:) 在这种情况下,我有一个带有静态类值的div,但它也可以有一个单独的、动态的“次要类”。当用户做出选择时,需要删除任何现有的辅助类并添加新类 忽略使用id值(项目标准使用类…无法更改),在添加新类之前,是否有一种优雅的方法可以简单地忽略第一个类并删除任何其他类 启动HTML的示例: <div class="staticClass dynaClass1" /> 如果使用updateClass(“dynaClass2”)调用函数,生

好的,我有一个有趣的(嗯,无论如何,对我来说很有趣:)

在这种情况下,我有一个带有静态类值的div,但它也可以有一个单独的、动态的“次要类”。当用户做出选择时,需要删除任何现有的辅助类并添加新类

忽略使用id值(项目标准使用类…无法更改),在添加新类之前,是否有一种优雅的方法可以简单地忽略第一个类并删除任何其他类

启动HTML的示例:

<div class="staticClass dynaClass1" />
如果使用
updateClass(“dynaClass2”)调用函数,生成的HTML应为:

<div class="staticClass dynaClass2" />

我可以考虑使用
removeClass()删除所有类的方法attr(“class”,“staticClass”+newSecondaryClass”)将“staticClass”添加回,但我想知道是否有一种方法可以在不接触静态类的情况下处理它


最后,我想这是一个学术问题,比什么都重要。看起来这是应该可以做到的,但我不知道怎么做D

您可以删除所有类并添加要保留的类:

$(".staticClass").removeClass().addClass('staticClass');
在没有参数的情况下调用
removeClass()
,将删除所有类

如果不想这样做,只需修改class属性即可:

$(".staticClass").attr('class', 'staticClass');

您可以使用
.attr()
函数设置它所需的类。因此:

$('.staticClass').attr('class','<any classes required');

$('.staticClass').attr('class','您可以传递一个函数来删除类,该函数返回除静态类以外的所有类:

$('.staticClass').removeClass(function(index, klass) { 
  return klass.replace(/(^|\s)+staticClass\s+/, ''); 
})

这将返回对象上的所有类,而不返回静态类,因此将删除除静态类以外的所有类。

所有类都是通过调用Javascript DOM
元素来操作的。className
,因此基本上jQuery的
addClass
只是替换了该字符串。您可以在

这意味着如果你打电话

$('.staticClass').addClass('someClass');
元素.className
仍然会被替换,但会包含新类。(这意味着您的
staticClass
实际上会被触摸:)

当你打电话的时候

$('.staticClass').removeClass().addClass('staticClass');
您将替换该字符串两次,这样做没有问题。

将函数传递给
.removeClass()
本页修改了Beat Richartz的答案。 注意:我试图将此作为编辑发布,但被拒绝。这个概念是相同的,带有改进的正则表达式

改进的正则表达式提供多个类的单词边界匹配

// Remove all classes except those specified
$('span').removeClass(function () { 
    return $(this).attr('class').replace(/\b(?:hello|world)\b\s*/g, ''); 
});
之前:

你好,世界`
之后:

你好,世界`
试试看:

将其作为jQuery插件进行尝试:


FWIW:当您不想用
.attr('class','')中的其他类替换现有类时,此方法是必需的
,但是只想删除那些与类列表不匹配的类。

是不是事先就知道了
staticClass
,或者我们必须这样处理任何首先出现的类名?试试这个:注意,从“第一类”和“其他类”的角度思考有点离谱;在元素的类集合中没有顺序。删除所有类并重新分配特定类确实是最“优雅的”way.jQuery不为这些方法提供任何模式匹配。Álvaro-好吧,该类被用作选择器,因此它是已知的,但理想情况下,它不会硬编码,以便更容易重用。可能会作为第二个参数传递给函数。很酷,但这家伙已经想到了这一点(看问题的结尾)@drinchev我想我应该把问题读到最后。我更新了一个不同的建议。这种方法不允许不添加“staticClass”的元素,因为这可能不是您的意图。也就是说,
将变成
,但这是真实的概念如果要删除除指定类以外的所有类,此示例中的结果应该是
。将正则表达式替换函数传递给
.removeClass()
允许所选元素保留指定的类(如果有的话),但删除该元素中尚未具有指定类的所有类。这有两个问题。首先,如果匹配的字符串后面有任何类/字,它将不会创建空格;其次,它还将匹配
foostaticClassbar
@jAndy关于匹配,你是对的,但是关于空间创建,你是错的。返回值被传递给removeClass,由jQuery接管并分配新值。这就是我想寻找的东西,但是jAndy对于必须处理静态类在返回组中的位置提出了很好的观点。@talemyn jQuery接收返回值并将其传递给
removeClass
。该函数只会将字符串中的静态值替换为零,因此确保jquery只删除返回字符串中的类。FYI-而
.attr('class','')
方法可能是处理特定情况的最有效的方法,这个答案确实解决了我所寻找的问题,这是一种使用
removeClass()
排除类的方法。感谢大家的投入。我想我关心的是使用默认的“removeClass”会有额外的间隔(无论多么短)当静态类被取消分配给div时,意味着与之相关的任何样式都将消失。但是我明白您的观点,即在使用“addClass”时静态类将始终被“触动”。相反,如果您只想删除与列表匹配的类,则为:
$('span')。removeClass('hello world');
// Remove all classes except those specified
$('span').removeClass(function () { 
    return $(this).attr('class').replace(/\b(?:hello|world)\b\s*/g, ''); 
});
<span class="hello foo">hello</span> <span class="world bar">world</span>`
<span class="hello">hello</span> <span class="world">world</span>`