Nowoczesne techniki HTML5 do zmiany klas
Nowoczesne przeglądarki dodały classList, który zapewnia metody ułatwiające manipulowanie klasami bez potrzeby posiadania biblioteki:
document.getElementById("MyElement").classList.add('MyClass');
document.getElementById("MyElement").classList.remove('MyClass');
if ( document.getElementById("MyElement").classList.contains('MyClass') )
document.getElementById("MyElement").classList.toggle('MyClass');
Niestety, nie działają one w Internet Explorerze przed wersją 10, choć istnieje pewna zaleta, aby dodać obsługę dla IE8 i IE9, dostępnych z tej strony . Jest jednak coraz bardziej wspierany .
Proste rozwiązanie dla różnych przeglądarek
Wykorzystuje się standardowy sposób wybierania elementu w JavaScript document.getElementById("Id")
, co wykorzystują poniższe przykłady - możesz oczywiście uzyskać elementy na inne sposoby, a we właściwej sytuacji możesz po prostu użyć this
- jednak szczegółowe omówienie tego jest poza zakresem odpowiedzi.
Aby zmienić wszystkie klasy dla elementu:
Aby zastąpić wszystkie istniejące klasy jedną lub większą liczbą nowych klas, ustaw atrybut className:
document.getElementById("MyElement").className = "MyClass";
(Możesz użyć listy rozdzielanej spacjami, aby zastosować wiele klas.)
Aby dodać dodatkową klasę do elementu:
Aby dodać klasę do elementu, nie usuwając / nie wpływając na istniejące wartości, dodaj spację i nową nazwę klasy, tak jak poniżej:
document.getElementById("MyElement").className += " MyClass";
Aby usunąć klasę z elementu:
Aby usunąć pojedynczą klasę do elementu, bez wpływu na inne potencjalne klasy, wymagana jest prosta zamiana wyrażenia regularnego:
document.getElementById("MyElement").className =
document.getElementById("MyElement").className.replace
( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */
Wyjaśnienie tego wyrażenia regularnego jest następujące:
(?:^|\s) # Match the start of the string, or any single whitespace character
MyClass # The literal text for the classname to remove
(?!\S) # Negative lookahead to verify the above is the whole classname
# Ensures there is no non-space character following
# (i.e. must be end of string or a space)
g
Flag opowiada zastąpić powtarzać w miarę potrzeby, w przypadku, gdy nazwa klasy zostało dodanych wiele razy.
Aby sprawdzić, czy klasa jest już zastosowana do elementu:
Ten sam regex użyty powyżej do usunięcia klasy może być również użyty jako sprawdzenie, czy istnieje konkretna klasa:
if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )
Przypisywanie tych akcji do zdarzeń onclick:
Chociaż możliwe jest pisanie JavaScript bezpośrednio w atrybutach zdarzeń HTML (takich jak onclick="this.className+=' MyClass'"
), nie jest to zalecane zachowanie. Zwłaszcza w większych aplikacjach, łatwiejszy do utrzymania kod jest osiągnięty przez oddzielenie znaczników HTML od logiki interakcji JavaScript.
Pierwszym krokiem do osiągnięcia tego jest utworzenie funkcji i wywołanie funkcji w atrybucie onclick, na przykład:
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
</script>
...
<button onclick="changeClass()">My Button</button>
(Nie jest wymagane umieszczanie tego kodu w znacznikach skryptu, służy to jedynie zwięzłości przykładu, a włączenie JavaScript w osobnym pliku może być bardziej odpowiednie).
Drugim krokiem jest przeniesienie zdarzenia onclick z HTML i do JavaScript, na przykład za pomocą addEventListener
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
window.onload = function(){
document.getElementById("MyElement").addEventListener( 'click', changeClass);
}
</script>
...
<button id="MyElement">My Button</button>
(Zauważ, że część window.onload jest wymagana, aby zawartość tej funkcji była wykonywana po zakończeniu ładowania HTML - bez tego MyElement może nie istnieć po wywołaniu kodu JavaScript, więc linia się nie powiedzie.)
Frameworky i biblioteki JavaScript
Powyższy kod jest w standardzie JavaScript, jednak powszechną praktyką jest użycie frameworka lub biblioteki w celu uproszczenia typowych zadań, a także skorzystanie ze naprawionych błędów i przypadków brzegowych, o których możesz nie pomyśleć podczas pisania kodu.
Chociaż niektórzy uważają, że przesadą jest dodanie frameworka o wielkości ~ 50 KB do zwykłej zmiany klasy, jeśli wykonujesz znaczną ilość pracy JavaScript lub coś, co może mieć nietypowe zachowanie w różnych przeglądarkach, warto to rozważyć.
(Z grubsza, biblioteka jest zestawem narzędzi zaprojektowanych do określonego zadania, podczas gdy framework zazwyczaj zawiera wiele bibliotek i wykonuje pełny zestaw obowiązków.)
Powyższe przykłady zostały odtworzone poniżej przy użyciu jQuery , prawdopodobnie najczęściej używanej biblioteki JavaScript (choć są też inne, które warto zbadać).
(Uwaga: $
tutaj jest obiekt jQuery).
Zmiana klas za pomocą jQuery:
$('#MyElement').addClass('MyClass');
$('#MyElement').removeClass('MyClass');
if ( $('#MyElement').hasClass('MyClass') )
Ponadto jQuery zapewnia skrót do dodawania klasy, jeśli nie ma zastosowania, lub usuwania klasy, która:
$('#MyElement').toggleClass('MyClass');
Przypisywanie funkcji do zdarzenia click za pomocą jQuery:
$('#MyElement').click(changeClass);
lub bez potrzeby posiadania identyfikatora:
$(':button:contains(My Button)').click(changeClass);