Eşleşen tüm sınıfları kaldırmanın kolay bir yolu var mı, örneğin,
color-*
eğer bir elementim varsa:
<div id="hello" class="color-red color-brown foo bar"></div>
çıkardıktan sonra,
<div id="hello" class="foo bar"></div>
Teşekkürler!
Eşleşen tüm sınıfları kaldırmanın kolay bir yolu var mı, örneğin,
color-*
eğer bir elementim varsa:
<div id="hello" class="color-red color-brown foo bar"></div>
çıkardıktan sonra,
<div id="hello" class="foo bar"></div>
Teşekkürler!
Yanıtlar:
RemoveClass fonksiyonu yana bir işlev argüman alır jQuery 1.4 .
$("#hello").removeClass (function (index, className) {
return (className.match (/(^|\s)color-\S+/g) || []).join(' ');
});
Canlı örnek: http://jsfiddle.net/xa9xS/1409/
classes = ( value || "" ).match( rnotwhite ) || [];
sport-
, nav-
ve color-
?
*-color
?
(color-|sport-|nav-)
. Eşleşir color-
, veya sport-
, veya nav-
. Yani, yukarıdaki cevap olur /(^|\s)(color-|sport-|nav-)\S+/g
.
$('div').attr('class', function(i, c){
return c.replace(/(^|\s)color-\S+/g, '');
});
c is undefined
) karşı korunmanız gerektiğini düşünüyorum ? En azından bu sayfadaki eklentimde denediğimde , $('a').stripClass('post', 1)
"TypeError: undefined'in" replace "yöntemi çağrılamıyor"
$('div[class]')
sadece öğeleri ile dönmelidir class
. test senaryoları: jsfiddle.net/drzaus/m83mv
.removeProp('class')
veya .className=undefined
filtre [class]
hala bir şey döndürüyor, onlar sadece undefined
. Bu yüzden teknik olarak hala bir sınıfı var (aksine .removeAttr('class')
, fonksiyonunuzu bozuyor, ancak varyantımı değil. Jsfiddle.net/drzaus/m83mv/4
return c && c.replace(/\bcolor-\S+/g, '');
AlterClass adlı bir eklenti yazdım - joker karakter eşleştirme ile öğe sınıflarını kaldırın. İsteğe bağlı olarak sınıf ekleyin: https://gist.github.com/1517285
$( '#foo' ).alterClass( 'foo-* bar-*', 'foobar' )
Twitter Boostrap
böyle sınıfları kaldırmak için gereken bazı kodu yeniden yardımcı oldu :$(".search div").children('div').alterClass('span* row-fluid');
Bunu bir argüman olarak normal ifadeyi alan bir Jquery eklentisi haline getirdim.
Kahve:
$.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(' ');
});
};
Yani, bu durumda, kullanım (hem Kahve hem de Javascript) olacaktır:
$('#hello').removeClassRegex(/^color-/)
Array.filter
IE <9 içinde bulunmayan işlevi kullandığımı unutmayın . Bunun yerine Underscore'un filtre işlevini veya bu WTFPL gibi bir çoklu dolgu için Google'ı kullanabilirsiniz .
Başka yerlerde kullanmak istiyorsanız, size bir uzantı öneriyoruz. Bu benim için iyi çalışıyor.
$.fn.removeClassStartingWith = function (filter) {
$(this).removeClass(function (index, className) {
return (className.match(new RegExp("\\S*" + filter + "\\S*", 'g')) || []).join(' ')
});
return this;
};
Kullanımı:
$(".myClass").removeClassStartingWith('color');
biz tarafından tüm sınıfları alabilirsiniz .attr("class")
, ve Array, Ve döngü ve filtre:
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';
ve değişti ...if (classArr[i].substr(0, prefix.length) != prefix)
@ Tremby en benzer cevap , burada Kobi en @ olduğu cevap ön takı veya son iki maç olacak bir eklenti olarak.
btn-mini
ve ne zaman btn-danger
değil .btn
stripClass("btn-")
horsebtn
ve cowbtn
değil btn-mini
veya btn
ne zamanstripClass('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
gerektiğini hatırlamanız gerekir. Kendini açıklayıcı değil. Normal ifade yazmanın zorluğu nedir? /^match-at-start/
ve /match-at-end$/
her JS geliştiricisi tarafından bilinir. Ama her biri kendi başına.
addClass
, removeClass
ve toggleClass
her jQuery geliştirici bilinen,. Belgeleri okumakla ilgili zor olan nedir? ;)
Bir jQuery eklentisi için bunu deneyin
$.fn.removeClassLike = function(name) {
return this.removeClass(function(index, css) {
return (css.match(new RegExp('\\b(' + name + '\\S*)\\b', 'g')) || []).join(' ');
});
};
veya bu
$.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;
};
Dayanarak ARS81 'ın cevabı (sadece ile başlayan sınıf adlarıyla eşleşmesini), burada daha esnek bir versiyonu. Ayrıca hasClass()
normal ifade sürümü.
Kullanımı: $('.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;
};
Bu, prefix
bir düğümün class
özelliğinden başlayan tüm sınıf adlarını etkin bir şekilde kaldıracaktır . Diğer yanıtlar SVG öğelerini desteklemez ( bunu yazarken), ancak bu çözüm şunları yapar:
$.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
Nesneyi her geri aramadan bir kez oluşturmak daha verimli olmaz mıydı ?
Aynı sorunu vardı ve alt çizgi _.filter yöntemini kullanan aşağıdaki ile geldi. RemoveClass'ın bir işlev aldığını ve size bir sınıf adı listesi sağladığını keşfettikten sonra, bunu bir diziye dönüştürüp removeClass yöntemine geri dönmek için sınıf adını filtrelemek kolaydı.
// 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;
});
Bunu Element.classList kullanarak vanilya JavaScript ile de yapabilirsiniz . Normal bir ifade kullanmaya gerek yok:
function removeColorClasses(element)
{
for (let className of Array.from(element.classList))
if (className.startsWith("color-"))
element.classList.remove(className);
}
Not: Uyarı biz yaratmak olduğunu Array
kopyasını classList
beri önemli başlamadan önce, classList
bir canlı DomTokenList
sınıfları kaldırılır olarak güncellenir hangi.
className
Öğenin DOM nesnesinin özelliğini de kullanabilirsiniz :
var $hello = $('#hello');
$('#hello').attr('class', $hello.get(0).className.replace(/\bcolor-\S+/g, ''));
Şununla başlayan herhangi bir sınıfı kaldıran genel işlev 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>
Sözcük sınırındaki normal ifade bölünmesi \b
bunun için en iyi çözüm değildir:
var prefix = "prefix";
var classes = el.className.split(" ").filter(function(c) {
return c.lastIndexOf(prefix, 0) !== 0;
});
el.className = classes.join(" ");
veya bir jQuery karışımı olarak:
$.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;
};
'name' sınıf adına sahip birden fazla elemanınız varsa, 'color-'in sınıflarını kaldırmak için şunları yapabilirsiniz: [jquery kullanarak]
var objs = $('html').find('.example');
for(index=0 ; index < obj1s.length ; index++){
objs[index].className = objs[index].className.replace(/col-[a-z1-9\-]*/,'');
}
regex'inize [a-z1-9 -] * koymazsanız, adlarında bir sayı veya bazı '-' olan sınıfları kaldırmaz.
Son ayarlanan rengi kaldırmanız gerekirse, aşağıdakiler size uygun olabilir.
Benim durumumda, bir click olayındaki gövde etiketine bir renk sınıfı eklemem ve ayarlanan son rengi kaldırmam gerekiyordu. Bu durumda, geçerli rengi saklar ve son ayarlanan rengi kaldırmak için veri etiketine bakarsınız.
Kod:
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
Tam olarak ihtiyacınız olan şey olmayabilir, ama benim için öyleydi ve bu baktığım ilk SO soruydu, bu yüzden herkese yardımcı olması durumunda çözümümü paylaşacağımı düşündüm.
Bu soruna yaklaşmanın alternatif bir yolu, doğası gereği benzersiz olan veri özelliklerini kullanmaktır.
Aşağıdaki gibi bir öğenin rengini belirlersiniz: $el.attr('data-color', 'red');
Ve css'de şöyle stil uygularsınız: [data-color="red"]{ color: tomato; }
Bu, eski sınıfları kaldırmanın yan etkisi olan sınıfları kullanma ihtiyacını ortadan kaldırır.