Wyrażenie regularne, takie jak w „akceptowanej odpowiedzi”, złamie się na nieprzestrzennych granicach słów. Poniżej zamieściłem alternatywne rozwiązanie. Zobacz także: stackoverflow.com/questions/57812/…
Pomyślałem, że warto zauważyć, że przechwyci to wiodącą białą grupę dopasowanych klas, które nie zaczynają się od początku. JavaScript nie obsługuje pozytywnego wyglądu, więc musisz użyć obejścia grupy przechwytywania. Jest to jednak kwestia dyskusyjna, ponieważ funkcja removeClass usunie dla ciebie białe znaki z ciągu klasyclasses = ( value || "" ).match( rnotwhite ) || [];
@lowtechsun możesz dodać w wyrażeniu regularnym w ten sposób (color-|sport-|nav-). Będzie pasować color-, lub sport-, lub nav-. Tak więc powyższa odpowiedź stałaby się /(^|\s)(color-|sport-|nav-)\S+/g.
Przyjęta odpowiedź jest poprawna, ale idiomatycznie użyłbym \ b, który pasuje do dowolnej granicy słów, a nie do bardziej nieporadnych (^ | \ s). Na przykład, aby usunąć wszystkie klasy składające się ze słowa magia, po której następuje nieujemna liczba całkowita i tylko te, dopasowałbym na / \ bmagic \ d + \ b /.
myślę, że musisz chronić się przed pustymi klasami ( c is undefined)? Przynajmniej kiedy wypróbowałem to poniżej w mojej wtyczce na tej stronie, $('a').stripClass('post', 1)rzuciłem „TypeError: Nie można nazwać metody„ replace ”niezdefiniowanej”
@Kobi tak, nie sądzę, że można filtrować atrybut i zwracać wynik, który go nie ma - $('div[class]')powinien zwracać tylko elementy class, niezależnie od tego, czy mają wartość, czy nie. scenariusze testowe: jsfiddle.net/drzaus/m83mv
@Kobi - Myślę, że rozumiem, o co ci chodzi; w skrajnych przypadkach jak .removeProp('class')lub .className=undefinedfiltr [class]wciąż coś zwraca, są po prostu undefined. Więc technicznie nadal ma klasę (w przeciwieństwie do .removeAttr('class'), dlatego psuje twoją funkcję, ale nie mój wariant. Jsfiddle.net/drzaus/m83mv/4
Napisałem wtyczkę, która robi to o nazwie alterClass - Usuń klasy elementów z dopasowaniem symboli wieloznacznych. Opcjonalnie dodaj klasy: https://gist.github.com/1517285
Naprawdę bardzo miło ... pomógł mi ponownie użyć kodu, w którym musiałem tylko usunąć Twitter Boostraptakie klasy:$(".search div").children('div').alterClass('span* row-fluid');
Tak więc w tym przypadku użycie byłoby (zarówno Kawa, jak i JavaScript):
$('#hello').removeClassRegex(/^color-/)
Zauważ, że używam Array.filterfunkcji, która nie istnieje w IE <9. Możesz użyć funkcji filtru podkreślenia zamiast Google lub Google do wypełnienia takiego jak ten WTFPL .
możemy pobrać wszystkie klasy .attr("class"), i do tablicy, i zapętlić i filtrować:
var classArr = $("#sample").attr("class").split(" ")
$("#sample").attr("class","")for(var i =0; i < classArr.length; i ++){// some condition/filterif(classArr[i].substr(0,5)!="color"){
$("#sample").addClass(classArr[i]);}}
Podobny do użytkownika @ tremby odpowiedź , oto @ Kobi za odpowiedź jako plugin, który będzie pasował zarówno przedrostków lub przyrostków.
np. paski btn-minii btn-dangerale nie btnkiedy stripClass("btn-").
np. paski horsebtni cowbtnale nie btn-minilub btnkiedystripClass('btn', 1)
Kod:
$.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 =newRegExp((!endOrBegin ?"\\b":"\\S+")+ partialMatch +"\\S*",'g');// https://stackoverflow.com/a/2644364/1037948this.attr('class',function(i, c){if(!c)return;// protect against no classreturn c.replace(x,'');});returnthis;};
@tremby przepraszam, miałem na myśli prostsze w typowym użyciu (tj. przedrostki i przyrostki), ponieważ nie trzeba za każdym razem pisać wyrażenia regularnego
Nadal się nie zgadzam. Swoją metodą musisz przeczytać dokumentację i pamiętać, jaką dokładnie endOrBeginpowinna być wartość. To nie jest oczywiste. Co jest trudnego w napisaniu wyrażenia regularnego? /^match-at-start/i /match-at-end$/są znane wszystkim programistom JS. Ale każdy na swój.
@tremby inny niż Wyrażenia regularne żebranie być nadużywane, opcja non-regex bardziej zbliżony do istniejącego podpisu addClass, removeClassi toggleClass, który jest znany każdemu jQuery dewelopera. Co jest trudne w czytaniu dokumentacji? ;)
Nie ma nic trudnego w czytaniu dokumentacji, ale jak mówi @tremby, jego rozwiązanie jest oczywiste, podczas gdy twoje wymaga dokumentacji. Z oczywistych względów prostsze w użyciu są rozwiązania.
Na podstawie ARS81 „s odpowiedź (to tylko mecze nazwy klas rozpoczynające się), tutaj jest bardziej elastyczna wersja. Również hasClass()wersja wyrażenia regularnego.
$.fn.removeClassRegex =function(name){returnthis.removeClass(function(index, css){return(css.match(newRegExp('\\b('+ name +')\\b','g'))||[]).join(' ');});};
$.fn.hasClassRegex =function(name){returnthis.attr('class').match(newRegExp('\\b('+ name +')\\b','g'))!==null;};
To skutecznie usunie wszystkie nazwy klas, które zaczynają się prefixod classatrybutu węzła . Inne odpowiedzi nie obsługują elementów SVG (w momencie pisania tego), ale to rozwiązanie:
$.fn.removeClassPrefix =function(prefix){var c, regex =newRegExp("(^|\\s)"+ prefix +"\\S+",'g');returnthis.each(function(){
c =this.getAttribute('class');this.setAttribute('class', c.replace(regex,''));});};
Miałem ten sam problem i przedstawiłem następujące, które wykorzystują metodę _.filter podkreślenia. Gdy odkryłem, że removeClass przyjmuje funkcję i udostępnia listę nazw klas, łatwo było przekształcić ją w tablicę i odfiltrować nazwę klasy, aby powrócić do metody removeClass.
Możesz to również zrobić za pomocą waniliowego JavaScript za pomocą Element.classList . Nie ma potrzeby używania wyrażenia regularnego:
function removeColorClasses(element)
{
for (let className of Array.from(element.classList))
if (className.startsWith("color-"))
element.classList.remove(className);
}
Uwaga: zauważ, że tworzymy Arraykopię classListprzed rozpoczęciem, jest to ważne, ponieważ classListjest to transmisja na żywo, DomTokenListktóra będzie aktualizowana po usunięciu klas.
Jeśli chcesz tylko usunąć ostatni ustawiony kolor, poniższe mogą Ci odpowiadać.
W mojej sytuacji musiałem dodać klasę kolorów do tagu body na zdarzeniu kliknięcia i usunąć ostatni ustawiony kolor. W takim przypadku zapisujesz bieżący kolor, a następnie wyszukujesz znacznik danych, aby usunąć ostatni ustawiony kolor.
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
Może nie być dokładnie tym, czego potrzebujesz, ale dla mnie było to i było to pierwsze pytanie SO, na które spojrzałem, więc pomyślałem, że podzielę się moim rozwiązaniem, na wypadek, gdyby komukolwiek to pomogło.
W tym momencie jest to na własne ryzyko, nie zostało jeszcze odrzucone ani przegłosowane. Więc możesz przenieść to do własnego pytania bez ryzyka. Staraj się także unikać duplikatów, sprawdzając, czy jest już pytanie na ten temat.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.