Un contatore web in JavaScript puro, con interfaccia costruita interamente via DOM.
π turbor93.github.io/JavaScript_RiccardoB π
- Il progetto
- Anteprima
- FunzionalitΓ
- Requisiti del progetto e come sono stati soddisfatti
- Struttura del repository
- Come funziona
- Eseguire il progetto in locale
- Test
- AccessibilitΓ
- CompatibilitΓ
- Tecnologie
- Autore
- Licenza
Counter Γ¨ una piccola applicazione web che simula il comportamento di un contatore:
si apre su un valore iniziale di 0 e permette di aumentarlo o diminuirlo con due
pulsanti, + e β.
Γ il progetto finale del modulo JavaScript del corso
start2impact. La consegna chiede espressamente che
l'interfaccia non sia scritta a mano nell'HTML, ma generata dinamicamente da
JavaScript tramite manipolazione del DOM: il file index.html contiene
soltanto un contenitore vuoto, tutto il resto nasce da document.createElement.
Oltre ai requisiti minimi, l'applicazione aggiunge alcune funzionalitΓ pensate per renderla davvero utilizzabile: passo personalizzabile, salvataggio automatico, scorciatoie da tastiera, tema chiaro/scuro e uno storico delle ultime operazioni.
| Tema scuro | Tema chiaro |
|---|---|
![]() |
![]() |
| FunzionalitΓ | |
|---|---|
| β | Il contatore parte da 0 all'apertura della pagina |
| β | Pulsante + per incrementare |
| β | Pulsante β per decrementare |
| β | Il valore corrente Γ¨ sempre visibile a schermo |
| β | Interfaccia creata dinamicamente via DOM |
| FunzionalitΓ | Dettaglio | |
|---|---|---|
| π’ | Passo personalizzabile | si sceglie di quanto incrementare o decrementare a ogni click (da 1 a 1000) |
| πΎ | Salvataggio automatico | valore, passo e tema vengono ricordati alla riapertura della pagina, tramite localStorage |
| β¨οΈ | Scorciatoie da tastiera | β / + per aumentare, β / β per diminuire, R per azzerare |
| π | Storico | le ultime 5 operazioni, con la variazione applicata e il valore risultante |
| π | Tema chiaro / scuro | al primo avvio segue la preferenza del sistema operativo, poi ricorda la scelta |
| π¨ | Feedback visivo | il numero Γ¨ verde se positivo, rosso se negativo, con una breve animazione a ogni cambio |
| π§ | Limiti | il valore resta tra β999999 e 999999; al limite il pulsante corrispondente si disabilita |
| βΏοΈ | Accessibile | navigabile da tastiera, etichette ARIA e annuncio del nuovo valore agli screen reader |
| π± | Responsive | layout leggibile da smartphone a desktop |
| π§ͺ | Testata | 20 test automatici sulla logica, eseguibili con Node senza installare nulla |
| Requisito | Come Γ¨ stato rispettato |
|---|---|
| Sviluppo esclusivamente in JavaScript puro | Nessun transpiler, nessun build step: si aprono i file e funzionano |
| Interfaccia creata dinamicamente via DOM | index.html contiene solo <div id="app"></div>; display, pulsanti, campi e storico sono creati in js/ui.js con document.createElement |
| Niente jQuery, React, Angular, Vue o simili | Zero dipendenze: nessun package.json, nessun node_modules, nessuno script da CDN |
| Librerie esterne solo se necessarie | Non ne Γ¨ servita nessuna, nemmeno per le icone: sono SVG scritti a mano |
| FunzionalitΓ aggiuntive a piacere | Vedi la tabella qui sopra |
JavaScript_RiccardoB/
β
βββ index.html # Contenitore vuoto + inclusione degli script
β
βββ css/
β βββ style.css # Stili, temi chiaro/scuro, animazioni, responsive
β
βββ js/
β βββ storage.js # Salvataggio su localStorage (a prova di errore)
β βββ counter.js # Logica del contatore, indipendente dal DOM
β βββ ui.js # Creazione dell'interfaccia e rendering
β βββ app.js # Punto di ingresso: eventi, tastiera, tema, storico
β
βββ tests/
β βββ counter.test.js # Test della logica, eseguibili con Node
β
βββ assets/
β βββ screenshot-dark.png
β βββ screenshot-light.png
β
βββ LICENSE
βββ README.md
Il codice è diviso in quattro file con responsabilità separate, così che ognuno faccia una cosa sola e sia comprensibile da solo.
ββββββββββββββββ crea e aggiorna ββββββββββββββββ
β ui.js βββββββββββββββββββββββ app.js β
β (il DOM) β β(orchestrazione)β
ββββββββββββββββ ββββββββ¬ββββββββ
β chiama i metodi
βΌ
ββββββββββββββββ notifica i cambi ββββββββββββββββ
β storage.js βββββββββββββββββββββββ counter.js β
β(localStorage)β β (la logica) β
ββββββββββββββββ ββββββββββββββββ
counter.js β la logica. Espone una factory createCounter() che restituisce
un contatore con lo stato chiuso in una closure: dall'esterno non Γ¨ modificabile
se non attraverso i metodi increment(), decrement(), reset(), setStep() e
setValue(). Ogni cambiamento viene comunicato ai sottoscrittori registrati con
subscribe(), in stile observer.
Questo modulo non conosce il DOM: Γ¨ la ragione per cui puΓ² essere testato in Node senza un browser, e per cui l'interfaccia potrebbe essere riscritta da zero senza toccarlo.
ui.js β l'interfaccia. Costruisce tutti gli elementi con document.createElement
(tramite un piccolo helper dichiarativo el()) e li inserisce nella pagina. Espone
le funzioni render(), renderHistory() e pulse(), che disegnano lo stato ricevuto
senza sapere nulla di come quello stato sia stato calcolato.
storage.js β la persistenza. Un involucro attorno a localStorage che intercetta
le eccezioni: in navigazione privata o con la quota esaurita l'accesso puΓ² fallire, e
in quel caso l'applicazione continua a funzionare mostrando un avviso, semplicemente
senza ricordare il valore.
app.js β l'orchestrazione. Mette insieme i pezzi, collega gli eventi dei pulsanti
e della tastiera e gestisce tema e storico. Il flusso Γ¨ sempre nella stessa direzione β
interazione β logica β notifica β interfaccia + salvataggio β quindi ciΓ² che si vede
a schermo e ciΓ² che Γ¨ realmente memorizzato non possono andare fuori sincrono.
Non serve installare nulla: non ci sono dipendenze nΓ© passaggi di build.
git clone https://github.com/TurboR93/JavaScript_RiccardoB.git
cd JavaScript_RiccardoB
open index.html # su macOS β altrimenti basta un doppio click sul fileL'applicazione funziona anche aperta direttamente dal filesystem (file://).
Volendo servirla via HTTP, con Python o Node:
python3 -m http.server 8000
# oppure
npx serve .Poi si apre http://localhost:8000.
La logica del contatore Γ¨ coperta da 20 test automatici che verificano il comportamento di base, il passo personalizzato, i limiti, la robustezza sugli input non validi e le notifiche ai sottoscrittori.
node tests/counter.test.js20 test superati, 0 falliti
Non serve installare nΓ© npm nΓ© alcun framework di testing: lo script usa solo Node.
- Ogni controllo Γ¨ raggiungibile e azionabile da tastiera, con contorno di focus sempre visibile.
- Il display usa
role="status"earia-live="polite": gli screen reader annunciano il nuovo valore senza interrompere l'utente. - I pulsanti hanno
aria-labelesplicite ("Aumenta il contatore", "Diminuisci il contatore", β¦), perchΓ© graficamente mostrano solo un simbolo. - Il colore non Γ¨ mai l'unica informazione: il valore e lo storico restano leggibili anche senza distinguere verde e rosso.
- La regola
prefers-reduced-motiondisattiva le animazioni per chi ha impostato quella preferenza di sistema. - Un messaggio in
<noscript>spiega la situazione se JavaScript Γ¨ disattivato.
Testata su browser desktop e mobile aggiornati (Chrome, Safari, Firefox, Edge). Richiede JavaScript attivo, dato che l'intera interfaccia viene generata a runtime.
- HTML5 β un unico contenitore, tutto il resto Γ¨ generato
- CSS3 β variabili custom, Flexbox, Grid,
color-mix(), animazioni, media query - JavaScript (ES5+) β DOM API, closure, pattern observer,
localStorage - Nessuna libreria esterna, nessun framework, nessun build step
Riccardo Brunello
Distribuito con licenza MIT β vedi il file LICENSE.
βοΈ Se il progetto ti Γ¨ stato utile, lascia una stella!

