3E e 3I SIA: Soluzione esercizio prenotazione con Html, Css, Javascript e LocalStorage




Ecco le due pagine con l'aggiunta di commenti descrittivi di supporto sia nei blocchi HTML e nei fogli di stile interni, sia all'interno dei blocchi di codice JavaScript, così da rendere il funzionamento di ogni singola parte estremamente chiaro e didattico.

Titolo dell'esercizio: Creare un esercizio con Html, Javascript e Local Storage
Inserire un'ipotetica prenotazione di un viaggio e il biglietto deve essere stampato su un'altra pagina con i dati della prenotazione e il costo del biglietto. Utilizzare il modulo form per l'inserimento delle informazioni

 1. `prenotazione.html` (Pagina di inserimento con commenti)

<!DOCTYPE html>

<html lang="it">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Prenotazione Viaggio</title>

    <style>

        /* ========================================== */

        /* STILI CSS INTERNI (Senza foglio esterno)    */

        /* ========================================== */

        body {

            font-family: Arial, sans-serif;

            background-color: #f4f6f9;

            display: flex;

            justify-content: center;

            padding: 30px;

            margin: 0;

        }

        .form-container {

            background: #ffffff;

            padding: 25px;

            border-radius: 8px;

            box-shadow: 0 4px 10px rgba(0,0,0,0.1);

            width: 100%;

            max-width: 450px;

        }

        h2 {

            margin-top: 0;

            color: #1a365d;

            text-align: center;

        }

        .form-group {

            margin-bottom: 15px;

        }

        label {

            display: block;

            margin-bottom: 5px;

            font-weight: bold;

            color: #4a5568;

        }

        input, select {

            width: 100%;

            padding: 10px;

            border: 1px solid #cbd5e0;

            border-radius: 5px;

            box-sizing: border-box;

        }

        button {

            width: 100%;

            padding: 12px;

            background-color: #3182ce;

            color: white;

            border: none;

            border-radius: 5px;

            font-size: 16px;

            font-weight: bold;

            cursor: pointer;

            margin-top: 10px;

        }

        button:hover {

            background-color: #2b6cb0;

        }

    </style>

</head>

<body>

<!-- Contenitore principale del modulo di prenotazione -->

<div class="form-container">

    <h2>Prenota il tuo Viaggio</h2>

    <!-- Form HTML per la raccolta dei dati inseriti dall'utente -->

    <form id="bookingForm">

        <!-- Campo: Nome e Cognome -->

        <div class="form-group">

            <label for="nome">Nome e Cognome:</label>

            <input type="text" id="nome" required>

        </div>

        <!-- Campo: Città di Partenza -->

        <div class="form-group">

            <label for="partenza">Città di Partenza:</label>

            <input type="text" id="partenza" required>

        </div>

        <!-- Campo: Città di Destinazione -->

        <div class="form-group">

            <label for="destinazione">Città di Destinazione:</label>

            <input type="text" id="destinazione" required>

        </div>

        <!-- Campo: Data del Viaggio -->

        <div class="form-group">

            <label for="data">Data del Viaggio:</label>

            <input type="date" id="data" required>

        </div>

        <!-- Campo: Numero Passeggeri -->

        <div class="form-group">

            <label for="passeggeri">Numero Passeggeri:</label>

            <input type="number" id="passeggeri" min="1" max="10" value="1" required>

        </div>

        <!-- Campo: Selezione della Classe di Viaggio -->

        <div class="form-group">

            <label for="classe">Classe di Viaggio:</label>

            <select id="classe">

                <option value="Economica">Economica (€50 / passeggero)</option>

                <option value="Business">Business (€120 / passeggero)</option>

                <option value="Prima Classe">Prima Classe (€200 / passeggero)</option>

            </select>

        </div>

        <!-- Pulsante di invio del modulo -->

        <button type="submit">Genera Biglietto</button>

    </form>

</div>

<script>

    /* ========================================== */

    /* LOGICA JAVASCRIPT PER RACCOLTA E SALVATAGGIO */

    /* ========================================== */

    // Intercetta l'evento di invio (submit) del form

    document.getElementById('bookingForm').addEventListener('submit', function(event) {

        // Blocca il comportamento predefinito del form (evita il ricaricamento della pagina)

        event.preventDefault();

        // 1. Recupero dei valori inseriti nei campi del form

        const nome = document.getElementById('nome').value;

        const partenza = document.getElementById('partenza').value;

        const destinazione = document.getElementById('destinazione').value;

        const data = document.getElementById('data').value;

        const passeggeri = parseInt(document.getElementById('passeggeri').value);

        const classe = document.getElementById('classe').value;

        // 2. Calcolo logico del costo del biglietto in base alla classe scelta

        let prezzoBase = 50; // Prezzo di default per Economica

        if (classe === 'Business') prezzoBase = 120;

        if (classe === 'Prima Classe') prezzoBase = 200;

        const costoTotale = prezzoBase * passeggeri;

        // Generazione di un codice identificativo casuale per il biglietto

        const codice = 'TICKET-' + Math.floor(100000 + Math.random() * 900000);

        // 3. Salvataggio dei dati nel localStorage come singole chiavi di testo (senza oggetti JSON)

        localStorage.setItem('nome', nome);

        localStorage.setItem('partenza', partenza);

        localStorage.setItem('destinazione', destinazione);

        localStorage.setItem('data', data);

        localStorage.setItem('passeggeri', passeggeri);

        localStorage.setItem('classe', classe);

        localStorage.setItem('costo', costoTotale.toFixed(2));

        localStorage.setItem('codice', codice);

        // 4. Reindirizzamento automatico alla seconda pagina del biglietto

        window.location.href = 'biglietto.html';

    });

</script>

</body>

</html>


2. `biglietto.html` (Pagina del biglietto, stampa e commenti)

<!DOCTYPE html>

<html lang="it">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Biglietto di Viaggio</title>

    <style>

        /* ========================================== */

        /* STILI CSS INTERNI E REGOLE DI STAMPA        */

        /* ========================================== */

        body {

            font-family: 'Courier New', Courier, monospace;

            background-color: #e2e8f0;

            display: flex;

            flex-direction: column;

            align-items: center;

            padding: 40px 20px;

            margin: 0;

        }

        .ticket-card {

            background: #ffffff;

            border: 2px dashed #2b6cb0;

            border-radius: 10px;

            padding: 30px;

            width: 100%;

            max-width: 500px;

            box-shadow: 0 4px 12px rgba(0,0,0,0.15);

        }

        .header {

            text-align: center;

            border-bottom: 2px solid #2b6cb0;

            padding-bottom: 10px;

            margin-bottom: 20px;

        }

        .header h1 {

            margin: 0;

            font-size: 22px;

            color: #2b6cb0;

        }

        .row {

            display: flex;

            justify-content: space-between;

            margin-bottom: 12px;

        }

        .label {

            font-weight: bold;

            color: #4a5568;

        }

        .value {

            color: #1a202c;

        }

        .total {

            border-top: 2px solid #2b6cb0;

            padding-top: 15px;

            margin-top: 20px;

            font-size: 18px;

            font-weight: bold;

            text-align: right;

            color: #276749;

        }

        .actions {

            margin-top: 25px;

            display: flex;

            gap: 10px;

        }

        .btn {

            padding: 10px 20px;

            border: none;

            border-radius: 5px;

            font-weight: bold;

            cursor: pointer;

        }

        .btn-print { background-color: #38a169; color: white; }

        .btn-back { background-color: #718096; color: white; text-decoration: none; }

        

        /* Regole CSS specifiche per la stampa: nasconde i pulsanti e rimuove gli sfondi/ombre */

        @media print {

            body { background-color: white; padding: 0; }

            .actions { display: none; }

            .ticket-card { box-shadow: none; width: 100%; border: 1px solid #000; }

        }

    </style>

</head>

<body>

<!-- Scheda grafica del biglietto -->

<div class="ticket-card" id="ticketContent">

    <div class="header">

        <h1>BIGLIETTO DI VIAGGIO</h1>

        <small id="codice"></small>

    </div>

    <!-- Dati dinamici del biglietto che verranno riempiti via JS -->

    <div class="row">

        <span class="label">Passeggero:</span>

        <span class="value" id="nome"></span>

    </div>

    <div class="row">

        <span class="label">Da:</span>

        <span class="value" id="partenza"></span>

    </div>

    <div class="row">

        <span class="label">A:</span>

        <span class="value" id="destinazione"></span>

    </div>

    <div class="row">

        <span class="label">Data Partenza:</span>

        <span class="value" id="data"></span>

    </div>

    <div class="row">

        <span class="label">Passeggeri:</span>

        <span class="value" id="passeggeri"></span>

    </div>

    <div class="row">

        <span class="label">Classe:</span>

        <span class="value" id="classe"></span>

    </div>

    <!-- Costo totale calcolato -->

    <div class="total">

        Costo Totale: €<span id="costo"></span>

    </div>

</div>

<!-- Pulsanti di azione (Stampa e Nuova Prenotazione) -->

<div class="actions">

    <button class="btn btn-print" onclick="window.print()">Stampa Biglietto</button>

    <a href="prenotazione.html" class="btn btn-back">Nuova Prenotazione</a>

</div>

<script>

    /* ========================================== */

    /* RECUPERO DATI DAL LOCALSTORAGE E POPOLAMENTO */

    /* ========================================== */

    // Recupera direttamente le singole chiavi di testo salvate in precedenza

    const codice = localStorage.getItem('codice');

    const nome = localStorage.getItem('nome');

    // Verifica se i dati esistono effettivamente nel localStorage

    if (nome && codice) {

        // Popola i singoli elementi HTML sfruttando l'ID corrispondente

        document.getElementById('codice').textContent = 'Cod. ' + codice;

        document.getElementById('nome').textContent = nome;

        document.getElementById('partenza').textContent = localStorage.getItem('partenza');

        document.getElementById('destinazione').textContent = localStorage.getItem('destinazione');

        document.getElementById('data').textContent = localStorage.getItem('data');

        document.getElementById('passeggeri').textContent = localStorage.getItem('passeggeri');

        document.getElementById('classe').textContent = localStorage.getItem('classe');

        document.getElementById('costo').textContent = localStorage.getItem('costo');

    } else {

        // Messaggio di avviso nel caso in cui si acceda alla pagina senza passare dal form

        document.getElementById('ticketContent').innerHTML = '<p style="text-align:center;">Nessuna prenotazione trovata.</p>';

    }

</script>

</body>

</html>

Commenti

Post popolari in questo blog

Esercizi in Excel e fogli di Google

Simulazioni di reti (con Cisco Packet Tracer)