Formalar

Saytga kirish, ro'yxatdan o'tish, qidiruv, buyurtma berish, so'rovnoma — foydalanuvchi saytga biror narsa «aytishi» kerak bo'lgan hamma joyda forma bor. Bu darsda forma elementlarini birma-bir ko'rib chiqamiz va oxirida to'liq ro'yxatdan o'tish formasini yasaymiz.

Bu darsda

  • <form>, <input> va <label> — va nega yozuv shunchalik muhim
  • Kiritish maydonlarining turlari: matn, email, parol, son, sana va boshqalar
  • name va value: forma yuborilganda aslida nima ketadi
  • Radio tugmalar, belgilash katakchalari, ochiladigan ro'yxat va katta matn maydoni
  • Tugma turlari: yuborish, tozalash va oddiy tugma
  • Brauzerning o'zi tekshirishi: required, minlength, min/max, pattern
  • To'liq forma va ma'lumot serverga qanday borishi

Forma nima?

Forma (inglizcha form) — foydalanuvchi ma'lumot kiritadigan maydonlar va ularni yuboradigan tugmadan iborat sahifa qismi. HTML'da u <form> tegi bilan o'raladi.

Bankdagi yoki pochtadagi qog'oz anketani eslang: «Ism: ______», «Telefon: ______», kerakli katakchaga belgi, oxirida — imzo va topshirish. Veb-forma ham xuddi shunday: maydon yozuvlari, kiritish joylari, katakchalar va «Yuborish» tugmasi.

Eng oddiy forma — qidiruv:

<form>
  <label for="soz">Qidiruv:</label>
  <input type="text" id="soz" name="soz">
  <button type="submit">Izlash</button>
</form>

Maydonga biror so'z yozib, Izlash tugmasini (yoki Enter) bosing. Konsolda Forma yuborildi: soz = … degan yozuv chiqadi — bu forma serverga aynan nima yuborishi. Haqiqiy saytda bu ma'lumot serverga ketadi va u javob qaytaradi. Darsdagi muharrir esa uni ushlab qolib, konsolga ko'rsatadi.

input va label

<input> — kiritish maydoni. Bu bo'sh element: yopuvchi tegi yo'q. Uning qanday maydon bo'lishini type atributi belgilaydi (pastda batafsil).

<label> — maydonning yozuvi yoki yorlig'i (inglizcha label — «yorliq»): «Ism», «Parol» kabi. Yozuv maydonga ikki usulda bog'lanadi:

  1. for va id orqali: <label for="ism"> va <input id="ism"> — for ichidagi nom maydonning id si bilan aynan bir xil.
  2. Maydonni yozuv ichiga olib: <label>Ism: <input></label>.
<p>
  <label for="ism">Ismingiz:</label>
  <input type="text" id="ism" name="ism">
</p>
<p>
  Familiyangiz: <input type="text" name="familiya">
</p>
<p>
  <label>
    <input type="checkbox" name="obuna"> Yangiliklarga obuna bo'lish
  </label>
</p>

Sinab ko'ring: «Ismingiz:» so'zini bosing — kursor maydonga o'tadi. «Familiyangiz:» ni bossangiz, hech narsa bo'lmaydi: bu shunchaki matn, maydonga bog'lanmagan. Uchinchi qatordagi yozuvni bosish esa katakchani belgilaydi — kichkina katakchani nishonga olishdan ancha qulay.

Nega yozuv bunchalik muhim?

for va id dagi nomlar harfma-harf bir xil bo'lsin (katta-kichik harf ham). id esa sahifada takrorlanmasin: ikkita maydonga bir xil id bersangiz, yozuv faqat birinchisiga bog'lanadi.

Kiritish maydonlari turlari

type atributining qiymatiga qarab, <input> butunlay boshqacha ko'rinadi va ishlaydi:

typeNima uchunXususiyati
textOddiy matn: ism, shaharOdatiy tur — type yozilmasa, shu bo'ladi
emailElektron pochtaYuborishda @ bor-yo'qligini tekshiradi; telefonda klaviaturada @ chiqadi
passwordParolYozilgan belgilar nuqtalar bilan yashiriladi
numberSon: yosh, miqdorFaqat son qabul qiladi, yonida oshirish/kamaytirish strelkalari
telTelefon raqamiTelefonda raqamli klaviatura ochiladi
dateSanaKalendar ochiladi
checkboxBelgilash katakchasi: «roziman», bir nechta tanlovHar biri alohida yoqiladi va o'chiriladi
radioBir nechtadan bittasini tanlashBir xil name li guruhda faqat bittasi tanlanadi
rangeTaxminiy qiymat: ovoz balandligi, bahoSurgich: chapga-o'ngga suriladi
colorRang tanlashRang palitrasi ochiladi
fileFayl yuklash: rasm, hujjatKompyuterdan fayl tanlash oynasi
<p><label for="t1">Ism (text):</label>
   <input type="text" id="t1" placeholder="Masalan, Aziz"></p>
<p><label for="t2">Email (email):</label>
   <input type="email" id="t2" placeholder="aziz@example.com"></p>
<p><label for="t3">Parol (password):</label>
   <input type="password" id="t3" value="maxfiy123"></p>
<p><label for="t4">Yosh (number):</label>
   <input type="number" id="t4" value="18"></p>
<p><label for="t5">Tug'ilgan kun (date):</label>
   <input type="date" id="t5"></p>
<p><label for="t6">Ovoz balandligi (range):</label>
   <input type="range" id="t6" min="0" max="10"></p>
<p><label for="t7">Sevimli rang (color):</label>
   <input type="color" id="t7" value="#1f4fa8"></p>
<p><label for="t8">Rasm (file):</label>
   <input type="file" id="t8"></p>
<p><input type="checkbox" id="t9">
   <label for="t9">Shartlarga roziman (checkbox)</label></p>

Har bir maydon bilan o'ynab ko'ring: sanani tanlang, surgichni suring, rangni almashtiring. Parol maydonida value="maxfiy123" yozilgan bo'lsa ham, ekranda faqat nuqtalar ko'rinadi.

Sana, rang va fayl maydonlarining ko'rinishi har bir brauzerda va telefonda biroz farq qiladi — ularni brauzerning o'zi chizadi. Bu normal holat.

name, value va placeholder

Forma yuborilganda har bir maydondan bitta juftlik ketadi: name = qiymat. name — server bu ma'lumotni qaysi nom bilan oladi (xuddi anketadagi «Ism:» so'zi kabi). name siz maydon umuman yuborilmaydi!

<form>
  <label for="ism">Ism:</label>
  <input type="text" id="ism" name="ism" value="Ali">

  <label for="yosh">Yosh:</label>
  <input type="number" id="yosh" name="yosh" value="20">

  <label for="shahar">Shahar:</label>
  <input type="text" id="shahar" value="Toshkent">  <!-- name yo'q! -->

  <button type="submit">Yuborish</button>
</form>

Yuborish ni bosing: konsolda ism = Ali, yosh = 20 chiqadi, shahar esa yo'q. Endi shahar maydoniga name="shahar" qo'shib, qayta yuboring.

placeholder yozuvning (label) o'rnini bosmaydi. Foydalanuvchi yozishni boshlagach, namuna yo'qoladi va u bu maydon nima uchun ekanini unutishi mumkin. Har bir maydonda label bo'lsin, placeholder esa faqat qo'shimcha maslahat uchun.

Tanlash maydonlari

Radio tugmalar va belgilash katakchalari

<form>
  <p>Qachon o'qishni xohlaysiz?</p>
  <input type="radio" id="ertalab" name="vaqt" value="ertalab" checked>
  <label for="ertalab">Ertalab</label>
  <input type="radio" id="kechqurun" name="vaqt" value="kechqurun">
  <label for="kechqurun">Kechqurun</label>
  <input type="radio" id="dam" name="vaqt" value="dam-olish">
  <label for="dam">Dam olish kunlari</label>

  <p>Qaysi tillarni bilasiz?</p>
  <input type="checkbox" id="uz" name="til" value="uz" checked>
  <label for="uz">O'zbek</label>
  <input type="checkbox" id="ru" name="til" value="ru">
  <label for="ru">Rus</label>
  <input type="checkbox" id="en" name="til" value="en">
  <label for="en">Ingliz</label>

  <p><button type="submit">Yuborish</button></p>
</form>

Bir nechta katakchani belgilab yuboring: konsolda har bir tanlangan katakcha uchun alohida til = … chiqadi. Tanlanmagan katakchalar yuborilmaydi. Radio tugmalardan esa doim faqat bittasi ketadi.

Tajriba: radio tugmalardan biriga boshqa name bering (masalan, name="vaqt2"). Endi ikkita variantni bir vaqtda tanlash mumkin bo'lib qoladi — guruh buzildi. Radio tugmalarni aynan bir xil name birlashtiradi.

Ochiladigan ro'yxat: select

Variantlar ko'p bo'lsa (viloyatlar, oylar), ularni ochiladigan ro'yxatga joylash qulay: <select> ichida har bir variant — <option>. Yuborilganda tanlangan variantning value si ketadi, foydalanuvchi esa teglar orasidagi matnni ko'radi.

Katta matn maydoni: textarea

Bir necha qatorli matn — izoh, xabar, manzil — uchun <textarea>. U bo'sh element emas: yopuvchi tegi bor, teglar orasidagi matn esa boshlang'ich qiymat bo'ladi. rows — ko'rinadigan qatorlar soni.

<form>
  <p>
    <label for="viloyat">Viloyat:</label>
    <select id="viloyat" name="viloyat">
      <option value="">— Tanlang —</option>
      <option value="toshkent">Toshkent</option>
      <option value="samarqand" selected>Samarqand</option>
      <option value="buxoro">Buxoro</option>
      <option value="fargona">Farg'ona</option>
    </select>
  </p>
  <p>
    <label for="xabar">Xabaringiz:</label><br>
    <textarea id="xabar" name="xabar" rows="4" cols="40"></textarea>
  </p>
  <button type="submit">Yuborish</button>
</form>

selected atributi variantni oldindan tanlab qo'yadi (radio'dagi checked kabi). Birinchi variant value="" — «hali tanlanmagan» holati uchun qulay usul.

<textarea></textarea> ni bitta qatorda, oralig'ida bo'sh joysiz yozing. Ular orasidagi har bir bo'sh joy va yangi qator maydonga matn bo'lib tushadi — textarea bo'sh joylarni saqlaydi.

Tugmalar

<button> ning uch turi bor:

typeBosilganda nima bo'ladi
submitFormani yuboradi. Forma ichidagi tugmada type yozilmasa, u shu tur bo'ladi
resetBarcha maydonlarni boshlang'ich holatiga qaytaradi
buttonHech narsa — o'zi hech narsa qilmaydi. JavaScript bilan «jonlantiriladigan» tugmalar uchun
<form>
  <label for="ism2">Ism:</label>
  <input type="text" id="ism2" name="ism" value="Ali">
  <button type="submit">Yuborish</button>
  <button type="reset">Tozalash</button>
  <button type="button">Oddiy tugma</button>
</form>

Ismni o'zgartiring va Tozalash ni bosing: maydon bo'shamaydi, balki Ali ga qaytadi — chunki «boshlang'ich holat» value da yozilgan. Oddiy tugma hech narsa qilmaydi — unga vazifani 17-darsda JavaScript bilan beramiz.

Ko'p uchraydigan xato: forma ichiga JavaScript uchun tugma qo'yib, type="button" yozishni unutish. Bunday tugma bosilganda forma yuborilib, sahifa yangilanib ketadi. Forma ichidagi har bir tugmaga type ni aniq yozishni odat qiling.

Brauzerning o'zi tekshiradi

Foydalanuvchi maydonni to'ldirmay yoki noto'g'ri to'ldirib yuborishi mumkin. Brauzer buni atributlar yordamida o'zi tekshira oladi — bu validatsiya (inglizcha validation, «tekshirish») deyiladi:

AtributTalab
requiredMaydon bo'sh bo'lmasin (majburiy). Qiymati yo'q, atributning o'zi yetarli
minlength / maxlengthMatnning eng kam / eng ko'p uzunligi: minlength="6"
min / maxSon yoki sananing chegaralari: min="7" max="100"
type="email"Matn email ko'rinishida bo'lsin (@ bilan)
patternMatn berilgan «qolip»ga mos kelsin: pattern="[0-9]{9}" — aynan 9 ta raqam
<form>
  <p><label for="email">Email (majburiy):</label><br>
     <input type="email" id="email" name="email" required></p>

  <p><label for="parol">Parol (kamida 6 belgi):</label><br>
     <input type="password" id="parol" name="parol" required minlength="6"></p>

  <p><label for="yosh2">Yosh (7 dan 100 gacha):</label><br>
     <input type="number" id="yosh2" name="yosh" min="7" max="100"></p>

  <p><label for="tel">Telefon (9 ta raqam):</label><br>
     +998 <input type="tel" id="tel" name="tel" pattern="[0-9]{9}" placeholder="901234567"></p>

  <button type="submit">Yuborish</button>
</form>

Hech narsa yozmasdan Yuborish ni bosing — brauzer birinchi bo'sh majburiy maydonni ko'rsatib, ogohlantiradi va forma yuborilmaydi (konsol bo'sh qoladi). Emailga aziz deb yozing, parolga 3 ta belgi, yoshga 150 — har safar brauzer to'xtatadi. Hammasi to'g'ri bo'lgandagina konsolda «Forma yuborildi» chiqadi.

pattern ichidagi yozuv — muntazam ifoda (inglizcha regular expression): [0-9] — «bitta raqam», {9} — «9 marta». Bu alohida katta mavzu. Hozircha shu misolni bilish yetarli.

Brauzer tekshiruvi — foydalanuvchiga qulaylik, lekin himoya emas. Har kim DevTools orqali required ni o'chirib tashlashi mumkin. Shuning uchun haqiqiy saytda server ham ma'lumotni albatta qayta tekshiradi.

Maydonlarni guruhlash: fieldset va legend

Uzun formani mantiqiy qismlarga bo'lish mumkin: <fieldset> bir guruh maydonni ramkaga oladi, <legend> esa shu guruhning sarlavhasi. Ekran o'quvchilar guruh nomini ham o'qiydi — ayniqsa radio tugmalar guruhi uchun foydali.

To'liq misol: kursga ro'yxatdan o'tish

Endi o'rganganlarimizning hammasini bitta formaga yig'amiz. Bir oz CSS ham qo'shdik — chiroyliroq ko'rinishi uchun:

<style>
  body { font-family: sans-serif; }
  fieldset { margin-bottom: 12px; border-radius: 8px; }
  input, select, textarea, button { font: inherit; }
</style>

<form>
  <h2>Kursga ro'yxatdan o'tish</h2>

  <fieldset>
    <legend>Shaxsiy ma'lumotlar</legend>
    <p><label for="r-ism">Ism:</label>
       <input type="text" id="r-ism" name="ism" required minlength="2"></p>
    <p><label for="r-email">Email:</label>
       <input type="email" id="r-email" name="email" required></p>
    <p><label for="r-sana">Tug'ilgan sana:</label>
       <input type="date" id="r-sana" name="sana"></p>
  </fieldset>

  <fieldset>
    <legend>Kurs</legend>
    <p><label for="r-kurs">Yo'nalish:</label>
       <select id="r-kurs" name="kurs" required>
         <option value="">— Tanlang —</option>
         <option value="veb">Veb-dasturlash</option>
         <option value="python">Python</option>
         <option value="dizayn">Dizayn</option>
       </select></p>
    <p>Vaqt:
       <input type="radio" id="r-ert" name="vaqt" value="ertalab" checked>
       <label for="r-ert">Ertalab</label>
       <input type="radio" id="r-kech" name="vaqt" value="kechqurun">
       <label for="r-kech">Kechqurun</label></p>
    <p><label for="r-izoh">Qo'shimcha izoh:</label><br>
       <textarea id="r-izoh" name="izoh" rows="3" cols="40"></textarea></p>
  </fieldset>

  <p><input type="checkbox" id="r-rozi" name="rozi" value="ha" required>
     <label for="r-rozi">Qoidalarga roziman</label></p>
  <button type="submit">Ro'yxatdan o'tish</button>
  <button type="reset">Tozalash</button>
</form>

Formani to'ldirib yuboring va konsolda nimalar ketganini ko'ring. E'tibor bering: majburiy bo'lmagan bo'sh maydonlar ham yuboriladi — bo'sh qiymat bilan (sana = ). Majburiy maydonlardan birini bo'sh qoldirib ham sinab ko'ring.

Ma'lumot qayerga ketadi?

Haqiqiy saytda formaga yana ikki atribut yoziladi:

<form action="/royxatdan-otish" method="post">
  …
</form>

Qiziq misol: Google'ning qidiruv sahifasi ham oddiy forma — uning qidiruv maydonining name i q. Shuning uchun mana bu kichik forma haqiqatan ishlaydi:

<form action="https://www.google.com/search" method="get">
  <label for="q">Google'da qidirish:</label>
  <input type="search" id="q" name="q">
  <button type="submit">Izlash</button>
</form>

Uni VS Code'da faylga saqlab, brauzerda oching va biror so'z qidiring — manzil satrida ?q=… qismini ko'rasiz. (Darsdagi muharrir formalarni ushlab qoladi, shuning uchun bu misolni kompyuteringizda sinang.)

Kelgan ma'lumotni qabul qilib, saqlaydigan va javob qaytaradigan dastur — backend — serverda ishlaydi va Python (Django, Flask), JavaScript (Node.js) kabi tillarda yoziladi. Bu kursda biz frontend bilan ishlaymiz: 17-darsda forma ma'lumotlarini JavaScript bilan brauzerning o'zida qayta ishlashni o'rganamiz.

Mashqlar

1-mashq Saytga kirish formasi

Kirish formasi bor, lekin u noqulay va noto'g'ri yozilgan. Uni tuzating:

  1. Email maydonining turini email qiling va uni majburiy (required) qiling.
  2. Parol maydonining turini password qiling.
  3. Ikkala maydonga id bering va «Email:», «Parol:» matnlarini <label for="…"> bilan maydonlarga bog'lang.
<h2>Saytga kirish</h2>
<form>
  <p>Email: <input type="text" name="email"></p>
  <p>Parol: <input type="text" name="parol"></p>
  <button type="submit">Kirish</button>
</form>
Ishora

Har bir qator shunday ko'rinishga keladi: <label for="email">Email:</label> <input type="email" id="email" name="email" required>. for va id bir xil bo'lsin.

Yechimni ko'rish
<h2>Saytga kirish</h2>
<form>
  <p>
    <label for="email">Email:</label>
    <input type="email" id="email" name="email" required>
  </p>
  <p>
    <label for="parol">Parol:</label>
    <input type="password" id="parol" name="parol">
  </p>
  <button type="submit">Kirish</button>
</form>

2-mashq Fikr-mulohaza formasi

Izohlardagi ko'rsatmalar bo'yicha formani to'ldiring:

  1. «Darsga baho» yozuvi va kamida 3 ta variantli ochiladigan ro'yxat (select).
  2. «Fikringiz» yozuvi va textarea.
  3. Yuborish tugmasi.

Har ikki maydonda name bo'lsin va ular yozuvlarga bog'lansin. Tayyor bo'lgach, formani yuborib, konsolni tekshiring.

<h2>Fikr-mulohaza</h2>
<form>
  <!-- 1. "Darsga baho" yozuvi va select -->

  <!-- 2. "Fikringiz" yozuvi va textarea -->

  <!-- 3. Yuborish tugmasi -->

</form>
Ishora

Select: <select id="baho" name="baho"><option value="5">A'lo</option>…</select>. Unga yozuv: <label for="baho">Darsga baho:</label>. Textarea ham xuddi shunday bog'lanadi.

Yechimni ko'rish
<h2>Fikr-mulohaza</h2>
<form>
  <p>
    <label for="baho">Darsga baho:</label>
    <select id="baho" name="baho">
      <option value="5">A'lo</option>
      <option value="4">Yaxshi</option>
      <option value="3">O'rtacha</option>
    </select>
  </p>
  <p>
    <label for="fikr">Fikringiz:</label><br>
    <textarea id="fikr" name="fikr" rows="4" cols="40"></textarea>
  </p>
  <button type="submit">Yuborish</button>
</form>

3-mashq Radio guruhini tuzating

Bu formada uchala variantni bir vaqtda tanlash mumkin — xato! Faqat bitta kurs tanlanadigan qiling: uchala radio tugmaga bir xil name="kurs" bering, har biriga har xil value (html, css, js) yozing va har bir variant matnini label ga oling.

<form>
  <p>Qaysi kursni tanlaysiz?</p>
  <input type="radio" name="html"> HTML
  <input type="radio" name="css"> CSS
  <input type="radio" name="js"> JavaScript
  <p><button type="submit">Yuborish</button></p>
</form>
Ishora

Eng qisqa usul — radio tugmani yozuv ichiga olish: <label><input type="radio" name="kurs" value="html"> HTML</label>. Yuborganingizda konsolda kurs = html kabi yozuv chiqishi kerak.

Yechimni ko'rish
<form>
  <p>Qaysi kursni tanlaysiz?</p>
  <label><input type="radio" name="kurs" value="html"> HTML</label>
  <label><input type="radio" name="kurs" value="css"> CSS</label>
  <label><input type="radio" name="kurs" value="js"> JavaScript</label>
  <p><button type="submit">Yuborish</button></p>
</form>

O'zingizni sinang

<label> kiritish maydoniga qanday bog'lanadi?

  1. Yozuvning name i maydonning name i bilan bir xil bo'ladi
  2. Yozuv maydondan oldin tursa, o'zi bog'lanadi
  3. Yozuvning for atributi maydonning id si bilan bir xil bo'ladi
  4. Yozuvga required yoziladi

To'g'ri. Yoki maydonni yozuvning ichiga olish ham mumkin: <label>Ism <input></label>.

Foydalanuvchi bir nechta variantdan faqat bittasini tanlashi kerak. Nima ishlatiladi?

  1. Bir xil name li radio tugmalar
  2. Har xil name li radio tugmalar
  3. Belgilash katakchalari (checkbox)
  4. <textarea>

To'g'ri. Radio tugmalarni bitta guruhga aynan bir xil name birlashtiradi. (Variantlar ko'p bo'lsa, <select> ham to'g'ri keladi.)

Qaysi atribut bo'lmasa, maydon forma bilan birga umuman yuborilmaydi?

  1. id
  2. name
  3. placeholder
  4. required

To'g'ri. Yuboriladigan juftlik — name = qiymat. Nom bo'lmasa, server ma'lumotni qanday atashni bilmaydi.

required atributi nima qiladi?

  1. Maydonni qizil rangga bo'yaydi
  2. Maydonga avtomatik qiymat yozadi
  3. Saytni xakerlardan himoya qiladi
  4. Maydon bo'sh bo'lsa, brauzer formani yubormaydi va ogohlantiradi

To'g'ri. Lekin bu faqat qulaylik: server ma'lumotni baribir o'zi ham tekshirishi kerak.

Forma ichidagi <button>Saqlash</button> (type yozilmagan) bosilsa, nima bo'ladi?

  1. Hech narsa bo'lmaydi
  2. Forma yuboriladi
  3. Maydonlar tozalanadi
  4. Xato chiqadi

To'g'ri. Forma ichidagi tugmaning odatiy turi — submit. Hech narsa qilmaydigan tugma uchun type="button" yozing.

Xulosa

  • <form> maydonlar va tugmalarni o'raydi; yuborilganda har bir maydondan name = qiymat juftligi ketadi.
  • Har bir maydonning yozuvi bo'lsin: <label for="x"> + <input id="x">. placeholder yozuvning o'rnini bosmaydi.
  • type maydon turini belgilaydi: text, email, password, number, date, checkbox, radio, range, color, file.
  • Radio tugmalar bir xil name bilan guruhlanadi; select + option — ochiladigan ro'yxat; textarea — ko'p qatorli matn.
  • Tugmalar: submit (odatiy), reset, button.
  • required, minlength, min/max, pattern — brauzer tekshiruvi. Server ham albatta tekshiradi.
  • fieldset + legend — maydonlarni guruhlash; action va method — ma'lumot qayerga va qanday yuborilishi.