我有一个id="a"
的div,可以从几个组中附加任意数量的类。每个组都有一个特定的前缀。在javascript中,我不知道该组中的哪个类在div上。我希望能够清除具有给定前缀的所有类,然后添加一个新类。如果我想删除所有以“bg”开头的类,我该怎么做?像这样的东西,但实际上有效:
$("#a").removeClass("bg*");
答案 0 :(得分:106)
对字边界\b
进行正则表达式拆分不是最佳解决方案:
var prefix = "prefix";
var classes = el.className.split(" ").filter(function(c) {
return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ").trim();
或作为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 = $.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();
答案 1 :(得分:57)
使用jQuery,实际的DOM元素位于索引零处,这应该可以正常工作
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
答案 2 :(得分:29)
我写了一个简单的jQuery plugin - alterClass,它可以删除通配符类。 也可以选择添加类。
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
答案 3 :(得分:11)
您不需要任何特定于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;
}
答案 4 :(得分:9)
使用$.fn.removeClass
的{{3}}:
// 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>]
答案 5 :(得分:5)
http://www.mail-archive.com/jquery-en@googlegroups.com/msg03998.html说:
...和.removeClass()将删除所有类...
对我有用;)
欢呼声
答案 6 :(得分:2)
我正在为完全相同的问题寻找解决方案。删除以前缀“fontid_”开头的所有类在阅读本文后,我写了一个小插件,我现在正在使用它。
(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));
用法:
$('#elementId').removePrefixedClasses('prefix-of-classes_');
答案 7 :(得分:2)
我将使用简单的jQuery构造和数组处理函数的方法是声明一个函数,它接受类的控件和前缀的id并删除所有类。代码附后:
function removeclasses(controlIndex,classPrefix){
var classes = $("#"+controlIndex).attr("class").split(" ");
$.each(classes,function(index) {
if(classes[index].indexOf(classPrefix)==0) {
$("#"+controlIndex).removeClass(classes[index]);
}
});
}
现在可以从任何地方,按钮或按代码调用此函数:
removeclasses("a","bg");
答案 8 :(得分:1)
我知道这是一个老问题,但我找到了新的解决方案并想知道它是否有缺点?
$('#a')[0].className = $('#a')[0].className
.replace(/(^|\s)bg.*?(\s|$)/g, ' ')
.replace(/\s\s+/g, ' ')
.replace(/(^\s|\s$)/g, '');
答案 9 :(得分:0)
Prestaul的回答很有帮助,但对我来说并不是很有用。通过id选择对象的jQuery方法不起作用。我不得不使用
document.getElementById("a").className
而不是
$("#a").className
答案 10 :(得分:0)
我还使用连字符' - '和数字作为类名。所以我的版本包括'\ d - '
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.\d-*?\b/g, '');
答案 11 :(得分:0)
(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);
答案 12 :(得分:0)
一行...... 删除与正则表达式 someRegExp
匹配的所有类$('#my_element_id').removeClass( function() { return (this.className.match(/someRegExp/g) || []).join(' ').replace(prog.status.toLowerCase(),'');});
答案 13 :(得分:0)
对于现代浏览器:
let element = $('#a')[0];
let cls = 'bg';
element.classList.remove.apply(element.classList, Array.from(element.classList).filter(v=>v.startsWith(cls)));
答案 14 :(得分:0)
对于那些想要仅使用 jQuery 的解决方案的人来说,最佳答案已转换为 jQuery:
const prefix = 'prefix'
const classes = el.attr('class').split(' ').filter(c => !c.startsWith(prefix))
el.attr('class', classes.join(' ').trim())
答案 15 :(得分:-6)
$("#element").removeAttr("class").addClass("yourClass");