A következő címkéjű bejegyzések mutatása: javascript. Összes bejegyzés megjelenítése
A következő címkéjű bejegyzések mutatása: javascript. Összes bejegyzés megjelenítése

2024. november 5., kedd

12 B - TODO készítése javascripttel

Aki elkészült az Állateledeles projekt javításával is, és a Iskolai átlagszámító feladattal is, gyakorolja a javascriptet, mert felelés lesz belőle. A feladatot CSS GRID-el oldjátok meg, abból is fogok kérdezni, ha tanári gépnél.

 Készíts javascripttel egy kis alkalmazást, egy jegyzettömböt. 






2024. október 14., hétfő

12 B web - Vacsora foglalási rendszer

 Ebben a feladatban egy egyszerű HTML és JavaScript alapú vacsora foglalási rendszert kell létrehoznod, ahol a felhasználó megadhatja a nevét, kiválaszthat egy éttermet, valamint dönthet különböző szolgáltatások mellett, mint például vacsora típus és extra szolgáltatások. A végén a rendszer kiszámítja a teljes költséget és megjeleníti a foglalás részleteit.

Teendők:

  1. Név beírása: A felhasználó egy szövegmezőben megadja a nevét.
  2. Étterem kiválasztása: A felhasználó kiválaszthatja, hogy melyik étteremben szeretne vacsorázni. Az étteremhez tartozó költség az opciókban jelenik meg.
  3. Vacsora típusának kiválasztása: A felhasználó választhat a standard vacsora (nincs extra költség) és a gourmet vacsora között, amelyhez egy extra költség társul.
  4. Extra szolgáltatások választása: A felhasználó választhatja, hogy kér-e parkolási lehetőséget és italcsomagot. Mindkettő extra költséget jelent.
  5. Végösszeg kiszámítása: A felhasználó megnyomja a „Számold ki a végösszeget” gombot, amely kiszámítja az összes kiválasztott szolgáltatás árát és megjeleníti a végösszeget.
  6. Foglalási adatok megjelenítése: A rendszer kiírja a felhasználó nevét és a foglalás teljes költségét.

Elvárások:

  • Az űrlap beviteli mezői a következő elemeket tartalmazzák:
    • Egy szövegmező a név megadására.
    • Egy legördülő lista, amely három különböző éttermet tartalmaz az étterem árával.
    • Rádiógombok, amelyekkel a felhasználó kiválaszthatja a vacsora típusát (standard vagy gourmet).
    • Két checkbox, amivel extra szolgáltatásokat választhat (parkoló és italcsomag).
  • A gomb megnyomásakor történjen a végösszeg kiszámítása, és a foglalás részleteinek megjelenítése.
  • Ellenőrizze a rendszer, hogy a név mező kitöltött-e, és csak akkor végezze el a számítást, ha van név megadva.
  • JavaScript-et használj a végösszeg számításához és az adatok megjelenítéséhez!

Példák:

  • Ha a felhasználó az „Olasz Éttermet” választja (5000 Ft), gourmet vacsorát (3000 Ft), parkolót (1000 Ft) és italcsomagot (1500 Ft), a teljes költség 10 500 Ft lesz.
  • Ha nem választ extra szolgáltatásokat és a standard vacsorát kéri, akkor csak az étterem árát kell figyelembe venni.

Bónusz feladat:

  • Tedd dinamikussá a rendszert úgy, hogy az extra szolgáltatások és vacsora típusok is különböző áron jelenjenek meg a felhasználó választása alapján.


2024. október 9., szerda

13. B 14. A REST API alkalmazás fő követelményei

Az eddigiekben számos megoldással ismerkedtünk, hogyan hajthatunk végre különféle műveleteket. A záródolgozat kimeneti követelménye, hogy az alkalmazásnak meg kell felelnie a RESTful API követelményeinek. A következőkben megnézzük, hogy melyek ezek a követelmények, melyet később a gyakorlatba is átültetünk.

1. Kliens-szerver architektúra

A REST API egyértelműen elválasztja a klienst (például egy böngésző, mobilalkalmazás vagy más API-felhasználó) és a szervert. A szerver nem tárol kliens oldali állapotokat (stateless), csak válaszokat küld a kliens által küldött kérésekre. Ez a felépítés biztosítja a feladatok tiszta szétválasztását.

2. Stateless (Állapotmentesség)

A RESTful API-k stateless-ek, ami azt jelenti, hogy minden egyes kérésnek teljesnek kell lennie önmagában. A szerver nem tárolhat kliens oldali adatokat egyik kéréstől a másikig. Minden kérésnek tartalmaznia kell minden szükséges információt (pl. hitelesítési adatok, kliens állapot), hogy a szerver megfelelően válaszolhasson.

3. HTTP protokoll használata

A REST API-k az HTTP-t használják, és kihasználják az HTTP-szabvány által biztosított metódusokat, például:

  • GET: Adatok lekérdezésére használjuk.
  • POST: Új erőforrás létrehozására.
  • PUT: Meglévő erőforrás frissítésére vagy felülírására.
  • PATCH: Egy meglévő erőforrás részleges frissítésére.
  • DELETE: Erőforrás törlésére.
  • OPTIONS: Lekérdezés a szerver által támogatott műveletekről.

4. Erőforrás-alapú URL struktúra

A RESTful API-kban minden erőforráshoz egy egyedi URL társul. Az URL-eket úgy kell megtervezni, hogy könnyen érthetők és logikailag szervezettek legyenek. Például:

  • GET /contacts: Az összes névjegy lekérdezése.
  • GET /contacts/1: Az 1-es azonosítójú névjegy lekérdezése.
  • POST /contacts: Új névjegy létrehozása.
  • PUT /contacts/1: Az 1-es névjegy frissítése.
  • DELETE /contacts/1: Az 1-es névjegy törlése.

Az URL-eknek az erőforrásokra kell utalniuk (pl. contacts, users, orders), és azonosítókkal lehet konkrét erőforrásokra hivatkozni.

5. Állapotkódok használata

A RESTful API-k használják a HTTP válaszokban megadott állapotkódokat annak jelzésére, hogy egy kérés sikeres volt-e, vagy hibába ütközött. Példák:

  • 200 OK: Sikeres kérés.
  • 201 Created: Erőforrás sikeresen létrehozva (pl. új felhasználó hozzáadása).
  • 400 Bad Request: Rosszul formázott kérés.
  • 401 Unauthorized: Jogosultság hiánya a kéréshez.
  • 403 Forbidden: Tiltott hozzáférés.
  • 404 Not Found: Erőforrás nem található.
  • 500 Internal Server Error: Szerveroldali hiba.

6. HATEOAS (Hypermedia as the Engine of Application State)

A RESTful API ideális esetben követi a HATEOAS elvet, ami azt jelenti, hogy a válaszok tartalmaznak további hivatkozásokat más releváns erőforrásokra. Például egy felhasználó lekérdezésére adott válasz tartalmazhat hivatkozásokat a felhasználó névjegyeire vagy rendeléseire:

{
    "id": 1,
    "name": "John Doe",
    "links": [
        { "rel": "self", "href": "/users/1" },
        { "rel": "contacts", "href": "/users/1/contacts" }
    ]
}

7. JSON használata (vagy más formátum)

A RESTful API-k általában JSON formátumban adnak vissza adatokat, mivel ez egy könnyen olvasható és platformfüggetlen formátum. Azonban XML, YAML vagy más formátumok is használhatók, attól függően, hogy mi szükséges az alkalmazás szempontjából. A válaszok JSON formátuma például:

{
    "id": 1,
    "name": "John Doe",
    "email": "john.doe@example.com"
}

8. Biztonság (HTTPS, Hitelesítés)

A RESTful API-k védelméhez HTTPS használata szükséges az adatok titkosítása érdekében. Az API-k hozzáféréséhez szükség lehet hitelesítésre, amelyet különféle módszerekkel lehet megvalósítani, például:

  • OAuth: Token-alapú hitelesítés.
  • API kulcsok: Minden kérésnél egy kulcs átadása, amely hitelesíti a klienst.
  • JWT (JSON Web Token): Kriptografikusan aláírt token, amely tartalmazza a felhasználó adatait.

9. Cache-elhetőség

A RESTful API-kban a válaszok cache-elhetők, ha az erőforrások nem változnak gyakran. A megfelelő HTTP cache fejlécek használata biztosítja, hogy a kliens (pl. böngésző) helyi gyorsítótárából használhatja az adatokat, ami javítja a teljesítményt és csökkenti a szerver terhelését. Például a Cache-Control fejléc:

Cache-Control: max-age=3600

10. Verziózás

Az API-k folyamatos fejlesztése miatt fontos az API-k verziózása, hogy az új fejlesztések ne törjék meg a régi implementációkat. Ez többféleképpen valósítható meg, például az URL-ben:

/v1/contacts
/v2/contacts

11. Idempotencia

A RESTful API-kban az idempotens műveletek olyan műveletek, amelyek többszöri végrehajtása ugyanazt az eredményt adja. Például a GET és DELETE műveletek idempotensek, mert bármennyiszer hajtjuk végre őket, ugyanaz lesz az eredmény.

Összegzés

Egy REST API-nak tehát a következő elveket kell követnie:

  1. Kliens-szerver architektúra.
  2. Állapotmentesség (stateless).
  3. HTTP metódusok használata (GET, POST, PUT, DELETE, stb.).
  4. Erőforrás-alapú URL-ek.
  5. Megfelelő állapotkódok használata.
  6. HATEOAS támogatás (opcionális, de ajánlott).
  7. JSON vagy más formátumú válaszok.
  8. Biztonság és hitelesítés (HTTPS, OAuth, API kulcsok stb.).
  9. Cache-elhetőség a megfelelő HTTP fejlécekkel.
  10. Verziózás.
  11. Idempotencia a megfelelő műveleteknél.

Ha egy alkalmazás megfelel ezeknek a követelményeknek, akkor REST API-nak tekinthető.

2024. október 7., hétfő

12 B - Űrlapfeldolgozás -> email cím ellenőrzése javascripttel

Űrlap létrehozásakor, amikor e-mail címet kérünk be érdemes az <input type="email"> elem-et használni, hiszen ez is végez némi alapvető ellenőrzést a böngészőben, amikor az űrlapot elküldjük. Az alapvető ellenőrzés alatt azt értem, hogy azt vizsgálja, az email cím tartalmazza-e a @ karaktert, és utána van-e valamilyen domain név. Nem ellenőrzi azonban a domain végződés hosszát (mint pl. a .com vagy .org), sem a felhasználónév bonyolultságát. Tehát az olyan egyszerű címeket is elfogadhatja, mint például user@domain (bár a valóságban ez egy érvénytelen email cím lenne).

Ha az űrlapot próbálják elküldeni érvénytelen email cím formátummal, a böngésző automatikusan egy figyelmeztetést jelenít meg, általában egy felugró üzenet formájában (pl. "Kérjük, adjon meg egy érvényes email címet"). Ez a figyelmeztetés a böngésző nyelvének megfelelően jelenik meg, tehát automatikusan lokalizált üzeneteket kapunk.

Az olyan HTML5 attribútumok, mint a required, szintén működnek az email mezőknél. Ha hozzáadod ezt az attribútumot, akkor a böngésző nem engedi az űrlap beküldését, ha az email mező üres vagy nem megfelelő formátumú.

Az olyan attribútumok, mint a pattern és a maxlength, további ellenőrzéseket tesznek lehetővé, ha a beépített validáció nem elegendő.

Az <input type="email"> használata különösen hasznos mobil eszközökön, mivel sok mobilböngésző automatikusan egy olyan virtuális billentyűzetet jelenít meg, amely tartalmazza a @ és a pont karaktert, hogy megkönnyítse az email cím bevitelét.

Mit nem ellenőriz a böngésző:

  • A böngésző nem ellenőrzi, hogy az email cím ténylegesen létezik-e, vagy hogy az adott domain valódi email szolgáltatást biztosít-e.
  • A szabványos email címek egyéb speciális karaktereit sem feltétlenül ellenőrzi szigorúan, tehát például olyan címek, mint "user+test@domain.com", érvényesnek tekinthetők.

Miért hasznos a JavaScriptes ellenőrzés?

Bár a böngésző alapvető ellenőrzést végez, a JavaScriptes validációval pontosabb és testreszabottabb ellenőrzéseket végezhetsz, például:

  • Korlátozhatod az email címeket bizonyos domainre (pl. csak .com végződések engedélyezése).
  • Testreszabhatod a hibaüzeneteket, hogy jobban illeszkedjenek az oldal stílusához.
  • Bonyolultabb mintákat is alkalmazhatsz, ha szükséges (pl. olyan speciális email címek, amelyeket a böngésző nem kezel jól).
Az <input type="email"> használata praktikus, mert alapvető validációt nyújt a böngésző szintjén, de ha összetettebb szabályokat szeretnél alkalmazni, akkor érdemes JavaScript alapú validációt is hozzáadni a pontosabb ellenőrzés érdekében, mint amit itt a példában láthatsz:

A let emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/; sor egy reguláris kifejezés (regex), amelyet arra használunk, hogy egy email cím formátumát ellenőrizzük. Lássuk részletesen, mit jelent ez a kifejezés:

    1. ^: A kifejezés elején lévő ^ karakter azt jelenti, hogy a minta az adott sor elejéről kezdődik (tehát nem lehet más karakter az elején).

    2. [a-zA-Z0-9._-]+:

      • [a-zA-Z0-9._-]: Ez egy karakterkészlet, amely azt jelzi, hogy az email cím első része (a @ előtti rész) tartalmazhat kis- és nagybetűket (a-z és A-Z), számokat (0-9), valamint a pontot (.), aláhúzást (_), és kötőjelet (-).
      • +: A plusz jel azt jelenti, hogy az előző karakterkészletből legalább egy, de akár több karakter is szerepelhet, tehát az email címnek mindenképpen tartalmaznia kell legalább egy ilyen karaktert.
    3. @: Ez a karakter az email cím kötelező része, amely elválasztja a felhasználónevét és a domain nevet (pl. user@example.com).

    4. [a-zA-Z0-9.-]+:

      • [a-zA-Z0-9.-]: A domain név része a @ utáni rész. Tartalmazhat kis- és nagybetűket, számokat, pontot (.) és kötőjelet (-).
      • +: Ismét azt jelzi, hogy legalább egy karakternek szerepelnie kell a megadott karakterekből (a domain név részben).
    5. \.: A \. egy speciális karaktert jelöl, itt konkrétan a pontot (.), mivel a reguláris kifejezésben a pont önmagában bármely karaktert jelölne. A \ jel használatával szó szerint a pontot keressük.

    6. [a-zA-Z]{2,6}:

      • [a-zA-Z]: A domain végződése csak betűket tartalmazhat (kis- és nagybetűk is elfogadhatók).
      • {2,6}: Ez azt jelenti, hogy a betűk száma minimum 2, maximum 6 lehet, vagyis olyan végződéseket keresünk, mint .com, .hu, .net, .info, stb.
    7. $: A dollárjel azt jelzi, hogy a minta a sor végére ér (nincs más karakter a végén).

    Összefoglalva:

    Ez a reguláris kifejezés egy email címet keres, amely megfelel a következő mintának:

    • Tartalmaz kis- és nagybetűket, számokat, pontot, aláhúzást vagy kötőjelet a @ előtti részben.
    • A @ után következik egy domain név, amely kis- és nagybetűket, számokat, pontot és kötőjelet tartalmazhat.
    • A domain név egy pont után egy 2-6 karakter hosszú végződéssel (például .com vagy .hu) zárul.
    Az így ellenőrzött email-t test() metódussal ellenőrizhetjük.
    pl. : regex.test(string)
  • regex: Ez a reguláris kifejezés, amit létrehoztál (pl. /^[a-zA-Z]+$/).
  • string: Az a szöveg, amit meg akarsz vizsgálni, hogy megfelel-e a reguláris kifejezésnek.

    Visszatérési érték:

    A test() metódus egy logikai értékkel tér vissza:

    • true: Ha a reguláris kifejezés illeszkedik a megadott sztringre.
    • false: Ha a reguláris kifejezés nem illeszkedik a megadott sztringre.
  • Példa:

    let emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/
    let email = "teszt@example.com"
      if (emailPattern.test(email)) { 
               console.log("Érvényes email cím."); 
        } else
              console.log("Érvénytelen email cím."); 
        }

  • Ebben a példában a test() metódus azt ellenőrzi, hogy a email változó értéke megfelel-e az emailPattern reguláris kifejezésnek.
  • Ha az email cím formátuma megfelelő, akkor a test() true-t ad vissza, és megjelenik a "Érvényes email cím." üzenet.
  • Ha az email cím nem felel meg a mintának, akkor false lesz az eredmény, és a "Érvénytelen email cím." üzenet jelenik meg.
  • 13 B - 12. PHP és AJAX: Aszinkron adatküldés és fogadás PHP és JavaScript használatával

     A PHP és AJAX (Asynchronous JavaScript and XML) egy hatékony módszer az aszinkron adatküldésre és -fogadásra, amely lehetővé teszi a weboldalak számára, hogy frissítsék az adatokat anélkül, hogy a teljes oldalt újra kellene tölteni. Ez javítja a felhasználói élményt, mivel a felhasználó valós időben kap visszajelzést, és gyorsabb adatfeldolgozás történik. Az AJAX használatával JavaScript segítségével küldhetsz adatokat egy szerverre (általában PHP-vel), majd a szerver visszaküldi a feldolgozott adatokat anélkül, hogy újratöltené az oldalt.

    1. Az AJAX működése:

    Az AJAX aszinkron adatküldést és fogadást tesz lehetővé a következő lépések szerint:

    1. A JavaScript egy aszinkron kérést indít a szerver felé (pl. PHP script).
    2. A PHP script feldolgozza a kérést (adatok mentése, lekérdezése, stb.), majd válaszol.
    3. A JavaScript fogadja a PHP-től érkező választ, és frissíti a weboldalon az adatokat, anélkül, hogy újratöltődne az oldal.

    2. AJAX használata JavaScript-ben:

    Az AJAX lekérések megvalósítása JavaScript-ben többféle módon történhet. A két legnépszerűbb módszer a XMLHttpRequest objektum és a modern fetch() API használata.

    a. XMLHttpRequest használata:

    Példa egy egyszerű AJAX kérésre XMLHttpRequest-tel:

    // Új XMLHttpRequest objektum létrehozása
    let xhr = new XMLHttpRequest();
     
    // A kérés konfigurálása
    xhr.open('POST', 'backend.php', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
     
    // A kérés elküldése a szerver felé
    xhr.send('name=John&email=john@example.com');
     
    // A válasz kezelése
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            // A válasz sikeresen megérkezett
            document.getElementById('result').innerHTML = xhr.responseText;
        }
    };

    Ebben a példában a JavaScript küld egy POST kérést a backend.php felé, amely adatokat dolgoz fel, majd visszaküldi az eredményt, amely megjelenik az oldalon egy result ID-jú elemen.

    b. fetch() API használata:

    A fetch() API egy modernebb és egyszerűbb módszer az aszinkron kérésekhez.

    // fetch() API használata POST kérés küldéséhez
    fetch('backend.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: 'name=John&email=john@example.com'
    })
    .then(response => response.text()) // A válasz feldolgozása textként
    .then(data => {
        document.getElementById('result').innerHTML = data;
    })
    .catch(error => console.error('Hiba:', error));

    A fetch() egyszerűbbé és olvashatóbbá teszi az aszinkron kéréseket, és támogatja az ígéretek (promises) használatát is.

    3. PHP oldal kezelése:

    A szerveroldali feldolgozáshoz általában PHP-t használunk. A PHP fogadja a JavaScript által küldött adatokat (GET vagy POST kérés), majd feldolgozza azokat (például adatbázisba mentés, adatlekérdezés), és visszaad egy választ a JavaScript számára.

    Egyszerű PHP script a JavaScript által küldött POST adat fogadásához:

    <?php
    // Adatok fogadása
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $name = $_POST['name'];
        $email = $_POST['email'];
     
        // Adatfeldolgozás (pl. adatbázisba mentés)
        // ...
     
        // Válasz küldése a kliens felé
        echo "Az Ön neve: $name, email címe: $email";
    }
    ?>

    Ez a PHP kód fogadja a JavaScript által küldött name és email adatokat, majd visszaküldi a feldolgozott eredményt a kliens oldal felé.

    4. Gyakorlati példa PHP és AJAX integrációjára:

    HTML űrlap:

    <form id="ajaxForm">
        <label for="name">Név:</label>
        <input type="text" id="name" name="name" required>
        
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" required>
        
        <button type="submit">Beküldés</button>
    </form>
     
    <div id="result"></div>
     
    <script src="app.js"></script>

    JavaScript az űrlap adatok aszinkron küldéséhez:

    document.getElementById('ajaxForm').addEventListener('submit', function(e) {
        e.preventDefault(); // Megakadályozza az űrlap hagyományos elküldését
     
        // Az űrlap adatainak összegyűjtése
        const formData = new FormData(this);
     
        // Aszinkron kérés küldése
        fetch('backend.php', {
            method: 'POST',
            body: formData
        })
        .then(response => response.text())
        .then(data => {
            // Az eredmény megjelenítése
            document.getElementById('result').innerHTML = data;
        })
        .catch(error => console.error('Hiba:', error));
    });

    Ez a JavaScript kód megakadályozza az űrlap hagyományos beküldését, majd AJAX kérést küld a PHP szervernek az űrlap adataival, és megjeleníti az eredményt.

    PHP az adatok feldolgozásához:

    <?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $name = htmlspecialchars($_POST['name']);
        $email = htmlspecialchars($_POST['email']);
     
        // Feldolgozás (pl. adatbázisba mentés)
        echo "Beküldött név: $name<br>";
        echo "Beküldött email: $email";
    }
    ?>

    Ebben a példában a PHP fogadja a JavaScript által beküldött adatokat, és megjeleníti azokat a böngészőben.

    5. Hibakezelés AJAX kérések esetén:

    Az AJAX kérések során fontos a hibakezelés is. A PHP hibás válaszai esetén a JavaScript-ben fel kell készülni a hibák kezelésére, és megfelelő üzeneteket kell megjeleníteni a felhasználónak.

    Például a fetch() API-ban a hibák kezelésére használhatjuk a .catch() blokkot, amelyben a hálózati hibákat és más problémákat kezelhetjük:

    fetch('backend.php', { method: 'POST', body: formData })
    .then(response => {
        if (!response.ok) {
            throw new Error('Hálózati hiba történt');
        }
        return response.text();
    })
    .then(data => {
        document.getElementById('result').innerHTML = data;
    })
    .catch(error => {
        console.error('Hiba:', error);
        document.getElementById('result').innerHTML = 'Hiba történt az adatok beküldésekor.';
    });

    6. Biztonság AJAX használatakor:

    Mivel az AJAX lehetővé teszi az adatokat aszinkron módon, ügyelni kell az adatok biztonságos kezelésére:

    • Adat validáció a szerveroldalon: Mindig ellenőrizzük és szűrjük a beérkező adatokat a PHP oldalon, hogy elkerüljük a XSS és SQL injection támadásokat.
    • CSRF védelem: Különösen formok esetében érdemes CSRF tokent használni, hogy megakadályozzuk a jogosulatlan adatküldést.
    • HTTPS használata: Biztosítsuk, hogy a kérés titkosított csatornán (HTTPS) keresztül történjen, így a küldött adatok biztonságban vannak.

    Összefoglalás:

    Az AJAX segítségével könnyen küldhetünk és fogadhatunk adatokat PHP szerverrel anélkül, hogy újratöltenénk az oldalt. Ez a technika javítja a felhasználói élményt és hatékonyabb adatfeldolgozást tesz lehetővé. A modern böngészők támogatják az XMLHttpRequest objektumot és a fetch() API-t is, amelyekkel egyszerűen küldhetünk és fogadhatunk adatokat. Fontos azonban a megfelelő biztonsági intézkedések bevezetése a PHP oldalon.

    2024. október 4., péntek

    12 B - web javascript ismétlő feladat

     Készítsd el az alábbi feladatot: 

    Működése:

    1. A felhasználó kiválaszt egy úti célt a legördülő menüből (Párizs, New York, Tokió).
    2. Kiválasztja, hogy kér-e biztosítást.
    3. Amikor a felhasználó rákattint a "Számold ki a végösszeget" gombra, a program kiírja az utazás teljes költségét a biztosítással együtt (ha kérte azt).

    Segítség a megoldáshoz:

    1. A felhasználó egy HTML <select> elemből választhat 3 különböző úti cél közül.
    2. A választott úti cél alapján beolvassuk az árát.
    3. A megoldáshoz írj egy függvényt, amelyet kattintásra hívunk meg.

    Példa:

    • Úti célok:

      • Párizs: 1000$
      • New York: 1500$
      • Tokió: 2000$
    • Biztosítás: 100$


    2024. október 1., kedd

    12B 8. ES6 szintaxis: Nyílfüggvények, let és const változók, template literálok.

     Az ES6 (ECMAScript 6) számos újítást hozott a JavaScript nyelvbe, amelyek közül kiemelkednek a nyílfüggvények, a let és const változók, valamint a template literálok. Ezek az újítások könnyebbé, biztonságosabbá és olvashatóbbá teszik a kód írását. Lássuk részletesebben ezeket:

    1. Nyílfüggvények (Arrow Functions)

    A nyílfüggvények rövidebb és olvashatóbb módját kínálják a függvények deklarálásának. A hagyományos function szintaxis helyett egy nyilat (=>) használunk. Előnyük továbbá, hogy az általuk használt this értéke nem változik, mindig az adott kontextusra vonatkozik.

    Szintaxis:

    // Hagyományos függvény

    function add(a, b) {

      return a + b;

    }

    // Nyílfüggvény

    const add = (a, b) => a + b;

    Jellemzők:

    • Egyszerű szintaxis egyetlen kifejezés esetén (nem kell return és kapcsos zárójel).
    • Több soros kifejezés esetén a függvénytestet kapcsos zárójelek közé kell tenni, és expliciten kell használni a return kulcsszót:

    const multiply = (a, b) => {

      const result = a * b;

      return result;

    };

    Ha a függvénynek egyetlen paramétere van, akkor a zárójeleket is elhagyhatjuk:

    const square = x => x * x;

    this viselkedése:

    A nyílfüggvények nem definiálnak saját this értéket, hanem öröklik azt a környezetből, ahol létrehozták őket. Ez hasznos lehet például aszinkron kódoknál, ahol a this értéke változhat a hagyományos függvények esetén.

    2. let és const változók

    Az ES6-ban a változók definiálására két új kulcsszót vezettek be: let és const. Ezek a régi var kulcsszót váltják fel, és számos előnnyel járnak, különösen a hatókör és újraértelmezés kezelésében.

    let

    A let lokális blokk szintű hatókörrel rendelkezik, vagyis csak abban a blokkban (kapcsos zárójelek között) érhető el, ahol definiálták. Ez megakadályozza, hogy a kód különböző részeiben véletlenül újraértelmezzünk egy változót, amely hibákhoz vezethetne.

    Példa:

    let x = 10;

    if (x > 5) {

      let y = 20; // Ez a változó csak az if blokkban létezik

      console.log(y); // 20

    }

    console.log(y); // Hibát dob, mert y nincs a blokkon kívül

    const

    A const a konstansok deklarálására szolgál, vagyis olyan változókra, amelyek értéke nem változtatható meg az inicializálás után. Fontos megjegyezni, hogy ez csak a primitív értékekre igaz (szám, string, boolean), objektumok vagy tömbök esetén az objektum tulajdonságai vagy a tömb elemei módosíthatók, de maga az objektum nem.

    Példa:

    const pi = 3.14159;

    pi = 3; // Hibát dob, mert pi értéke nem változtatható

    const arr = [1, 2, 3];

    arr.push(4); // Ez működik, mert az arr elemei módosíthatók

    3. Template literálok (Template Literals)

    A template literálok (más néven template stringek) egyszerűsítik a szövegek kezelését és összefűzését. Az újfajta idézőjelek (`) segítségével változók és kifejezések közvetlenül beilleszthetők a szövegbe a ${} szintaxis segítségével.

    Példa:

    const name = 'John';

    const age = 30;

    const message = `My name is ${name} and I am ${age} years old.`;

    console.log(message); // My name is John and I am 30 years old.

    Több soros stringek:

    A template literálokkal több soros szövegeket is könnyedén lehet kezelni anélkül, hogy külön karaktereket kellene használni az új sorokhoz.

     

    const multiLineText = `

    This is a string

    that spans across

    multiple lines.

    `;

    console.log(multiLineText);

    Összegzés:

    • Nyílfüggvények: rövidebb, egyszerűbb függvénydefiníciók, amelyek öröklik a környezetük this értékét.
    • let és const: blokkszintű hatókört biztosítanak, így biztonságosabbak, mint a var. A const változókat nem lehet újraértékelni, míg a let változók változtathatóak.
    • Template literálok: dinamikus szövegek létrehozására használhatók, változók és kifejezések közvetlen beszúrásával, valamint több soros szövegek kezelésére.

    Ezek az ES6 szintaxisbeli újítások jelentősen javítják a JavaScript kódolási élményt és hatékonyságot, ezért elengedhetetlen ismerni őket modern JavaScript projektek során.

    12 B 6. Függvények típusai: Névtelen függvények, callback függvények, és függvények mint objektumok.

    1. Névtelen függvények (Anonymous Functions)

    Névtelen függvények olyan függvények, amelyeknek nincs nevük. Általában akkor használjuk őket, amikor nem szükséges egy függvényt több helyen újrahasználni. Gyakran találkozhatunk velük helyi változókhoz rendelve vagy callback függvényként átadva.

    Példa:

    const add = function(a, b) {
      return a + b;
    };
    console.log(add(5, 3));  // 8

    Ebben a példában egy névtelen függvényt rendeltünk az add változóhoz, majd meghívtuk a függvényt a változón keresztül. A névtelen függvények nem rendelkeznek saját nevükkel, ezért csak azon a ponton érhetők el, ahol deklaráltuk őket.

    Az arrow function (nyíl függvény) a JavaScript ES6 verziójával került be a nyelvbe, és a függvények írásának egy rövidebb, tisztább szintaxisú alternatíváját kínálja. Az arrow function nemcsak a szintaxisában tér el a hagyományos függvényektől, hanem a viselkedésében is, különösen ami a this kontextust illeti.

    Arrow Function fő jellemzői

    1.     Rövidebb szintaxis Az arrow function szintaxisa tömörebb és könnyebben olvasható, különösen akkor, ha csak egy kifejezést kell visszaadni.

    o   Hagyományos függvény:

    const multiply = function(a, b) {
      return a * b;
    };

    o   Arrow function:

    const multiply = (a, b) => a * b;

    Az arrow function esetében a kifejezés automatikusan visszatérési értékként (return) kerül kiértékelésre, ha nincs kifejtve a függvénytörzs, és nincs szükség explicit return utasításra.

    2.     Kompaktabb egyetlen paraméter esetén Ha a függvény csak egy paramétert vesz át, akkor a zárójelek elhagyhatók.

      • Példa egy paraméteres arrow function-re:
    const square = x => x * x;
    console.log(square(5));  // 25

    3.     Implicit return Ha a függvénytörzs egy egyszerű kifejezésből áll, nem szükséges a függvénytestet (görbe zárójeleket) használni, és a return is implicit (automatikus).

      • Példa implicit return használatára:
    const add = (a, b) => a + b;
    console.log(add(3, 7));  // 10

    4.     Ha több utasítás van a függvénytörzsben, vagy explicit logikát kell alkalmazni, akkor szükségesek a görbe zárójelek, és ebben az esetben a return utasítás már nem lesz implicit.

      • Példa több utasításos arrow function-re:
    const addAndLog = (a, b) => {
      console.log(`Adding ${a} and ${b}`);
      return a + b;
    };
     
    console.log(addAndLog(2, 5));  // "Adding 2 and 5", majd 7

    5.     Nincs saját this kontextus Az arrow function egyik legnagyobb különbsége a hagyományos függvényekhez képest, hogy nem köt saját this kontextust. A hagyományos függvényekben a this a függvény meghívásának kontextusától függően változik, de az arrow function a lexikális környezetéből örökli a this-t.

    Ez azt jelenti, hogy az arrow function mindig azt a this-t fogja használni, ami a függvényt körülvevő kontextusban volt érvényes. Ez különösen hasznos lehet például akkor, amikor objektumokon belül hívunk meg függvényeket, vagy amikor egy callback függvényben szeretnénk használni a this-t.

    o   Példa: Hagyományos függvény és this viselkedése:

    function Person() {
      this.age = 0;
     
      setInterval(function() {
        this.age++;
        console.log(this.age);
      }, 1000);
    }
     
    const p = new Person();
    // A `this` a setInterval-ben a globális objektumra fog mutatni (böngészőben: `window`), nem pedig a Person példányára.
        • Megoldás arrow function-nel:
    function Person() {
      this.age = 0;
     
      setInterval(() => {
        this.age++;
        console.log(this.age);
      }, 1000);
    }
     
    const p = new Person();
    // A `this` most már a Person példányára mutat, így az `age` helyesen növekszik.

    Mivel az arrow function nem rendelkezik saját this-szel, hanem a külső lexikális környezetből veszi át, ez megoldja a this kontextusproblémáját, amely gyakran előfordul aszinkron kódokban.

    6.     Nem használható konstruktor függvényként A hagyományos függvényekkel ellentétben az arrow function-t nem lehet konstruktor függvényként használni. Ez azt jelenti, hogy nem lehet őket new operátorral példányosítani.

      • Példa:
    const MyFunction = () => {};
    const instance = new MyFunction();  // Hiba: Arrow function nem használható konstruktor függvényként

    7.     Nincs arguments objektum A hagyományos függvényekhez hasonlóan az arrow function nem rendelkezik saját arguments objektummal. Ha hozzáférésre van szükség a függvény argumentumaihoz, akkor a rest parameters (...args) használata ajánlott.

      • Példa arguments helyett rest parameters használatával:
    const sumAll = (...args) => args.reduce((sum, num) => sum + num, 0);
     
    console.log(sumAll(1, 2, 3, 4));  // 10

    Összegzés

    Az arrow function-ek nagyban egyszerűsítik a JavaScript kódot, különösen akkor, ha rövid és egyszerű függvényeket kell írni. Azáltal, hogy nem köt saját this-t, könnyebbé válik az aszinkron kódok kezelése és a callback függvények kezelése. Fontos azonban megérteni, hogy az arrow function nem helyettesíti teljesen a hagyományos függvényeket, mivel bizonyos esetekben (pl. konstruktor függvények írásakor) a hagyományos függvények továbbra is szükségesek.

    2. Callback függvények

    A callback függvények olyan függvények, amelyeket egy másik függvény paraméterként kap meg, és gyakran akkor hívják meg őket, amikor egy adott esemény megtörténik, vagy amikor egy művelet befejeződik. A JavaScript aszinkron természetéből adódóan a callback függvények rendkívül fontosak például API hívások, fájlműveletek vagy egyéb időigényes feladatok kezelése során.

    Példa callback függvényre:

    function processData(data, callback) {
      console.log("Processing data...");
      callback(data);
    }
     
    function logData(data) {
      console.log("Data:", data);
    }
     
    processData({ name: "John", age: 25 }, logData);

    Ebben a példában a logData függvényt adtuk át a processData függvénynek callbackként. A processData függvény az adatfeldolgozás után meghívja a callbacket, és átadja neki az adatokat.

    Callback függvények aszinkron műveleteknél:

    Az aszinkron műveleteknél a callback-ek különösen hasznosak. Például egy adatbázis-lekérdezés vagy fájl beolvasása után callbacket használhatunk az adatok feldolgozására.

    Aszinkron példa:

    setTimeout(() => {
      console.log("This runs after 2 seconds");
    }, 2000);

    Itt a setTimeout egy aszinkron funkció, amely vár 2 másodpercet, mielőtt meghívja a callback függvényt.

    3. Függvények mint objektumok

    A JavaScriptben a függvények speciális objektumok. Ez azt jelenti, hogy ugyanúgy, ahogyan egy objektumnak lehetnek tulajdonságai és metódusai, egy függvénynek is lehetnek ilyen tulajdonságai. Mivel a függvények objektumok, átadhatók más változóknak, tárolhatók tömbökben, és visszatérhetnek más függvényekből is.

    Példa: Függvények tulajdonságai

    function greet() {
      console.log("Hello!");
    }
     
    greet.language = "English";
    console.log(greet.language);  // English

    Itt a greet egy függvény, amelyhez hozzáadtunk egy language tulajdonságot. Ez az egyedülálló tulajdonság lehetővé teszi, hogy függvényeket dinamikusan bővítsünk.

    Függvények mint értékek:

    A függvények átadhatók más függvényeknek paraméterként, vissza is adhatók függvényekből, vagy akár tárolhatók tömbökben vagy objektumokban is.

    Példa: Függvény visszatérése egy másik függvényből

    function createMultiplier(multiplier) {
      return function(num) {
        return num * multiplier;
      };
    }
    const double = createMultiplier(2);
    console.log(double(5));  // 10

    Ebben a példában a createMultiplier egy függvényt ad vissza, amely a megadott számmal szorozza meg a paraméterét. A függvények ilyen módon való kezelése rendkívül rugalmas lehetőségeket biztosít a JavaScriptben.

    Összefoglalás

    • Névtelen függvények nem rendelkeznek névvel, gyakran egyszeri használatra vannak szánva.
    • Callback függvények másik függvénynek átadott függvények, amelyek gyakran aszinkron események vagy műveletek után hívódnak meg.
    • Függvények mint objektumok azt jelentik, hogy a függvények is rendelkezhetnek tulajdonságokkal és metódusokkal, illetve önálló értékként kezelhetők.

    Ez a három függvénytípus különböző helyzetekben és feladatokban rendkívül hasznos lehet a JavaScript fejlesztés során.

    2024. szeptember 9., hétfő

    13 frontend - 9. Aszinkron JavaScript: Callback-ek, Promises, Async/Await

    Mi az a callback?

    A callback egy függvény, amelyet egy másik függvény paramétereként adunk át. A callback célja, hogy egy művelet befejezése után további kódot futtassunk. Callback-eket gyakran használunk aszinkron műveletek, például hálózati kérések vagy időzített feladatok kezelésére.

    Hogyan működik?
    Amikor egy aszinkron műveletet végzünk, például egy adat lekérdezést az API-ból, nem várhatjuk el, hogy azonnal befejeződjön. Ehelyett, amikor az adatokat betöltöttük, a callback függvény hívódik meg, amely a művelet befejeződése után fut le.

    Példa:

    function fetchData(callback) {
        setTimeout(() => {
            console.log('Adatok betöltve');
            callback(); // Callback meghívása
        }, 1000); // 1 másodperces késleltetés
    }
     
    function onDataLoaded() {
        console.log('A callback függvény végrehajtása');
    }
     
    // fetchData hívása a onDataLoaded callback-kel
    fetchData(onDataLoaded);

    Magyarázat:
    A fetchData függvény 1 másodpercet vár, majd kiírja, hogy "Adatok betöltve". Ezután meghívja a callback függvényt, amely a onDataLoaded-ként lett átadva, így kiírja, hogy "A callback függvény végrehajtása".

    9.2 Promises

    Mi az a Promise?
    A Promise egy objektum, amely egy aszinkron művelet jövőbeli eredményét vagy hibáját képviseli. Három állapota van:

    • Pending (függőben lévő): Az ígéret még nem teljesült, és nem is lett elutasítva.
    • Fulfilled (teljesült): Az ígéret sikeresen teljesült, és az eredmény elérhető.
    • Rejected (elutasított): Az ígéret nem teljesült, és egy hibaüzenet érhető el.

    Hogyan működik?
    A Promise-t akkor használjuk, amikor egy aszinkron műveletet szeretnénk végrehajtani és kezelni szeretnénk a sikeres és sikertelen befejeződést is.

    Példa:

    function fetchData() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                const success = true; // Simulált siker
                if (success) {
                    console.log('Adatok betöltve');
                    resolve(); // Promise teljesült
                } else {
                    reject('Hiba történt'); // Promise elutasítva
                }
            }, 1000);
        });
    }
     
    // fetchData hívása és Promise kezelése
    fetchData()
        .then(() => {
            console.log('A Promise sikeresen teljesült');
        })
        .catch(error => {
            console.error('Hiba:', error);
        });

    Magyarázat:
    A fetchData függvény egy új Promise-t ad vissza. A setTimeout után, ha a success érték true, akkor a Promise teljesül, és a .then() blokk fut le. Ha a success érték false, a Promise elutasításra kerül, és a .catch() blokk fut le.

    9.3 Async/Await

    Mi az az async/await?
    Az async és await a Promise-ek egyszerűsített kezelési módjai. Az async kulcsszó egy függvényt aszinkronnak jelöl, ami automatikusan egy Promise-t ad vissza. Az await kulcsszó pedig várakozik egy Promise teljesülésére, mielőtt tovább lépne a következő sorra.

    Hogyan működik?
    Az async funkciók lehetővé teszik, hogy az aszinkron kódot szinkronnak tűnő módon írjuk, ami olvashatóbbá és karbantarthatóbbá teszi a kódot.

    Példa:

    function fetchData() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                const success = true; // Simulált siker
                if (success) {
                    console.log('Adatok betöltve');
                    resolve(); // Promise teljesült
                } else {
                    reject('Hiba történt'); // Promise elutasítva
                }
            }, 1000);
        });
    }
     
    async function loadData() {
        try {
            await fetchData(); // Várakozás a fetchData Promise-ra
            console.log('Az async/await sikeresen teljesült');
        } catch (error) {
            console.error('Hiba:', error); // Hibakezelés
        }
    }
     
    // loadData hívása
    loadData();


    A loadData egy async függvény, amely az await kulcsszó segítségével várakozik a fetchData Promise-ra. Ha a Promise teljesül, a következő sorok futnak le, ellenkező esetben a catch blokk kezelni fogja a hibát.

    Feladat: Adatfeldolgozó Rendszer

    Feladat Leírása

    A feladat célja, hogy készíts egy egyszerű alkalmazást, amely bemutatja az aszinkron JavaScript különböző módszereit. Az alkalmazásnak egy fiktív adatfeldolgozó rendszert kell szimulálnia, amely adatokat tölt le egy szerverről, és az adatokat feldolgozza.

    Hozz létre egy js kiterjesztésű fájlt, az ellenőrzéshez, nyiss egy új terminált, és a „node fájlod neve” paranccsal tudod ellenőrizni az eredményt. Csak az aktuális mappád legyen megnyitva a vsc-ben.

    Elvárt Funkcionalitás

    1.     Adatletöltés: Készíts egy funkciót, amely szimulál egy aszinkron adatletöltést. Az adatletöltést egy setTimeout-tal kell szimulálni, amely 2 másodperc után visszaad egy adatobjektumot.

    2.     Adatok Feldolgozása Callback-kel: Implementálj egy funkciót, amely a letöltött adatokat feldolgozza, és az eredményt egy callback függvény segítségével adja vissza.

    3.     Adatok Feldolgozása Promises-szel: Implementálj egy funkciót, amely a letöltött adatokat feldolgozza, és a Promise API-t használja a feldolgozott adatok visszaadására.

    4.     Adatok Feldolgozása Async/Await-tel: Implementálj egy funkciót, amely az async/await segítségével dolgozza fel az adatokat.

    A feladat végén az alkalmazás három különböző módon kell, hogy kiírja a feldolgozott adatokat a konzolra:

    1. Callback használatával
    2. Promise használatával
    3. Async/await használatával
    Minta: 


    Feladat: Külső JSON Adatok Feldolgozása

    Feladat Célja

    A feladat célja, hogy gyakorold az aszinkron JavaScript technikák alkalmazását külső JSON API-val. A JSONPlaceholder API-t fogjuk használni, amely egy ingyenes, fiktív API, és lehetővé teszi, hogy különböző típusú JSON adatokat kérjünk le. A feladat során három különböző módszert fogunk használni az adatok feldolgozására: callback-eket, Promises-t és async/await-et.

    API URL

    Az adatok lekéréséhez használd az alábbi JSONPlaceholder API URL-t: https://jsonplaceholder.typicode.com/users

    Feladat Leírása

    1. Külső Adatok Lekérése: Készíts egy JavaScript funkciót, amely lekéri a felhasználói adatokat a JSONPlaceholder API-ról.

    2. Adatok Feldolgozása Callback-kel: Implementálj egy funkciót, amely a lekért adatokat egy callback segítségével dolgozza fel, és a feldolgozott adatokat egy HTML táblázatban jeleníti meg.

    3. Adatok Feldolgozása Promises-szel: Implementálj egy funkciót, amely a lekért adatokat Promises segítségével dolgozza fel, és a feldolgozott adatokat a HTML táblázatban jeleníti meg.

    4. Adatok Feldolgozása Async/Await-tel: Implementálj egy funkciót, amely async/await használatával dolgozza fel az adatokat, és a feldolgozott adatokat a HTML táblázatban jeleníti meg.

    Teendők

    1. HTML és CSS Előkészítése:

      • Készíts egy HTML oldalt, amely tartalmaz egy táblázatot a felhasználói adatok megjelenítésére.
      • Hozz létre három gombot, amelyek különböző aszinkron módszerekkel történő adatfeldolgozást indítanak el.
    2. JavaScript Implementáció:

      • Adatok Lekérése:
        • Implementálj egy fetchUsers függvényt, amely lekéri a felhasználói adatokat a JSONPlaceholder API-ból.
      • Adatok Feldolgozása Callback-kel:
        • Implementálj egy processUsersWithCallback függvényt, amely a lekért adatokat callback-kel dolgozza fel.
        • Tedd lehetővé, hogy a feldolgozott adatokat a callback függvény a HTML táblázatban jelenítse meg.
      • Adatok Feldolgozása Promises-szel:
        • Implementálj egy processUsersWithPromise függvényt, amely a lekért adatokat Promises segítségével dolgozza fel.
        • Tedd lehetővé, hogy a feldolgozott adatokat a Promise .then() metódusában a HTML táblázatban jelenítse meg.
      • Adatok Feldolgozása Async/Await-tel:
        • Implementálj egy processUsersWithAsyncAwait függvényt, amely async/await használatával dolgozza fel az adatokat.
        • Tedd lehetővé, hogy a feldolgozott adatokat az async/await .then() metódusában a HTML táblázatban jelenítse meg.
    3. HTML Táblázat Frissítése:

      • Készíts egy displayUsers függvényt, amely frissíti a HTML táblázatot a feldolgozott felhasználói adatokkal.
    4. Gombok Eseménykezelése:

      • Adj hozzá eseménykezelőket a három gombhoz, amelyek az adatfeldolgozó funkciókat hívják meg és frissítik a táblázatot.

    Elvárt Eredmény

    1. Callback használatával: A felhasználói adatok a táblázatban jelennek meg a Callback funkció használatával.
    2. Promise használatával: A felhasználói adatok a táblázatban jelennek meg a Promise használatával.
    3. Async/Await használatával: A felhasználói adatok a táblázatban jelennek meg az Async/Await használatával.
    Minta: 


    PIQPACC keretrendszer azaz ellenőrző lista arra, hogyan használjuk az AI-t kritikus gondolkodással

      P – Purpose / Cél Mit akarok elérni? Pontosan mire kérem az AI-t, és mire nem? I – Information / Információ Milyen adatokra, forrásokra...