我有一个 div,id="a"
它可能有任意数量的类,来自多个组。每个组都有一个特定的前缀。在 javascript 中,我不知道该组中的哪个类在 div 上。我希望能够清除具有给定前缀的所有类,然后添加一个新类。如果我想删除所有以“bg”开头的类,我该怎么做?像这样的东西,但实际上有效:
$("#a").removeClass("bg*");
我有一个 div,id="a"
它可能有任意数量的类,来自多个组。每个组都有一个特定的前缀。在 javascript 中,我不知道该组中的哪个类在 div 上。我希望能够清除具有给定前缀的所有类,然后添加一个新类。如果我想删除所有以“bg”开头的类,我该怎么做?像这样的东西,但实际上有效:
$("#a").removeClass("bg*");
在字边界上拆分正则表达式\b
并不是解决此问题的最佳解决方案:
var prefix = "prefix";
var classes = el.className.split(" ").filter(function(c) {
return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ").trim();
或作为 jQuery 混合:
$.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();
使用 jQuery,实际 DOM 元素的索引为零,这应该可以工作
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
我编写了一个简单的jQuery 插件 - alterClass,它可以删除通配符类。也可以选择添加类。
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
您不需要任何 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;
}
使用第二个签名的$.fn.removeClass
:
// 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>]