2012-03-31 13 views
18

znalazłem następujące regex z innego pytanie przepełnienie stosu: Change an element's class with JavaScriptUsuń classname od elementu z javascript

I zostały wykorzystane w ramach mojego skryptu z powodzeniem, jednak w innym wydaje się niepowodzeniem.

wrzuciłem razem bardzo minimalistyczny przypadek testowy na jsFiddle, a także braku:

http://jsfiddle.net/ew47Y/1/

HTML:

<div class="foo" id="foo"> 
    hello 
</div>​ 

JS:

$(document).ready(function(){ 
    foo = document.getElementById('foo'); 
    foo.className += ' bar foobar'; 
    alert(foo.className); 
    foo.className.replace(/(?:^|\s)bar(?!\S)/ , '') 
    alert(foo.className); 
})​ 
+0

jestem zdezorientowany mieszaniny jQuery i non-jQuery jQuery uproszczonych robić rzeczy –

+1

Piszę biblioteki i uważam, że to złe praktyki, aby jedna biblioteka wymaga innego. –

+0

proszę sprawdzić tę odpowiedź [Usuń i dodaj klasę css za pomocą javascript] (http://stackoverflow.com/a/33434902/2466310) – thejustv

Odpowiedz

38

to dlatego, replace nie modyfikuje łańcucha wzywaj to; raczej zwraca nowy ciąg. Więc:

 foo.className = foo.className.replace(/(?:^|\s)bar(?!\S)/ , '') 

(Nawiasem mówiąc, w rzeczywistości nie trzeba robić tego surowca JavaScript, jQuery, ponieważ obiekty oferują removeClass metody. http://api.jquery.com/removeClass/ więc można napisać:

 $('#foo').removeClass('bar'); 

lub :

 $(foo).removeClass('bar'); 

)

+15

Funkcja Pure JS: 'function removeClass (e, c) {nazwa.klasy = nazwa.klasy .replace (nowy RegExp ('(?:^| \\ s)' + c + '(?!\\ S) '),' ');} ' – pppglowacki

+0

Jeśli chcesz usunąć wszystkie wystąpienia nazwy klasy, użyj modyfikatora [' g'] (http://www.w3schools.com/jsref/jsref_regexp_g.asp) na końcu wyrażenia regularnego, tak jak poniżej: 'foo.className.replace (/ (^ | \ s) bar (?! \ S)/g, '')'. Nawiasem mówiąc, użycie grupy [nie przechwytującej] (http://www.regular-expressions.info/refadv.html) '(? :)' nie jest tutaj konieczne. – Adam

+1

Należy zauważyć, że użycie [metacharacter border metacharacter '\ b'] (http://www.regular-expressions.info/wordboundaries.html), takich jak:' foo.className.replace (/ \ bbar \ b/g , '') ', nie jest tutaj odpowiednie, ponieważ granica słowa występuje również między znakiem słownym' [A-Za-z0-9_] 'i znakiem' -'. Dlatego nazwa klasy np. * "inna klasa słupków" * również zostanie zastąpiona, co spowoduje, że * "inna klasa" *. Jednak w przeciwieństwie do powyższych rozwiązań, rozwiązanie "\ b" nie usuwa znaku odstępu '\ s' przed nazwą klasy, więc ciąg, np. * "pasek pierwszego paska" * kończy się jako * "firstbar" *. – Adam

6
foo.className = foo.className.replace(/(?:^|\s)bar(?!\S)/ , ''); 

lub z jQuery (które wydają się być za pomocą):

foo.removeClass('bar'); 
1

Istnieje również rozwiązanie, które wykorzystują word boundary metacharacter \b:

foo.className.replace(/\bbar\b/g ,''); 

może to apartament kogoś, ale należy pamiętać, granica słowo występuje także między znakiem słownym [A-Za-z0-9_] a znakiem kreskowym -. Dlatego nazwa klasy np. "inna klasa prętów" również zostanie zastąpiona, co spowoduje powstanie "innej - klasy". Jednakże, w przeciwieństwie do powyższych rozwiązań, rozwiązanie "\b" nie usuwa znaku odstępu przed nazwą klasy, co może być pożądane, a więc ciąg, np. "Pierwszy pasek" zakończy się jako "pierwszy pasek".

19

Nie zapomnij o classList.

el.classList.remove('boop');

http://jsfiddle.net/yXQL3/

+2

nie działa (tylko) na IE 8, 9 i Opera Mini 8 http://caniuse.com/#feat=classlist – maciek