Answers:
使用jQuery,实际的DOM元素的索引为零,这应该可以工作
$('#a')[0].className = $('#a')[0].className.replace(/\bbg.*?\b/g, '');
在单词边界上进行正则表达式分割\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();
filter
必须返回布尔值。这将起作用:var classes = $(e).attr("class").split(" "); $(classes).each(function(i, item) { classes[i] = item.indexOf("prefix") === -1 ? item : "prefix-new"); }); $(e).attr("class", classes.join(" "));
$e.attr('class', $.map($e.attr('class').split(' '), function (klass) { return klass.indexOf(prefix) != 0 ? klass : undefined; }).join(' '));
class="blackRow blackText orangeFace blackHead"
它将返回。我通过调整结果来解决此问题,如下所示:。class=" orangeFace "
removeClassPrefix("black");
el.className = $.trim(classes.join(" "));
我已经编写了一个简单的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>]
http://www.mail-archive.com/jquery-zh@googlegroups.com/msg03998.html说:
...和.removeClass()将删除所有类...
这个对我有用 ;)
干杯
我将使用简单的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");
我一直在寻找完全相同的问题的解决方案。删除所有以前缀“ 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_');
Prestaul的回答很有帮助,但对我而言并不奏效。通过id选择对象的jQuery方法无效。我不得不用
document.getElementById("a").className
代替
$("#a").className
(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);
$("#element").removeAttr("class").addClass("yourClass");