Do tej pory muszę to zrobić:
elem.classList.add("first");
elem.classList.add("second");
elem.classList.add("third");
Chociaż jest to wykonalne w jQuery, w ten sposób
$(elem).addClass("first second third");
Chciałbym wiedzieć, czy istnieje jakiś natywny sposób dodawania lub usuwania.
javascript
html
Namiot Enrique Moreno
źródło
źródło
Nowy operator spreadu jeszcze bardziej ułatwia stosowanie wielu klas CSS jako tablicy:
źródło
DOMTokenList
zamiast tablicy? Wiem, że DOMTokenList jest obiektem przypominającym tablicę. Czy jest możliwe użycie tejclassList.add()
metody z tą metodą, czy też DOMTokenList musi zostać przekonwertowany na rzeczywistą tablicę?classList
Właściwość zapewnia, że zduplikowane klasy nie są niepotrzebnie dodany do elementu. Aby zachować tę funkcjonalność, jeśli nie lubisz wersji odręcznych lub wersji jQuery, proponuję dodaćaddMany
funkcję iremoveMany
doDOMTokenList
(rodzajclassList
):Te byłyby użyteczne w następujący sposób:
Aktualizacja
Zgodnie z Twoimi komentarzami, jeśli chcesz napisać niestandardową metodę tylko na wypadek, gdyby nie zostały zdefiniowane, spróbuj wykonać następujące czynności:
źródło
Ponieważ
add()
metoda zclassList
just pozwala na przekazywanie oddzielnych argumentów, a nie pojedynczej tablicy, musisz wywołać funkcjęadd()
apply. Jako pierwszy argument musisz przekazaćclassList
referencję z tego samego węzła DOM, a jako drugi argument tablicę klas, które chcesz dodać:źródło
Aby dodać klasę do elementu
Usuń zajęcia
źródło
className
. Jest to straszne dla wydajności (nawet odzyskanie jego wartości powoduje rozpływ).Nowsze wersje specyfikacji DOMTokenList pozwalają na użycie wielu argumentów do
add()
iremove()
, a także drugiego argumentutoggle()
do wymuszenia stanu.W chwili pisania tego tekstu Chrome obsługuje wiele argumentów do
add()
iremove()
, ale żadna z innych przeglądarek nie obsługuje. IE 10 i starsze, Firefox 23 i starsze, Chrome 23 i starsze oraz inne przeglądarki nie obsługują drugiego argumentu dotoggle()
.Napisałem następujący mały polyfill, aby poprowadzić mnie do momentu rozszerzenia wsparcia:
Nowoczesna przeglądarka zgodna z ES5 i
DOMTokenList
oczekiwana, ale używam tego polyfill w kilku specjalnie ukierunkowanych środowiskach, więc działa świetnie, ale może wymagać poprawek dla skryptów, które będą działać w starszych środowiskach przeglądarek, takich jak IE 8 i starsze .źródło
Możesz zrobić jak poniżej
Dodaj
Usunąć
Odniesienie
TLDR;
W prostym przypadku powyższe usuwanie powinno działać. Ale w przypadku usunięcia należy upewnić się, że klasa istnieje, zanim je usuniesz
źródło
Oto obejście dla użytkowników IE 10 i 11, które wydawało się dość proste.
Lub
źródło
Standardowa definicja pozwala tylko na dodanie lub usunięcie jednej klasy. Kilka małych funkcji opakowania może zrobić to, o co prosisz:
Te opakowania pozwalają określić listę klas jako oddzielne argumenty, ciągi znaków z elementami oddzielonymi spacjami lub przecinkami lub ich kombinację. Na przykład patrz http://jsfiddle.net/jstoolsmith/eCqy7
źródło
Bardzo proste, nie wyszukane, ale działające rozwiązanie, w które musiałbym wierzyć, jest bardzo cross-browser:
Utwórz tę funkcję
Nazwij to tak: removeAddClasses (node.classList, arrayToRemove, arrayToAdd);
... gdzie arrayToRemove jest tablicą nazw klas do usunięcia: ['myClass1', 'myClass2'] etcetera
... a arrayToAdd to tablica nazw klas do dodania: [„myClass3”, „myClass4”] itd.
źródło
Załóżmy, że masz tablicę klas do dodania, możesz użyć składni rozszerzania ES6:
let classes = ['first', 'second', 'third']; elem.classList.add(...classes);
źródło
Podobała mi się odpowiedź @ rich.kelly, ale chciałem użyć tej samej nomenklatury co
classList.add()
(ciągi oddzielone przecinkami), więc niewielkie odchylenie.Możesz więc użyć:
Muszę przetestować wszystkie przeglądarki, ale to zadziałało w przypadku Chrome.
Czy powinniśmy szukać czegoś bardziej konkretnego niż istnienie
DOMTokenList.prototype.addMany
? Co dokładnie powodujeclassList.add()
niepowodzenie w IE11?źródło
Kolejny polifill dla
element.classList
jest tutaj . Znalazłem to przez MDN .Dołączam ten skrypt i używam
element.classList.add("first","second","third")
go zgodnie z przeznaczeniem.źródło