Hai ragione su Class attributes [were originally] meant for CSS
, ma questo non significa necessariamente che non puoi anche usarli come hook JavaScript. (Ma è necessario prestare attenzione.)
In base alla specifica HTML4 ,
The class attribute has several roles in HTML:
* As a style sheet selector (when an author wishes to assign style information to a set of elements).
* For general purpose processing by user agents.
Questo non dice esplicitamente se class
es debba essere usato come hook JS o meno (si tratta di "elaborazione generica"?).
Nella specifica HTML5 , tutta questa lingua relativa al ruolo di class
es non è qui. Semplicemente afferma che la classe è "un insieme di token separati da spazi che rappresentano le varie classi a cui appartiene l'elemento". Quindi segnala che la classe può essere utilizzata come selettore JS utilizzando getElementsByClassName()
Detto questo ... Capisco la tua esitazione a usare l'attributo class
per il duplice scopo di controllare stile e comportamento. Non è una buona cosa provare a cambiare il modo in cui appare la tua pagina, solo per capire che hai cambiato anche la sua funzionalità.
Per aggirare questo problema, ho visto un paio di soluzioni diverse.
(1) Assegna un nome al tuo hook JavaScript class
es con un prefisso js-. Se lo fai, è chiaro quali classi sono intese come hook JS e quali no.
<input type="text" class="required js-typeahead" name="some-text" />
(2) Usa gli attributi data-*
invece di class
per gli hook JS. Questo ti dà anche l'ulteriore vantaggio di ottenere una coppia chiave-valore per il tuo codice JS.
<input type="text" class="required" data-typeahead="typeahead" name="some-text" />
Ovviamente, puoi utilizzare gli attributi di data-*
per lo stile, quindi non devi necessariamente superare la separazione tra stile e comportamento.
#input[data-typeahead] {
background-image: url("typeahead.png");
background-repeat: no-repeat;
}