renamed js folder

This commit is contained in:
2026-02-05 01:30:42 +01:00
parent 97e36b8e29
commit 3d84295870
113 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f0f2f5;
color: #333;
max-width: 900px;
margin: 0 auto;
}
h1 {
text-align: center;
color: #1a73e8;
}
.controls {
text-align: center;
margin-bottom: 30px;
position: sticky;
top: 0px;
z-index: 100;
background-color: white;
box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
}
button {
padding: 12px 24px;
font-size: 16px;
cursor: pointer;
background-color: #1a73e8;
color: white;
border: none;
border-radius: 10px;
margin: 5px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
transition: transform 0.1s;
}
button:hover {
transform: scale(1.05);
}
button:active {
transform: scale(0.95);
}
button#btn-reset {
background-color: #ea4335;
}
.step-card {
background: white;
border-radius: 12px;
padding: 20px;
margin-bottom: 25px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-left: 6px solid #1a73e8;
margin: 20px;
}
.step-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.step-title {
font-weight: bold;
font-size: 1.2em;
color: #1557b0;
}
.step-desc {
font-size: 0.95em;
color: #5f6368;
margin-bottom: 15px;
line-height: 1.5;
}
.output-box {
background: #2d3436;
color: #00c900;
padding: 10px;
font-family: 'Courier New', monospace;
border-radius: 6px;
min-height: 20px;
white-space: pre-wrap;
overflow-x: auto;
position: relative;
}
.output-box.loading::after {
content: "⏳ Attesa server...";
position: absolute;
top: 5px;
right: 5px;
font-size: 0.8em;
color: #e5c07b;
}
.output-box.error {
border: 2px solid #e06c75;
color: #e06c75;
}
.output-box.success {
border-left: 4px solid #98c379;
}
.label {
font-size: 0.8em;
color: #bbbbbb;
margin-bottom: 5px;
display: block;
font-weight: bold;
letter-spacing: 0.5px;
}

View File

@@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSON e LocalStorage</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="controls">
<h1>Tutorial: JSON e LocalStorage</h1>
<button id="btn-esegui">▶️ Esegui Codice</button>
<button id="btn-reset">🧹 Pulisci Tutto</button>
</div>
<script>
function mostraOutput(stepNumero, messaggio) {
const elemento = document.getElementById(`output-${stepNumero}`);
if (elemento) {
messaggio = messaggio || "❌";
let isObject = (typeof messaggio === 'object' && messaggio !== null);
elemento.textContent = isObject ? JSON.stringify(messaggio, null, 2) : String(messaggio);
elemento.classList.remove("loading");
elemento.style.transition = "";
elemento.style.backgroundColor = "#666";
setTimeout(() => {
elemento.style.transition = "background-color 1s ease";
elemento.style.backgroundColor = "#2d3436";
}, 0);
}
}
[
{
title: "1. Serializzazione (Oggetto -> Stringa)",
description: "Convertiamo un oggetto JS in una stringa JSON per poterla salvare.",
outputLabel: "Risultato in pagina:"
},
{
title: "2. Deserializzazione (Stringa -> Oggetto)",
description: "Trasformiamo una stringa JSON ricevuta in un oggetto utilizzabile.",
outputLabel: "Proprietà 'utente' estratta:"
},
{
title: "3. Scrittura nel LocalStorage",
description: "Salviamo le preferenze utente nel browser.",
outputLabel: "Verifica lettura immediata:"
},
{
title: "4. Lettura dal LocalStorage",
description: "Recuperiamo e utilizziamo un dato salvato in precedenza.",
outputLabel: "Tema recuperato:"
},
{
title: "5. Gestione Array",
description: "Aggiungiamo un film alla lista e salviamo tutto.",
outputLabel: "Contenuto salvato nel Storage:"
},
{
title: "6. Pattern \"Carica o Inizializza\"",
description: "Gestiamo il caso in cui i dati non esistano ancora (evitiamo errori).",
outputLabel: "Valore della lista sicura:"
}
].forEach((step, i) => {
document.write(`
<div class="step-card">
<div class="step-header">
<div class="step-title">${step.title}</div>
</div>
<div class="step-desc">${step.description}</div>
<span class="label">${step.outputLabel}</span>
<div id="output-${i + 1}" class="output-box"></div>
</div>
`);
});
</script>
<script src="tutorial_interattivo.js"></script>
<script>
document.getElementById('btn-reset').addEventListener('click', () => {
localStorage.clear();
location.reload();
});
document.getElementById('btn-esegui').addEventListener('click', () => {
const el = document.querySelectorAll('[id^="output-"]');
el.forEach(box => box.className = "output-box loading");
eseguiTutorial();
});
</script>
</body>
</html>

View File

@@ -0,0 +1,109 @@
// TUTORIAL INTERATTIVO: JSON e LocalStorage
// Funzione pricipale del tutorial
function eseguiTutorial() {
/**
* ===========================================
* === 1. Convertire Oggetti in Stringhe (Serializzazione) ===
* Il LocalStorage può salvare SOLO stringhe.
* Per salvare un oggetto o un array, dobbiamo convertirlo usando JSON.stringify().
*/
const studente = {
nome: "Alessandro",
corso: "JavaScript",
voto: 8
};
// TODO: Converti l'oggetto 'studente' in una stringa JSON e salvala nella variabile 'studenteStringa'.
let studenteStringa = "";
// Visualizzazione Risultato
mostraOutput(1, studenteStringa);
/**
* ===========================================
* === 2. Convertire Stringhe in Oggetti (Deserializzazione) ===
* Quando leggiamo dal LocalStorage, otteniamo una stringa.
* Per riutilizzarla come codice JS, dobbiamo convertirla indietro usando JSON.parse().
*/
const datiRicevuti = '{"id": 101, "utente": "Alessandro", "attivo": true}';
// TODO: Converti la stringa 'datiRicevuti' in un vero oggetto JavaScript e salvalo in 'oggettoDati'.
// Nota: Inizializziamo a {} vuoto per evitare errori se non completi il TODO
let oggettoDati = {};
// Visualizzazione Risultato (mostriamo solo la proprietà 'utente')
mostraOutput(2, oggettoDati.utente);
/**
* ===========================================
* === 3. Salvare nel LocalStorage ===
* Usiamo localStorage.setItem('chiave', 'valore') per salvare i dati.
* Ricorda: il valore deve essere una stringa!
*/
const preferenze = {
tema: "scuro",
notifiche: true
};
// TODO: Salva l'oggetto 'preferenze' (convertito in stringa!) nel localStorage con la chiave "impostazioni_utente".
// SUGGERIMENTO: Usa JSON.stringify(preferenze) dentro il setItem.
// Visualizzazione Risultato (Leggiamo direttamente dallo storage per verificare)
const verificaStorage = localStorage.getItem("impostazioni_utente");
mostraOutput(3, verificaStorage ? "Salvato con successo: " + verificaStorage : "");
/**
* ===========================================
* === 4. Leggere dal LocalStorage ===
* Usiamo localStorage.getItem('chiave') per recuperare i dati.
*/
// TODO: Recupera la stringa salvata alla chiave "impostazioni_utente", convertila in oggetto e assegna il tema a 'temaSalvato'.
let temaSalvato = "";
// Visualizzazione Risultato
mostraOutput(4, temaSalvato);
/**
* ===========================================
* === 5. Gestire gli Array (Liste) ===
* Spesso salviamo liste di cose (es. dipendenti, libri).
* Il processo è identico: Array -> JSON.stringify -> Storage.
*/
const nuoviFilm = [
{ titolo: "Inception", anno: 2010 },
{ titolo: "Matrix", anno: 1999 }
];
// TODO: 1. Aggiungi un nuovo film all'array 'nuoviFilm' usando .push() (es. { titolo: "Interstellar", anno: 2014 }).
// TODO: 2. Salva l'intero array aggiornato nel localStorage con chiave "lista_film" (ricorda JSON.stringify).
// Visualizzazione Risultato
mostraOutput(5, localStorage.getItem("lista_film"));
/**
* ===========================================
* === 6. Il Pattern "Carica o Inizializza" ===
* Quando l'app parte, dobbiamo caricare i dati.
* Ma se è la prima volta che l'utente entra, il localStorage sarà null.
*/
// Immagina di provare a caricare una chiave che non esiste:
const chiaveInesistente = localStorage.getItem("chiave_mai_usata");
// TODO: Completa la riga sotto per assegnare a 'listaSicura' il valore parsato di 'chiaveInesistente',
// OPPURE un array vuoto [] se il dato è null.
let listaSicura = null;
// Visualizzazione Risultato
mostraOutput(6, listaSicura);
}

View File

@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>La Mia Watchlist</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>🎬 Film da Vedere</h1>
<div class="input-group">
<input type="text" id="titolo" placeholder="Titolo film">
<input type="number" id="anno" placeholder="Anno" style="max-width: 80px;">
<button id="btn-add">Aggiungi</button>
</div>
<ul id="lista-film">
<!-- I film verranno aggiunti qui dinamicamente -->
</ul>
<script src="script.js"></script>
</body>
</html>

View File

@@ -0,0 +1,109 @@
/**
* Esercizio: Watchlist Film
*
* CONTESTO:
* Abbiamo un HTML con due input (titolo, anno) e una lista vuota.
* Vogliamo salvare la lista dei film da vedere nel browser.
*
* STRUTTURA DATI:
* Array di oggetti: [{ titolo: "Dune", anno: "2021" }, ...]
*
* ISTRUZIONI:
* 1. Completa 'caricaFilm' per leggere dal localStorage (o inizializzare array vuoto).
* 2. Completa 'aggiungiFilm' per aggiornare l'array, salvarlo e aggiornare la UI.
* 3. Usa JSON.parse e JSON.stringify.
*/
// RIFERIMENTI DOM
const inputTitolo = document.querySelector('#titolo');
const inputAnno = document.querySelector('#anno');
const listaFilm = document.querySelector('#lista-film');
const btnAdd = document.querySelector('#btn-add');
// STATO DELL'APP
let filmWatchlist = [];
/**
* STEP 1: Funzione Renderizza (visualizza) la lista
* Pulisce l'HTML e ricrea gli elementi basandosi sull'array filmWatchlist
* 1. Pulisci il contenuto di 'listaFilm'.
* 2. Per ogni film in 'filmWatchlist', crea un <li> con dentro --> <p>titolo (anno)</p>
* 3. Aggiungi l'<li> a 'listaFilm'.
*/
function visualizzaLista() {
// TODO: Scrivi qui il codice per visualizzare la lista...
}
/**
* STEP 2: Caricamento Iniziale
* Leggi la chiave "my_watchlist" dal localStorage.
* Se esiste, parsa la stringa e riempi l'array 'filmWatchlist'.
* Se non esiste, lascia l'array vuoto.
* Infine chiama visualizzaLista().
*/
function inizializzaApp() {
// TODO: Scrivi qui il codice per caricare i dati...
}
/**
* STEP 3: Aggiunta e Salvataggio
* Quando l'utente clicca "Aggiungi Film":
* 1. Cattura i valori dagli input.
* 2. Crea un oggetto film solo se entrambi i campi hanno un valore.
* 3. Crea un oggetto con i dati degli input.
* 4. Pushalo nell'array filmWatchlist.
* 5. Salva l'intero array aggiornato nel localStorage (JSON.stringify!).
* 6. Chiama visualizzaLista().
*/
// TODO: Scrivi qui il codice per aggiungere un film...
// AVVIO
inizializzaApp();
/************************************************************************/
/************************* ESERCIZI EXTRA *******************************/
/************************************************************************/
/**
* Esercizio Extra 1: Rimuovere Elementi
*
* OBIETTIVO:
* Aggiungere un bottone "Elimina" accanto a ogni film che rimuova il film
* dall'array E aggiorni il localStorage.
*
* Questo esercizio RICHIEDE di modificare la funzione 'visualizzaLista'.
*
* Possibile Implementazione:
* 1. Usare un ciclo for con la variabile indice (let i = 0; i < ...; i++).
* 2. Dentro il ciclo crea un bottone con testo "Elimina" o "X" (mettere anche la classe corretta già presente in CSS).
* 3. Aggiungi un eventListener al bottone che:
* - Usa l'indice 'i' per fare filmWatchlist.splice(i, 1) e rimuovere l'elemento.
* - Salva l'array aggiornato nel localStorage.
* 4. Richiamare visualizzaLista().
* Nota: Ricorda che ogni volta che visualizzi la lista, stai ricreando TUTTI gli elementi HTML,
* quindi i vecchi listener vengono persi. Devi rimetterli ogni volta.
*/
/**
* Esercizio Extra 2: Stato "Visto/Non Visto"
*
* OBIETTIVO:
* Aggiungi una checkbox accanto a ogni film.
* Se l'utente la spunta, lo stato "visto" del film (true/false) deve essere salvato.
*
* LOGICA:
* 1. Modifica l'oggetto iniziale del film aggiungendo la proprietà --> visto: false.
* 2. Nella render, per ogni elemento <li>, crea un <input type="checkbox">.
* 3. Imposta checkbox.checked = film.visto.
* 4. All'evento 'change' della checkbox:
* - Aggiorna filmWatchlist[index].visto = checkbox.checked
* - Salva tutto nel localStorage.
* - (Opzionale) Aggiungi una classe CSS per barrare il testo se visto --> text-decoration: line-through.
* Nota: devi aggiornare la classe del <p> dentro l'li in base a film.visto.
*/

View File

@@ -0,0 +1,54 @@
body {
font-family: sans-serif;
max-width: 600px;
margin: 2rem auto;
padding: 1rem;
}
.input-group {
background: #eee;
padding: 1rem;
border-radius: 8px;
display: flex;
gap: 10px;
}
input {
padding: 8px;
flex: 1;
}
input[type="checkbox"] {
transform: scale(1.5);
}
button {
padding: 8px 16px;
cursor: pointer;
background: #28a745;
color: white;
border: none;
border-radius: 4px;
}
ul {
list-style: none;
padding: 0;
margin-top: 2rem;
}
li {
background: white;
border: 1px solid #ddd;
padding: 10px;
margin-bottom: 5px;
display: flex;
justify-content: space-between;
align-items: center;
}
.delete-btn {
background: #dc3545;
margin-left: 10px;
font-size: 0.8rem;
}