有没有一种简单的方法可以删除所有匹配的类,比如
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>
感谢!removeClass 函数自 jQuery 1.4 版本起,可以接受一个函数作为参数。
$("#hello").removeClass (function (index, className) {
return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});
removeClass
函数会通过 classes = ( value || "" ).match( rnotwhite ) || [];
从您的类字符串中删除空格。 - eephillipsport-
,nav-
和 color-
? - lowtechsun*-color
结尾的类? - Circle B(color-|sport-|nav-)
. 它将匹配 color-
、sport-
或 nav-
. 因此,上面的答案将变为 /(^|\s)(color-|sport-|nav-)\S+/g
。 - Bogie$('div').attr('class', function(i, c){
return c.replace(/(^|\s)color-\S+/g, '');
});
c未定义
)?至少当我在此页面上尝试下面的插件时,$('a').stripClass('post', 1)
会抛出“TypeError: Cannot call method 'replace' of undefined”。链接 - drzaus$('div [class]')
应该仅返回具有class
的元素,无论它们是否具有值。测试场景:http://jsfiddle.net/drzaus/m83mv/ - drzaus.removeProp('class')
或.className=undefined
这样的边缘情况中,过滤器[class]
仍然返回一些东西,只是它们是undefined
。 因此,从技术上讲,它仍然有一个类(与.removeAttr('class')
相反),这就是为什么它会破坏你的函数但不会破坏我的变体的原因。 http://jsfiddle.net/drzaus/m83mv/4/ - drzausreturn c && c.replace(/\bcolor-\S+/g, '');
- ssmith我编写了一个名为alterClass的插件,可以使用通配符匹配方式移除元素类。还可以选择添加类:https://gist.github.com/1517285
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
Twitter Boostrap
类,就像这样:$(".search div").children('div').alterClass('span* row-fluid');
- Leniel Maccaferri如果您想在其他地方使用它,我建议您使用一个扩展程序。这个扩展对我来说运作良好。
$.fn.removeClassStartingWith = function (filter) {
$(this).removeClass(function (index, className) {
return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
});
return this;
};
使用方法:
$(".myClass").removeClassStartingWith('color');
$.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 的 filter 函数 或者搜索类似于 这个 WTFPL 的 polyfill。
$.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;
};
编辑:第二种方法应该会更快一些,因为它只在整个类字符串上运行一个正则表达式替换。第一种(较短的)使用jQuery自己的removeClass方法,该方法遍历所有现有的类名并逐一测试它们是否符合给定的正则表达式,因此在内部执行相同的任务时需要更多步骤。然而,在实际使用中,差异是微不足道的。
一个通用的函数,用于删除任何以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>
stripClass("btn-")
时,去掉 btn-mini
和 btn-danger
,但不去掉 btn
。stripClass('btn', 1)
时,去掉 horsebtn
和 cowbtn
,但不去掉 btn-mini
或 btn
。$.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://dev59.com/63E85IYBdhLWcg3wtV71#2644364
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开发者所熟知了。但各人有各人的喜好。 - trembyaddClass
,removeClass
和toggleClass
的函数签名,这些函数是每个jQuery开发者都熟知的。阅读文档有什么难的呢? ;) - drzaus我们可以通过 .attr("class")
获取所有的类,然后转换为数组,进行循环和筛选:
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)
- Rich C另一种解决这个问题的方法是使用数据属性,它们本质上是唯一的。
您可以这样设置元素的颜色:$el.attr('data-color','red');
然后您可以这样在CSS中设置样式:[data-color="red"]{ color: tomato; }
这就避免了使用类的需要,因为它会带来需要删除旧类的副作用。