rinomina esercizi js
This commit is contained in:
93
javascript/10_localStorage/tutorial/index.html
Normal file
93
javascript/10_localStorage/tutorial/index.html
Normal file
@@ -0,0 +1,93 @@
|
||||
<!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>
|
||||
<a href="../index.html" style="position: absolute; top: 20px; left: 20px; text-decoration: none; color: #555; font-weight: bold;">← Dashboard</a>
|
||||
</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>
|
||||
109
javascript/10_localStorage/tutorial/script.js
Normal file
109
javascript/10_localStorage/tutorial/script.js
Normal 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);
|
||||
}
|
||||
118
javascript/10_localStorage/tutorial/styles.css
Normal file
118
javascript/10_localStorage/tutorial/styles.css
Normal file
@@ -0,0 +1,118 @@
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
background-color: #f0f2f5;
|
||||
color: #333;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #1a73e8;
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.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);
|
||||
padding-top: 50px;
|
||||
}
|
||||
|
||||
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;
|
||||
max-width: 800px;
|
||||
margin: 0 auto 25px auto;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
border-left: 6px solid #1a73e8;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
Reference in New Issue
Block a user