Tananyag
9. lecke · Űrlapok I. – alapok

2. modul · HTML alapok · 9. lecke

Űrlapok I. – alapok

Eddig az oldalad mutatott valamit. Az űrlappal a látogató adatot ad neked: beír, kiválaszt, elküld. Ebben a leckében a keretet és a legfontosabb mezőtípust nézzük meg — és megértjük, mi történik a „Küldés" gomb megnyomásakor.

≈ 35 perc Előtte: 3–6. lecke Kipróbálható űrlapokkal

Mit fogsz tudni a lecke végén

1Mire való az űrlap?

Az űrlap az egyetlen eszköz a HTML-ben, amivel a látogató adatot küldhet neked. Bejelentkezés, regisztráció, keresés, kapcsolatfelvétel, rendelés, szavazás — mind űrlap.

1. Kitölti a látogató 2. Elküldi a böngésző 3. Feldolgozza a szerver A HTML az 1. és a 2. lépésért felel. A 3. már szerveroldali programozás.
Az űrlap három lépése — nekünk az első kettő a dolgunk.
AMIT MOST NEM TANULUNK MEG

Azt, hogy mi történik az adattal a szerveren: ki menti el, ki küld róla e-mailt. Ahhoz szerveroldali programozás kell (PHP, Node.js, Python). Mi a kérdőívet készítjük el — nem azt, aki kiértékeli. Ez bőven elég egy teljes tananyagra.

2A form elem

A <form> a keret: minden mező, ami benne van, együtt kerül elküldésre. Két attribútuma fontos.

AttribútumMit jelent?
actionHova menjen az adat — egy szerveroldali program címe.
methodHogyan menjen: get vagy post.
<form action="feldolgoz.php" method="post">
  ... a mezők ...
</form>

GET vagy POST?

GETPOST
Hol utazik az adat? A címsorban: kereses.php?q=alma&db=3 A kérés törzsében — a címsorban nem látszik
Látható? Igen, bárki elolvashatja a képernyőn Nem látszik a címsorban
Könyvjelzőzhető? Igen — a cím tartalmazza az adatot Nem
Mikor használd? Keresés, szűrés — ahol jó, ha a találat linkelhető Minden más: bejelentkezés, regisztráció, üzenetküldés
JELSZÓT SOHA GET-TEL

GET esetén az adat bekerül a címsorba, onnan pedig a böngésző előzményeibe, a szerver naplóiba, sőt akár a válla fölött néző ember szemébe. Jelszó, személyes adat, üzenet mindig POST.

A POST SEM TITKOSÍTÁS!

A POST csak azt jelenti, hogy nem a címsorban utazik az adat — attól még olvasható útközben. A valódi védelmet a https:// adja. A POST a helyes forma, a HTTPS a biztonság.

EBBEN A TANANYAGBAN

Nincs szerverünk, ami fogadná az adatot. Az élő példákban ezért az űrlap elküldésekor egy kis doboz jelenik meg, ami megmutatja, mit küldene el a böngésző. Ez pontosan az az adat, amit egy valódi szerver megkapna.

3Az input elem

Az <input> a leguniverzálisabb elem a HTML-ben: a type attribútumtól függően lehet szövegdoboz, jelszómező, dátumválasztó, színválasztó, csúszka vagy gomb. Üres elem — nincs záró tagja.

Az első űrlap — próbáld ki és küldd el!
index.html
<form action="feldolgoz.php" method="get">
  <label for="nev">Neved:</label>
  <input type="text" id="nev" name="nev">

  <button type="submit">Küldés</button>
</form>
Eredmény — írj be valamit, és küldd el!
Írj be egy nevet, és nyomd meg a Küldés gombot. Megjelenik, hogy a böngésző mit küldene el: feldolgoz.php?nev=... — mivel method="get", az adat a címsorba kerülne.

4A name és a value

Ez a lecke legfontosabb szakasza. Az adat, ami elmegy a szerverhez, név–érték párokból áll:

email = anna@example.com a name attribútum te adod meg a kódban a value a látogató írja be
A szerver a name alapján tudja, melyik adat micsoda.
NAME NÉLKÜL A MEZŐ NEM LÉTEZIK

Ha egy mezőnek nincs name attribútuma, a tartalma egyszerűen nem kerül elküldésre. A látogató kitölti, megnyomja a gombot, és az adat nyomtalanul eltűnik. A böngésző nem szól — ez az egyik legalattomosabb űrlaphiba.

Ugyanaz a két mező — az egyiknek nincs neve
index.html
<form action="mentes.php" method="post">
  <p>
    <label for="a">Van name attribútuma:</label>
    <input type="text" id="a" name="varos">
  </p>
  <p>
    <label for="b">Nincs name attribútuma:</label>
    <input type="text" id="b">
  </p>
  <button type="submit">Küldés</button>
</form>
Eredmény — töltsd ki MINDKETTŐT, és küldd el!
Írj be mindkét mezőbe valamit. Az elküldött adatban csak a varos= fog szerepelni — a második mező tartalma sehol nincs. Ez pontosan az a hiba, amit soha nem vennél észre magadtól.

A value attribútum

A value a mező értéke. Szöveges mezőnél megadhatod előre kitöltött kezdőértékként:

Előre kitöltött mező
index.html
<form action="mentes.php" method="post">
  <label for="orszag">Ország:</label>
  <input type="text" id="orszag" name="orszag"
         value="Magyarország">

  <button type="submit">Küldés</button>
</form>
Eredmény a böngészőben
A mező kitöltve indul, de a látogató átírhatja. Akkor hasznos, ha van egy valószínű alapérték — így a legtöbb embernek nem kell gépelnie.
A NAME ELNEVEZÉSE
  • Beszédes legyen: name="email", nem name="mezo2".
  • Kisbetű, ékezet és szóköz nélkül — mint a fájlneveknél.
  • Több szót kötőjellel vagy aláhúzással: name="szuletesi-datum".
  • Egy űrlapon belül ne ismétlődjön — kivéve a rádiógomboknál (10. lecke).

5A label és a for

A <label> a mező felirata. Nem díszítés: a for attribútum összekapcsolja a mezővel, és ettől három dolog történik.

HOGYAN MŰKÖDIK AZ ÖSSZEKAPCSOLÁS

A label for attribútuma megegyezik a mező id attribútumával. Nem a name attribútummal — az id attribútummal! Ez a két attribútum különböző célt szolgál:

  • name → a szervernek: melyik adat ez
  • id → az oldalon belül: melyik elem ez (a label és a CSS számára)
Kattints a feliratra, ne a mezőre!
index.html
<p>
  <label for="email">E-mail cím:</label>
  <input type="email" id="email" name="email">
</p>

<p>
  Nincs label, csak szöveg:
  <input type="email" name="email2">
</p>
Eredmény — kattints a két feliratra!
Kattints az „E-mail cím:" feliratra — a kurzor beugrik a mezőbe. A második feliratra kattintva nem történik semmi. Ez a különbség apróságnak tűnik, de telefonon, kis mezőknél sokat számít.
Mit ad a label?Miért számít?
Nagyobb kattintható felületA feliratra kattintva is a mezőbe kerül a kurzor. Érintőképernyőn ez komoly könnyebbség.
Felolvasható kapcsolatA képernyőolvasó bemondja a felirat szövegét, amikor a mezőre ér. Enélkül csak annyit hallani: „szerkesztőmező".
Egyértelmű jelentésNem csak „valami szöveg a mező mellett", hanem rögzített kapcsolat.

Két írásmód

✔ for + id (ajánlott)
<label for="nev">Neved:</label>
<input type="text" id="nev" name="nev">
✔ becsomagolva (id nélkül is jó)
<label>
  Neved:
  <input type="text" name="nev">
</label>

Mindkettő működik. Az elsőt használjuk végig, mert így a felirat és a mező külön elem marad — CSS-sel könnyebb elrendezni őket (például a feliratot a mező fölé tenni).

MINDEN MEZŐNEK JÁR LABEL

Kivétel nélkül. Ha vizuálisan nem fér ki a felirat (például egy keresőmezőnél), akkor is tedd ki — és CSS-sel rejtsd el úgy, hogy a képernyőolvasó még lássa. Ez a helyes megoldás; a placeholder nem az.

6Mezőtípusok

A type attribútum dönti el, milyen mező lesz az <input>-ból. Ez nem csak kinézet: a böngésző ez alapján ellenőriz, és telefonon más billentyűzetet dob fel.

Nyolc mezőtípus egy helyen — próbáld ki mindegyiket!
index.html
<p><label for="a">text</label><br>
<input type="text" id="a" name="a"></p>

<p><label for="b">email</label><br>
<input type="email" id="b" name="b"></p>

<p><label for="c">password</label><br>
<input type="password" id="c" name="c"></p>

<p><label for="d">number</label><br>
<input type="number" id="d" name="d"></p>

<p><label for="e">date</label><br>
<input type="date" id="e" name="e"></p>

<p><label for="f">color</label><br>
<input type="color" id="f" name="f"></p>

<p><label for="g">range</label><br>
<input type="range" id="g" name="g"></p>

<p><label for="h">file</label><br>
<input type="file" id="h" name="h"></p>
Eredmény — kattints bele mindegyikbe!
Figyeld meg: a password elrejti a karaktereket, a number mellett nyilacskák jelennek meg, a date naptárt nyit, a color színválasztót. Ezt mind a böngésző adja — egy sor kódot sem írtál hozzá.
A leggyakoribb típusok
typeMire való, és mit ad hozzá a böngésző?
textEgysoros szöveg. Ez az alapértelmezés, ha nem adsz meg típust.
emailE-mail cím. Ellenőrzi, hogy van-e benne @. Telefonon @-os billentyűzet.
passwordJelszó. A beírt karakterek pontokká válnak.
numberSzám. Léptetőnyilak; min, max, step adható meg.
telTelefonszám. Nem ellenőriz (túl sokféle formátum van), de telefonon számbillentyűzetet ad.
urlWebcím. Ellenőrzi, hogy van-e protokoll (https://).
dateDátum. A böngésző naptárt nyit.
timeIdőpont.
colorSzín. Színválasztó ablak nyílik.
rangeCsúszka min és max között. Ha a pontos érték nem számít.
fileFájlfeltöltés. „Tallózás" gombot ad.
hiddenRejtett mező: nem látszik, de elküldődik. Technikai adatokhoz.
ISMERETLEN TÍPUS = SZÖVEGMEZŐ

Ha elgépeled (type="emial"), vagy egy régi böngésző nem ismeri a típust, akkor sima szövegmező lesz belőle. Nem kapsz hibát — csak elmarad az ellenőrzés és a kényelmi funkció. Ez a HTML „megbocsátó" természete.

A HELYES TÍPUS TELEFONON A LEGÉRTÉKESEBB

Asztali gépen alig látszik a különbség. Telefonon viszont a type="number" számbillentyűzetet dob fel, az email pedig @-ot tesz a billentyűzetre. Ez érezhetően kényelmesebb kitöltés.

7A placeholder csapdája

A placeholder az a halvány szöveg, ami az üres mezőben látszik, és eltűnik, amint gépelni kezdesz.

Label + placeholder, és csak placeholder
index.html
<p>
  <label for="tel">Telefonszám:</label><br>
  <input type="tel" id="tel" name="tel"
         placeholder="+36 30 123 4567">
</p>

<p>
  <input type="tel" name="tel2"
         placeholder="Telefonszám">
</p>
Eredmény — gépelj be mindkettőbe!
Gépelj a második mezőbe, aztán nézd meg: eltűnt a felirat. Ha félbehagyod a kitöltést, vagy visszalépsz ellenőrizni, már nem tudod, mit kellett oda írni. Az elsőnél a label a helyén marad.
A PLACEHOLDER NEM LABEL

Ez a kezdők egyik leggyakoribb tévedése: „minek label, ha a placeholder is odaírja". Amiért ez rossz:

  • Eltűnik, amint gépelni kezdesz — pont akkor, amikor kellene.
  • Halvány szürke, gyakran olvashatatlanul alacsony kontraszttal.
  • Nem kattintható, nem növeli a célfelületet.
  • A képernyőolvasók eltérően kezelik — nem megbízható felirat.
A HELYES HASZNÁLAT

A label megmondja, mi az a mező. A placeholder pedig példát mutat a formátumra: Telefonszám + +36 30 123 4567. Kiegészítik egymást, nem helyettesítik.

8Beépített ellenőrzés

A böngésző ingyen ad egy alapszintű ellenőrzést — nem kell hozzá JavaScript. A legfontosabb eszköze a required attribútum: ez azt jelenti, hogy a mezőt kötelező kitölteni.

Kötelező mezők — próbáld elküldeni üresen!
index.html
<form action="mentes.php" method="post">
  <p>
    <label for="n">Név (kötelező):</label><br>
    <input type="text" id="n" name="nev" required>
  </p>
  <p>
    <label for="e">E-mail (kötelező):</label><br>
    <input type="email" id="e" name="email" required>
  </p>
  <p>
    <label for="k">Kor (12 és 99 között):</label><br>
    <input type="number" id="k" name="kor"
           min="12" max="99">
  </p>
  <button type="submit">Küldés</button>
</form>
Eredmény — próbáld ki a hibákat is!
Próbáld ki sorban: (1) küldd el üresen · (2) írj az e-mail mezőbe @ nélküli szöveget · (3) írj a korhoz 5-öt. Mindháromnál a böngésző állít meg, saját nyelvű buborékkal — egy sor JavaScript nélkül.
AttribútumMit ellenőriz?
requiredKötelező kitölteni. Logikai attribútum — nincs értéke.
min / maxSzámnál és dátumnál a megengedett tartomány.
minlength / maxlengthA szöveg hossza karakterben.
patternSaját minta (reguláris kifejezés) — haladó téma.
maga a typeemail, url, number — a formátumot is ellenőrzi.
A BÖNGÉSZŐ ELLENŐRZÉSE NEM BIZTONSÁG

Ez a kényelmet szolgálja, nem a védelmet. Az F12-vel bárki kiszedheti a required attribútumot, vagy küldhet adatot az űrlap megkerülésével. Ezért egy valódi alkalmazásban a szerver mindig újra ellenőriz mindent. A HTML-ellenőrzés a normális felhasználót segíti — nem a rosszindulatút állítja meg.

JELÖLD A KÖTELEZŐ MEZŐKET

A required önmagában nem látszik az űrlapon. Írd oda a feliratba, hogy kötelező (csillaggal vagy szóval) — különben a látogató csak akkor tudja meg, amikor már hibát kapott.

9További attribútumok

AttribútumMit csinál?
readonlyNem szerkeszthető, de elküldődik. Például egy kiszámolt végösszeg.
disabledNem szerkeszthető, halvány, és nem is küldődik el. Például egy még nem elérhető opció.
autofocusBetöltéskor ide ugrik a kurzor. Oldalanként csak egy mezőn!
autocompleteon / off, vagy pontos érték (email, tel) — segíti a böngésző automatikus kitöltését.
stepSzámnál a léptetés mértéke. step="0.5" vagy step="any".
sizeA mező szélessége karakterben. Inkább CSS-sel állítsd.
readonly VAGY disabled?

A különbség egyetlen dolog: a readonly mező tartalma elmegy a szerverhez, a disabled mezőé nem. Ha az érték fontos, readonly kell.

10Egy teljes űrlap

Rakjuk össze, amit eddig tanultunk. Ez egy valósághű kapcsolatfelvételi űrlap — csak olyan elemekkel, amiket már ismersz.

Jelentkezési űrlap — töltsd ki és küldd el!
index.html
<h2>Jelentkezés a tanfolyamra</h2>

<form action="jelentkezes.php" method="post">

  <p>
    <label for="nev">Teljes név *</label><br>
    <input type="text" id="nev" name="nev"
           placeholder="Kovács Anna" required>
  </p>

  <p>
    <label for="email">E-mail cím *</label><br>
    <input type="email" id="email" name="email"
           placeholder="anna@example.com" required>
  </p>

  <p>
    <label for="tel">Telefonszám</label><br>
    <input type="tel" id="tel" name="telefon"
           placeholder="+36 30 123 4567">
  </p>

  <p>
    <label for="szul">Születési dátum *</label><br>
    <input type="date" id="szul" name="szuletes"
           required>
  </p>

  <p>
    <label for="letszam">Hány főre? *</label><br>
    <input type="number" id="letszam" name="letszam"
           value="1" min="1" max="5" required>
  </p>

  <p><small>A * -gal jelölt mezők kötelezők.</small></p>

  <button type="submit">Jelentkezem</button>
</form>
Eredmény — ez már egy éles űrlap
Töltsd ki és küldd el. Látni fogod az összes name=érték párt, amit egy valódi szerver megkapna. Figyeld meg a mintát: minden mezőnél label + id + name + megfelelő type — ez a négy dolog mindig együtt jár.
MÉG NEM SZÉP — ÉS EZ RENDBEN VAN

Az űrlap jelenleg csupasz: egymás alatt sorakozó mezők. A 17. leckétől (dobozmodell) és a 20. leckétől (Flexbox) megtanulod szépen elrendezni. Most a szerkezet a fontos: ha az jó, a megjelenés már csak stíluskérdés.

11Tipikus hibák

HibaMi történik, és mi a megoldás?
Hiányzó name A mező tartalma nem küldődik el, és semmi nem jelzi. Minden mezőnek adj nevet.
A for a name attribútumra mutat A for az id attribútumhoz kapcsolódik, nem a name attribútumhoz. Ha eltér a kettő, a label nem működik.
Ugyanaz az id több mezőn A label csak az elsőre kapcsolódik. Az id oldalanként egyedi.
placeholder label helyett Gépelés közben eltűnik a felirat. Legyen label is.
Jelszó method="get"-tel A jelszó bekerül a címsorba és az előzményekbe. Mindig POST.
disabled a readonly helyett A disabled mező tartalma nem megy el a szerverhez.
A mezők nincsenek <form>-on belül Megjelennek, de elküldeni nem lehet őket. A form a keret.
Egymásba ágyazott <form> Érvénytelen. Egy űrlap nem tehető egy másikba.

Önellenőrző kérdések

Előbb válaszolj magadban, csak utána nézd meg a megoldást.

1. A felhasználó kitölti a mezőt, elküldi az űrlapot, de az adat nem érkezik meg a szerverre. A mező látszik, gépelni lehet bele. Mi a legvalószínűbb ok?

Hiányzik a name attribútum. Ilyenkor a böngésző egyszerűen kihagyja a mezőt a küldésből — és nem jelez semmit.

2. Mi a különbség az id és a name között egy mezőn?

A name a szervernek szól: ez alatt a néven érkezik meg az adat. Az id az oldalon belüli azonosító: ehhez kapcsolódik a label for, és ezzel céloz meg a CSS is. Gyakran ugyanaz a két érték, de a szerepük különböző.

3. Bejelentkezési űrlapot készítesz. GET vagy POST, és miért?

POST. GET esetén a jelszó bekerülne a címsorba, onnan pedig a böngésző előzményeibe és a szerver naplóiba. (És ettől függetlenül HTTPS is kell — a POST önmagában nem titkosítás.)

4. Miért nem elég a placeholder felirat gyanánt?

Mert eltűnik, amint gépelni kezdenek — pont akkor, amikor ellenőrizni kellene, mit is kér a mező. Ezen kívül halvány (rossz kontraszt), nem kattintható, és a képernyőolvasók eltérően kezelik. A label mondja meg, mi a mező; a placeholder legfeljebb formátumpéldát ad.

5. Egy mező értékét látni szeretnéd, szerkeszteni nem, de el kell küldeni. readonly vagy disabled?

readonly. A disabled mező tartalma nem kerül elküldésre.

6. Kitetted a required attribútumot minden fontos mezőre. Elég ez ahhoz, hogy a szerverre biztosan jó adat érkezzen?

Nem. A böngésző ellenőrzése kényelmi funkció: F12-vel kiszedhető, vagy meg lehet kerülni az űrlapot. Egy valódi alkalmazásban a szerver minden adatot újra ellenőriz.

7. Miért jobb type="number", mint type="text" egy életkormezőnél?

Mert a böngésző ellenőrzi, hogy tényleg szám-e, megadható hozzá min és max, léptetőnyilakat kapsz — telefonon pedig számbillentyűzet jelenik meg a teljes ábécé helyett.

8. Elgépeled: type="emial". Mi történik?

Semmi látványos: sima szövegmező lesz belőle, hibaüzenet nélkül. Csak az e-mail-ellenőrzés és a kényelmi funkciók maradnak el — ezért csalóka ez a hiba.

12Összefoglalás

  1. Az űrlap az egyetlen mód, ahogy a látogató adatot küldhet. A HTML a kitöltésért és a küldésért felel, a feldolgozás szerveroldali feladat.
  2. <form action="..." method="..."> — hova és hogyan menjen az adat.
  3. GET: a címsorban, kereséshez · POST: a kérés törzsében, minden máshoz. Jelszó soha GET-tel.
  4. A POST nem titkosítás — a biztonságot a https:// adja.
  5. Az adat név–érték párokból áll. name nélkül a mező nem küldődik el.
  6. name = a szervernek · id = az oldalon belül (label, CSS).
  7. Minden mezőnek jár <label for="...">, ami a mező id attribútumára mutat.
  8. A type nem csak kinézet: ellenőrzést és telefonos billentyűzetet is hoz. Ismeretlen típusból szövegmező lesz.
  9. A placeholder nem label — formátumpéldát ad, nem feliratot.
  10. required, min/max, maxlength: ingyen ellenőrzés a böngészőtől — de ez nem biztonság.
  11. readonly elküldődik, disabled nem.
  12. A visszatérő minta minden mezőnél: label + id + name + megfelelő type.