是否有任何简单的方法来删除所有匹配的类,例如,
color-*
所以如果我有一个元素:
<div id="hello" class="color-red color-brown foo bar"></div>
删除后,它将是
<div id="hello" class="foo bar"></div>
谢谢!
是否有任何简单的方法来删除所有匹配的类,例如,
color-*
所以如果我有一个元素:
<div id="hello" class="color-red color-brown foo bar"></div>
删除后,它将是
<div id="hello" class="foo bar"></div>
谢谢!
Answers:
从jQuery 1.4开始,removeClass函数接受一个函数参数。
$("#hello").removeClass (function (index, className) {
return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});
classes = ( value || "" ).match( rnotwhite ) || [];
sport-
,nav-
和color-
?
*-color
?
(color-|sport-|nav-)
。它将与color-
或sport-
或匹配nav-
。因此,以上答案将变为/(^|\s)(color-|sport-|nav-)\S+/g
。
$('div').attr('class', function(i, c){
return c.replace(/(^|\s)color-\S+/g, '');
});
c is undefined
)?至少当我在此页面上的插件中尝试以下操作时,$('a').stripClass('post', 1)
抛出“ TypeError:无法调用未定义的方法'replace'”
$('div[class]')
应该仅返回带有的元素class
,无论它们是否具有值。测试方案:jsfiddle.net/drzaus/m83mv
.removeProp('class')
或.className=undefined
过滤器[class]
仍返回某些内容的情况下,它们只是undefined
。因此从技术上讲,它仍然具有一个类(与相对.removeAttr('class')
,这就是为什么它破坏了您的功能但没有我的变体的 原因。jsfiddle.net
return c && c.replace(/\bcolor-\S+/g, '');
我编写了一个名为alterClass的插件-删除具有通配符匹配的元素类。(可选)添加类:https : //gist.github.com/1517285
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
Twitter Boostrap
类的代码:$(".search div").children('div').alterClass('span* row-fluid');
我已经将其概括为一个使用正则表达式作为参数的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-/)
请注意,我使用的Array.filter
是IE <9中不存在的功能。您可以改用Underscore的过滤器功能,也可以使用Google进行类似WTFPL这样的polyfill。
如果您想在其他地方使用它,我建议您扩展。这对我来说很好。
$.fn.removeClassStartingWith = function (filter) {
$(this).removeClass(function (index, className) {
return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
});
return this;
};
用法:
$(".myClass").removeClassStartingWith('color');
我们可以通过获取所有类.attr("class")
,并获取Array,And和loop&filter:
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]);
}
}
var prefix='color';
和更改...if (classArr[i].substr(0, prefix.length) != prefix)
到@ tremby的类似的答案,这里是@了Kobi的答案作为一个插件,将匹配前缀或后缀。
btn-mini
和btn-danger
而不btn
当stripClass("btn-")
。horsebtn
,cowbtn
但不带btn-mini
或btn
何时stripClass('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;
};
endOrBegin
。这不是不言自明的。编写正则表达式有什么困难?/^match-at-start/
并且/match-at-end$/
每个JS开发人员都知道。但是每个人都有自己的。
addClass
,removeClass
和toggleClass
,这是众所周知的每一个jQuery的开发者。阅读文档有什么困难?;)
对于jQuery插件,请尝试以下操作
$.fn.removeClassLike = function(name) {
return this.removeClass(function(index, css) {
return (css.match(new RegExp('\\b(' + name + '\\S*)\\b', 'g')) || []).join(' ');
});
};
或这个
$.fn.removeClassLike = function(name) {
var classes = this.attr('class');
if (classes) {
classes = classes.replace(new RegExp('\\b' + name + '\\S*\\s?', 'g'), '').trim();
classes ? this.attr('class', classes) : this.removeAttr('class');
}
return this;
};
根据ARS81的回答(仅匹配以开头的类名),这是一个更灵活的版本。也是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;
};
这将有效地删除所有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, ''));
});
};
RegExp
在每个回调中创建一次对象不是更有效吗?
我遇到了同样的问题,并提出了以下使用下划线的_.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;
});
您也可以使用Element.classList使用香草JavaScript进行此操作。也无需使用正则表达式:
function removeColorClasses(element)
{
for (let className of Array.from(element.classList))
if (className.startsWith("color-"))
element.classList.remove(className);
}
注意:请注意,我们在开始之前创建了一个Array
副本classList
,这一点很重要,因为这classList
是一个实时DomTokenList
版本,随着类的删除而更新。
泛型函数,用于删除任何以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>
在单词边界上进行正则表达式分割\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;
};
如果您有多个具有类名“ example”的元素,则要在所有元素中都删除“ color-”类,可以执行以下操作:[使用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-] *,则不会删除名称中带有数字或某些“-”的类。
如果您只需要删除最后设置的颜色,则可能需要以下设置。
在我的情况下,我需要在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问题,因此我想我会分享我的解决方案,以防它对任何人有帮助。
解决此问题的另一种方法是使用数据属性,该属性本质上是唯一的。
您可以将元素的颜色设置为: $el.attr('data-color', 'red');
您可以在CSS中设置样式,例如: [data-color="red"]{ color: tomato; }
这消除了使用类的需要,而这具有需要删除旧类的副作用。