05 β Formalar¶
β¬ οΈ Oldingi: 04 β Jadvallar Β· π README Β· Keyingi: 06 β Semantik HTML va accessibility β‘οΈ
Bu bobda: foydalanuvchidan ma'lumot olishni o'rganamiz β
formelementi, barchainputturlari va brauzer ichidagi validatsiya (tekshiruv).
Hozirgacha biz sahifaga matn, rasm, havola chiqarib bera oldik. Lekin internet faqat o'qish uchun emas β biz unga ma'lumot kiritamiz ham: login qilamiz, izoh yozamiz, qidiramiz, buyurtma beramiz. Bularning hammasi orqasida forma (form) turadi.
Formani oddiy hayotdagi anketa qog'oziga o'xshating: bir nechta katakcha (maydon), har birining yonida nima yozish kerakligini aytuvchi yozuv (yorliq), va oxirida "Topshirish" tugmasi. Foydalanuvchi to'ldiradi, tugmani bosadi β va qog'oz birovga (serverga) yetkaziladi. Mana shu bob aynan shu jarayonni HTML'da qanday yasashni o'rgatadi.
π Bu bobda biz asosan HTML tomonini o'rganamiz: maydonlarni qanday yasash va brauzer ularni qanday tekshiradi. Ma'lumotni serverda qabul qilish va saqlash (PHP, JS) keyingi qo'llanmalar mavzusi β lekin "nega" tushunarli bo'lishi uchun server tomonida nima bo'lishini ham qisqacha izohlaymiz.
5.1 form elementi β hamma narsaning idishi¶
Har qanday ma'lumot kiritish maydoni <form> ichida turishi kerak. form β bu maydonlarni bir guruhga birlashtiruvchi va ularni qayerga yuborishni biluvchi idish.
<form action="/royxatdan-otish" method="post">
<input type="text" name="ism">
<button type="submit">Jo'natish</button>
</form>
Bu yerda ikkita eng muhim atribut bor: action va method.
action β ma'lumot QAYERGA boradi¶
action β bu manzil (URL): foydalanuvchi tugmani bosganda, to'ldirilgan ma'lumot aynan shu manzilga jo'natiladi.
<form action="/login"> <!-- shu sayt ichidagi /login manziliga -->
<form action="https://misol.uz/saqlash"> <!-- to'liq manzil -->
<form action=""> <!-- bo'sh bo'lsa: shu sahifaning o'ziga qaytadi -->
π‘ Hozircha bizda haqiqiy server yo'q β shuning uchun tugmani bosganingizda "sahifa topilmadi" chiqishi normal. Muhimi β mexanizmni tushunish.
method β ma'lumot QANDAY boradi: GET vs POST¶
method so'rovning turini belgilaydi. Ikkita asosiy qiymat bor va ular orasidagi farq juda muhim:
method="get" |
method="post" |
|
|---|---|---|
| Ma'lumot qayerda ketadi | URL'ga qo'shiladi: ?ism=Ali&shahar=Toshkent |
So'rov tanasida (body) yashirin |
| URL'da ko'rinadimi | Ha, manzil qatorida ko'rinadi | Yo'q |
| Xatcho'p qilsa bo'ladimi | Ha (qidiruv natijasi kabi) | Yo'q |
| Maxfiy ma'lumot uchun | β Yaramaydi (parol URL'da ko'rinadi!) | β To'g'ri |
| Qachon ishlatiladi | O'qish/qidirish (hech narsa o'zgartirmaydi) | Yozish/o'zgartirish (ma'lumot saqlash) |
Oddiy qoida:
- Faqat ma'lumot olib kelyapsizmi (qidiruv, filtrlash)? β get.
- Ma'lumot saqlayapsizmi/o'zgartiryapsizmi (ro'yxatdan o'tish, izoh qo'shish, parol)? β post.
<!-- Qidiruv: get to'g'ri, chunki natijani xatcho'p qilsa bo'ladi -->
<form action="/qidiruv" method="get">
<input type="search" name="q">
<button>Qidirish</button>
</form>
<!-- Tugma bosilgach manzil: /qidiruv?q=telefon -->
<!-- Login: post to'g'ri, chunki parol URL'da ko'rinmasligi kerak -->
<form action="/login" method="post">
<input type="password" name="parol">
<button>Kirish</button>
</form>
β οΈ Eng katta xato: parol yoki shaxsiy ma'lumotni get bilan yuborish. U holda parol manzil qatorida (/login?parol=12345) ochiq ko'rinadi, brauzer tarixiga yoziladi va xavfsiz emas. Maxfiy narsa uchun doim post.
π method yozilmasa, brauzer get deb hisoblaydi.
5.2 Forma jo'natilganda nima bo'ladi? (umumiy oqim)¶
"Jo'natish" tugmasi bosilganda quyidagilar ketma-ket yuz beradi:
- Brauzer har bir maydonni
name=valueko'rinishidagi juftlikka aylantiradi (ism=Ali,email=ali@mail.uz). - Brauzer (agar validatsiya o'tib bo'lsa) bu juftlarni
actionmanziliga,methodturida jo'natadi. - Server kelgan
name=valuejuftlarini o'qiydi, qayta ishlaydi (saqlaydi, tekshiradi) va javob qaytaradi.
Bu yerda eng asosiy tushuncha β name. Server maydonni nomi orqali tanib oladi. Buni keyingi bo'limda batafsil ko'ramiz.
5.3 name va value β server ma'lumotni qanday "ko'radi"¶
Brauzer uchun maydon β bu ekrandagi quti. Lekin server uchun maydon β bu shunchaki bitta name=value juftligi. Ekranda nima yozilgani serverga ko'rinmaydi; serverga faqat shu juftlik boradi.
<form action="/saqlash" method="post">
<input type="text" name="ism" value="Ali">
<input type="email" name="email">
</form>
nameβ maydonning kaliti (key). Server ma'lumotni shu nom orqali oladi.namebo'lmasa, maydon umuman jo'natilmaydi!valueβ maydonning qiymati.valueatributi boshlang'ich qiymatni belgilaydi; foydalanuvchi yozsa, value uning yozgani bo'ladi.
Agar foydalanuvchi ism maydoniga Olim deb yozsa, serverga shu boradi:
π‘ Serverda (masalan PHP'da) bu $_POST['ism'] orqali olinadi β ya'ni name qiymati bilan. Shuning uchun namelarni mazmunli va ingliz/lotin harflarda, bo'shliqsiz yozing: name="ism", name="email", name="phone_number".
β οΈ Eng ko'p uchraydigan boshlovchi xatosi: chiroyli forma yasab, lekin name atributini unutib qo'yish. Tashqaridan hammasi joyida ko'rinadi, lekin serverga hech narsa kelmaydi, chunki nomsiz maydon yuborilmaydi.
5.4 label β maydonning yorlig'i (va nega u shart)¶
label β bu maydon nima uchun ekanini tushuntiruvchi yozuv ("Ism", "Email", "Parol"). Uni input bilan bog'lash kerak:
Bog'lashning ikki usuli bor:
1-usul β for va id orqali (tavsiya etiladi):
labelning for qiymati input'ning id qiymatiga aynan teng bo'lishi kerak β shunda ular bog'lanadi.
2-usul β input'ni label ichiga o'rash:
Nega label muhim? (uchta sabab)¶
- Bosish maydoni kattalashadi β foydalanuvchi yorliq matniga bossa ham, maydon aktivlashadi (fokuslanadi). Mobil telefonda kichkina checkbox'ni topish o'rniga, uzun matnga bosish ancha qulay.
- Accessibility (qulaylik) β ko'zi ojiz foydalanuvchilar skrin-reader (ekranni o'quvchi dastur) ishlatadi. U bog'langan
labelni o'qib, "Email manzilingiz, matn maydoni" deb aytadi. Bog'lanmagan maydon esa "nomsiz maydon" bo'lib qoladi. - Tushunarlilik β yorliqsiz forma jumboq kabi: foydalanuvchi har bir katakka nima yozishni bilmaydi.
π Qoida: har bir maydonning bog'langan labeli bo'lsin. Bu professional formaning birinchi belgisi.
5.5 input turlari β type atributi¶
input β formaning eng asosiy elementi. Uning ko'rinishi va xulqi type atributiga bog'liq. To'g'ri type tanlash β ham qulaylik, ham bepul validatsiya beradi.
Matn kiritish turlari¶
<label for="ism">Ism</label>
<input type="text" id="ism" name="ism">
<label for="parol">Parol</label>
<input type="password" id="parol" name="parol">
<label for="email">Email</label>
<input type="email" id="email" name="email">
<label for="sayt">Veb-sayt</label>
<input type="url" id="sayt" name="sayt">
<label for="tel">Telefon</label>
<input type="tel" id="tel" name="tel">
<label for="qidiruv">Qidirish</label>
<input type="search" id="qidiruv" name="q">
textβ oddiy bir qatorli matn. Eng universal tur.passwordβ yozilgan belgilar nuqtalar bilan yashiriladi (β’β’β’β’), boshqalar yelka ortidan ko'rmasligi uchun. β οΈ Bu faqat ekranda yashiradi β internetda xavfsiz uzatish uchun HTTPS kerak (bu boshqa mavzu).emailβ brauzer@belgisi borligini avtomatik tekshiradi. Mobil telefonda klaviaturada@tugmasi chiqadi.urlβ to'liq manzil (https://...) formatini tekshiradi.telβ telefon raqami. Brauzer formatni tekshirmaydi (chunki har davlatda har xil), lekin mobilda raqamli klaviatura ochiladi.searchβ qidiruv maydoni. Odatda yumaloq chetli va ichida "tozalash" (Γ) tugmasi bilan keladi.
π‘ Nega aniq type? type="email" yozsangiz, mobil foydalanuvchi avtomatik @ belgili klaviatura oladi va brauzer formatni tekshiradi β hammasi bepul, hech qanday kod yozmasdan. Hammasini text qilib qo'ysangiz, bu imkoniyatlarni yo'qotasiz.
Raqam, sana va diapazon turlari¶
<label for="yosh">Yoshingiz</label>
<input type="number" id="yosh" name="yosh" min="0" max="120">
<label for="tugilgan">Tug'ilgan sana</label>
<input type="date" id="tugilgan" name="tugilgan">
<label for="ovoz">Ovoz balandligi</label>
<input type="range" id="ovoz" name="ovoz" min="0" max="100" value="50">
<label for="rang">Sevimli rang</label>
<input type="color" id="rang" name="rang">
numberβ faqat raqam. Yonida β²βΌ strelkalar chiqadi,min/maxbilan chegaralanadi.dateβ sana tanlash. Brauzer kalendar (taqvim) ochib beradi β qo'lda yozish shart emas.rangeβ surgich (slider). Aniq raqam muhim bo'lmaganda, "kamβko'p" tanlash uchun (ovoz, yorqinlik).colorβ rang tanlovchi panel ochadi, natija#rrggbbko'rinishida keladi.
π Yana bor: type="datetime-local" (sana + vaqt), type="time" (faqat vaqt), type="month", type="week". Ularning hammasi shu mantiqda ishlaydi.
Tanlov turlari: checkbox va radio¶
Bu ikkalasi orasidagi farq boshlovchilarni eng ko'p chalg'itadi:
<!-- checkbox: bir nechtasini belgilash mumkin -->
<p>Qaysi tillarni bilasiz?</p>
<label><input type="checkbox" name="tillar[]" value="php"> PHP</label>
<label><input type="checkbox" name="tillar[]" value="js"> JavaScript</label>
<label><input type="checkbox" name="tillar[]" value="py"> Python</label>
<!-- radio: faqat BITTASINI tanlash mumkin -->
<p>Jinsingiz:</p>
<label><input type="radio" name="jins" value="erkak"> Erkak</label>
<label><input type="radio" name="jins" value="ayol"> Ayol</label>
checkboxβ har biri mustaqil: 0 ta, 1 ta yoki hammasi belgilanishi mumkin. "Hammasidan birortasini" tanlash kabi.radioβ bir guruhdan faqat bittasi. Sirning kaliti: bir guruhdagi radio'larningname'i bir xil bo'lishi shart (name="jins"). Brauzer bir xilname'li radio'larni guruh deb biladi va faqat bittasiga ruxsat beradi.
π‘ Radio'da value shart. Server qaysi tanlanganini bilishi uchun har bir radio'da boshqacha value bo'lishi kerak (value="erkak", value="ayol"). Tanlangan radio'ning value'si jo'natiladi.
π Birortasini avval belgilangan qilib qo'yish uchun checked atributini qo'shing:
Maxsus turlar: file va hidden¶
<!-- file: foydalanuvchi kompyuteridan fayl tanlaydi -->
<label for="rasm">Rasm yuklang</label>
<input type="file" id="rasm" name="rasm" accept="image/*">
<!-- hidden: ko'rinmaydi, lekin serverga jo'natiladi -->
<input type="hidden" name="user_id" value="42">
fileβ rasm, hujjat va h.k. yuklash uchun.accept="image/*"faqat rasmlarga ruxsat beradi. β οΈ Fayl yuklash uchunformgaenctype="multipart/form-data"qo'shish shart (aks holda fayl jo'natilmaydi):
<form action="/yuklash" method="post" enctype="multipart/form-data">
<input type="file" name="rasm">
<button>Yuklash</button>
</form>
hiddenβ foydalanuvchiga ko'rinmaydi, lekin u bilan birga serverga jo'natiladi. Masalan, qaysi foydalanuvchi tahrir qilayotganini bildiruvchiuser_idkabi yashirin ma'lumotlar uchun. β οΈ "Yashirin" so'ziga aldanmang β uni HTML'ni ko'rgan har kim o'qiy oladi, shuning uchun parol kabi maxfiy narsani u yerga yozmang.
5.6 textarea β ko'p qatorli matn¶
input type="text" bir qatorli. Uzun matn (izoh, xabar, manzil) uchun textarea ishlatiladi:
<label for="izoh">Izohingiz</label>
<textarea id="izoh" name="izoh" rows="5" cols="40" placeholder="Bu yerga yozing..."></textarea>
rowsβ necha qator balandlikda ko'rinishi,colsβ kengligi.- β οΈ
textareaningvalueatributi yo'q! Boshlang'ich matn ochuvchi va yopuvchi teg orasiga yoziladi:
π <textarea></textarea>ni har doim yoping, hatto bo'sh bo'lsa ham. Yopilmasa, undan keyingi hamma narsa textarea ichiga "yutilib" ketadi.
5.7 select β ro'yxatdan tanlash¶
Ko'p variantdan bittasini (yoki bir nechtasini) tanlash uchun select ishlatiladi. Bu ekranda joy tejaydi:
<label for="shahar">Shahringiz</label>
<select id="shahar" name="shahar">
<option value="">β tanlang β</option>
<option value="tosh">Toshkent</option>
<option value="sam">Samarqand</option>
<option value="buxoro" selected>Buxoro</option>
</select>
- Har bir variant β
<option>. Serverga uningvalue'si jo'natiladi (ekrandagi matn emas!). Agarvalueyozilmasa, ichidagi matn jo'natiladi. selectedβ qaysi variant avvaldan tanlangan bo'lishini belgilaydi.- Birinchi bo'sh
option("β tanlang β") β foydalanuvchini majburlash uchun foydali hiyla.
optgroup β variantlarni guruhlash¶
Variantlar ko'p bo'lsa, ularni mavzu bo'yicha guruhlash mumkin:
<select name="taom">
<optgroup label="Issiq taomlar">
<option value="osh">Osh</option>
<option value="manti">Manti</option>
</optgroup>
<optgroup label="Ichimliklar">
<option value="choy">Choy</option>
<option value="kofe">Kofe</option>
</optgroup>
</select>
optgroupning labeli β guruh sarlavhasi (tanlab bo'lmaydi, faqat ko'rsatkich).
datalist β yozish + taklif¶
datalist β input va select orasidagi gibrid: foydalanuvchi erkin yozadi, lekin brauzer takliflar ham ko'rsatadi:
<label for="brauzer">Sevimli brauzer</label>
<input type="text" id="brauzer" name="brauzer" list="brauzerlar">
<datalist id="brauzerlar">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
</datalist>
inputning list atributi datalistning id'si bilan bog'lanadi. Foydalanuvchi taklif ichidan tanlashi yoki o'zinikini yozishi mumkin β selectda esa faqat berilganlardan tanlash mumkin. Mana asosiy farq.
5.8 button β tugmalar va type ning ahamiyati¶
Tugma ikki xil yoziladi: <button> yoki <input type="...">. <button> qulayroq, chunki ichiga matn, rasm, ikonka qo'yish mumkin. Eng muhimi β tugmaning type atributi:
<form action="/saqlash" method="post">
<input type="text" name="ism">
<button type="submit">Jo'natish</button> <!-- formani jo'natadi -->
<button type="reset">Tozalash</button> <!-- maydonlarni bo'shatadi -->
<button type="button">Ko'rsatish</button> <!-- hech narsa qilmaydi (JS uchun) -->
</form>
type="submit"β formani jo'natadi. Bu standart qiymat: agartypeyozilmasa, tugmasubmitbo'ladi.type="reset"β barcha maydonlarni boshlang'ich holatiga qaytaradi. β οΈ Ehtiyot bo'ling: foydalanuvchi uzun formani to'ldirib, adashib bosib yuborsa, hammasi yo'qoladi. Shuning uchun zamonaviy saytlarda kam ishlatiladi.type="button"β o'zicha hech narsa qilmaydi. JavaScript bilan boshqariladigan tugmalar uchun (masalan "parolni ko'rsatish").
β οΈ Juda muhim tuzoq: <button>da type yozmasangiz, u avtomatik submit bo'ladi! Forma ichidagi har qanday oddiy tugma (masalan "+1 qo'shish") type="button" yozmasangiz, bosilganda butun formani jo'natib yuboradi. Forma ichidagi har bir tugmaning type'ini ataylab yozing.
5.9 fieldset va legend β maydonlarni guruhlash¶
Uzun formani mantiqiy bo'laklarga bo'lish uchun fieldset (guruh) va legend (guruh sarlavhasi) ishlatiladi:
<form action="/royxat" method="post">
<fieldset>
<legend>Shaxsiy ma'lumotlar</legend>
<label for="ism">Ism</label>
<input type="text" id="ism" name="ism">
<label for="yosh">Yosh</label>
<input type="number" id="yosh" name="yosh">
</fieldset>
<fieldset>
<legend>Aloqa</legend>
<label for="email">Email</label>
<input type="email" id="email" name="email">
</fieldset>
<button type="submit">Ro'yxatdan o'tish</button>
</form>
fieldsetmaydonlar atrofiga ramka chizadi va ularni bitta guruh sifatida ko'rsatadi.legendβ shu ramkaning sarlavhasi.- Nega muhim? Skrin-reader
legendni har bir maydon bilan birga o'qiydi ("Aloqa β Email"). Bu radio guruhi uchun ayniqsa foydali β guruh nima haqida ekanini bildiradi.
π‘ fieldsetga disabled atributini qo'ysangiz, ichidagi barcha maydonlar bir vaqtda o'chiriladi (faolsizlanadi). Qadamli ("wizard") formalarda qulay.
5.10 Validatsiya atributlari β brauzer ichidagi tekshiruv¶
Brauzer formani jo'natishdan oldin maydonlarni tekshira oladi β biz hech qanday kod yozmasdan. Bu HTML5 validatsiyasi deyiladi. Asosiy atributlar:
<form action="/royxat" method="post">
<label for="ism">Ism (majburiy)</label>
<input type="text" id="ism" name="ism"
required
minlength="2" maxlength="30"
placeholder="Ismingizni yozing">
<label for="parol">Parol</label>
<input type="password" id="parol" name="parol"
required minlength="8">
<label for="yosh">Yosh</label>
<input type="number" id="yosh" name="yosh" min="18" max="99">
<label for="tel">Telefon</label>
<input type="tel" id="tel" name="tel"
pattern="\+998[0-9]{9}"
placeholder="+998901234567">
<button type="submit">Yuborish</button>
</form>
| Atribut | Ma'nosi | Qaysi maydonlarda |
|---|---|---|
required |
Maydon bo'sh qolmasligi kerak | barchasida |
minlength / maxlength |
Matn uzunligining eng kam / eng ko'p belgisi | matn maydonlari |
min / max |
Eng kichik / eng katta qiymat | number, range, date |
pattern |
Matn berilgan shablon (regex)ga mos kelishi shart | matn maydonlari |
placeholder |
Maydon bo'sh paytdagi xira namuna matn | matn maydonlari |
Agar foydalanuvchi required maydonni bo'sh qoldirib jo'natmoqchi bo'lsa, brauzer jo'natmaydi va "Bu maydonni to'ldiring" degan xabar ko'rsatadi β bularning hammasi avtomatik.
β οΈ placeholder β label! placeholder β maydon ichidagi xira namuna matn. U yorliq o'rnini bosa olmaydi, chunki foydalanuvchi yoza boshlashi bilan yo'qoladi va keyin maydon nima uchun ekanini eslay olmaydi. Doim label + placeholder birga ishlatiladi:
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="masalan: ali@mail.uz">
β οΈ Eng muhim ogohlantirish: brauzer validatsiyasi YETARLI EMAS¶
HTML validatsiyasi β bu faqat qulaylik (foydalanuvchiga tez xabar berish). U xavfsizlik emas! Sababi: tajribali odam brauzer vositalarida requiredni o'chirib tashlashi yoki formani umuman chetlab o'tib serverga to'g'ridan-to'g'ri yomon ma'lumot yuborishi mumkin.
π Oltin qoida: mijoz (brauzer) tomonida tekshiruv β qulaylik uchun; server tomonida tekshiruv β xavfsizlik uchun. Har doim ikkalasini ham qiling. Serverda tekshirishni keyingi qo'llanmalarda (PHP/JS) o'rganasiz, lekin tamoyilni hozir yodda tuting.
5.11 Accessibility va autocomplete β formani hamma uchun qulay qilish¶
Yaxshi forma β hamma (jumladan ko'zi ojizlar, klaviatura bilan ishlovchilar) foydalana oladigan forma. Asosiy amaliyotlar:
1. Har maydonda bog'langan label (5.4'da ko'rdik) β bu eng muhimi.
2. autocomplete β brauzer yodlab, to'ldirib beradi. Standart nomlar berilsa, brauzer foydalanuvchining oldingi ma'lumotini avtomatik taklif qiladi:
<label for="ism">To'liq ism</label>
<input type="text" id="ism" name="ism" autocomplete="name">
<label for="email">Email</label>
<input type="email" id="email" name="email" autocomplete="email">
<label for="tel">Telefon</label>
<input type="tel" id="tel" name="tel" autocomplete="tel">
autocomplete="name", "email", "tel", "street-address", "postal-code" β bular brauzer biladigan standart nomlar. Foydalanuvchi qayta-qayta yozmaydi β bir bosishda to'ldiriladi.
3. aria atributlari β qiyin holatlar uchun. Agar yorliq yashirin bo'lishi kerak bo'lsa (masalan dizayn uchun), aria-label bilan skrin-reader uchun nom berish mumkin:
Xato xabarini maydon bilan bog'lash uchun aria-describedby:
<input type="email" id="email" name="email" aria-describedby="email-hint">
<small id="email-hint">Hech kimga ko'rsatilmaydi.</small>
π‘ Tartib: birinchi navbatda haqiqiy label, fieldset, to'g'ri type ishlating. aria β bu qo'shimcha, oddiy HTML yeta olmagan joyni "yamash" uchun. To'g'ri HTML allaqachon ko'p accessibility'ni bepul beradi.
5.12 To'liq misol β barchasini birlashtiramiz¶
Quyida shu bobdagi tushunchalarni jamlagan haqiqiy ro'yxatdan o'tish formasi:
<form action="/royxatdan-otish" method="post">
<fieldset>
<legend>Hisob yaratish</legend>
<p>
<label for="ism">To'liq ism</label><br>
<input type="text" id="ism" name="ism"
required minlength="2"
autocomplete="name"
placeholder="Ali Valiyev">
</p>
<p>
<label for="email">Email</label><br>
<input type="email" id="email" name="email"
required autocomplete="email"
placeholder="ali@mail.uz">
</p>
<p>
<label for="parol">Parol</label><br>
<input type="password" id="parol" name="parol"
required minlength="8">
</p>
<p>
<label for="shahar">Shahar</label><br>
<select id="shahar" name="shahar" required>
<option value="">β tanlang β</option>
<option value="tosh">Toshkent</option>
<option value="sam">Samarqand</option>
</select>
</p>
<p>Jinsingiz:</p>
<p>
<label><input type="radio" name="jins" value="erkak" required> Erkak</label>
<label><input type="radio" name="jins" value="ayol"> Ayol</label>
</p>
<p>
<label>
<input type="checkbox" name="shartlar" value="ha" required>
Shartlarga roziman
</label>
</p>
</fieldset>
<button type="submit">Ro'yxatdan o'tish</button>
</form>
Natija: ramka ichida tartibli forma; har maydonda yorliq; bo'sh qoldirilsa yoki parol 8 belgidan qisqa bo'lsa β brauzer jo'natmaydi va xabar beradi; jo'natilsa, serverga ism=...&email=...&parol=...&shahar=tosh&jins=erkak&shartlar=ha ko'rinishida boradi.
Mashqlar¶
Quyidagi mashqlarni tartib bilan bajaring β har biri oldingisining ustiga quradi.
Mashq 1. Bitta matn maydoni (name="ism") va bitta "Jo'natish" tugmasidan iborat forma yarating. action="/test", method="post" bo'lsin. Maydonda bog'langan label ("Ism") bo'lsin.
Yechim
Mashq 2. Login formasi yarating: email maydoni (type="email") va parol maydoni (type="password"). Ikkalasi ham required. Parol kamida 8 belgidan iborat bo'lsin (minlength). Nega bu forma method="post" bo'lishi kerakligini bir jumlada izohlang.
Yechim
<form action="/login" method="post">
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
<label for="parol">Parol</label>
<input type="password" id="parol" name="parol" required minlength="8">
<button type="submit">Kirish</button>
</form>
post kerak, chunki parol maxfiy β get bo'lsa u URL manzil qatorida ochiq ko'rinib qolardi va brauzer tarixiga yozilardi.
Mashq 3. Bir guruh radio tugma yarating: "To'lov usuli" β Naqd, Karta, Pul o'tkazma. Faqat bittasini tanlash mumkin bo'lsin va "Karta" avvaldan belgilangan bo'lsin. (Maslahat: name bir xil, value'lar har xil bo'lsin.)
Yechim
<fieldset>
<legend>To'lov usuli</legend>
<label><input type="radio" name="tolov" value="naqd"> Naqd</label>
<label><input type="radio" name="tolov" value="karta" checked> Karta</label>
<label><input type="radio" name="tolov" value="otkazma"> Pul o'tkazma</label>
</fieldset>
name bir xil (tolov) bo'lgani uchun brauzer ularni bitta guruh deb biladi va faqat bittasiga ruxsat beradi. checked β boshlang'ich tanlovni belgilaydi.
Mashq 4. select yarating: "Mamlakat" ro'yxati optgroup bilan ikki guruhga bo'lingan bo'lsin β "Markaziy Osiyo" (O'zbekiston, Qozog'iston) va "Yevropa" (Germaniya, Fransiya). Birinchi option "β tanlang β" bo'lsin.
Yechim
<label for="mamlakat">Mamlakat</label>
<select id="mamlakat" name="mamlakat">
<option value="">β tanlang β</option>
<optgroup label="Markaziy Osiyo">
<option value="uz">O'zbekiston</option>
<option value="kz">Qozog'iston</option>
</optgroup>
<optgroup label="Yevropa">
<option value="de">Germaniya</option>
<option value="fr">Fransiya</option>
</optgroup>
</select>
Mashq 5. Quyidagi formada uchta xato bor. Ularni toping va tuzating:
<form>
<label>Email</label>
<input type="text" email>
<button type="reset">Yuborish</button>
</form>
Yechim
Xatolar:
1. inputda name yo'q β serverga hech narsa jo'natilmaydi.
2. type="text" email noto'g'ri β email maydoni uchun type="email" bo'lishi kerak (email o'zicha atribut emas).
3. "Yuborish" tugmasi type="reset" β bu formani tozalaydi, jo'natmaydi. type="submit" bo'lishi kerak.
Tuzatilgan variant:
<form action="/jonatish" method="post">
<label for="email">Email</label>
<input type="email" id="email" name="email">
<button type="submit">Yuborish</button>
</form>
(labelni for/id bilan bog'lash va formga action/method qo'shish ham yaxshilab qo'yildi.)
Mashq 6. Izoh qoldirish formasi yarating: ism (text, majburiy), baho (select 1 dan 5 gacha), va ko'p qatorli izoh (textarea, kamida 10 belgi). Har maydonda yorliq bo'lsin.
Yechim
<form action="/izoh" method="post">
<p>
<label for="ism">Ism</label><br>
<input type="text" id="ism" name="ism" required>
</p>
<p>
<label for="baho">Baho</label><br>
<select id="baho" name="baho">
<option value="5">5 β A'lo</option>
<option value="4">4</option>
<option value="3">3</option>
<option value="2">2</option>
<option value="1">1 β Yomon</option>
</select>
</p>
<p>
<label for="izoh">Izoh</label><br>
<textarea id="izoh" name="izoh" rows="4" minlength="10"
placeholder="Fikringizni yozing..."></textarea>
</p>
<button type="submit">Yuborish</button>
</form>
Eslatma: textareaning boshlang'ich qiymati teglar orasiga yoziladi, value atributi yo'q.
Mashq 7. Fayl yuklash formasi yarating: faqat rasm qabul qilsin (accept="image/*"). formga fayl jo'natish ishlashi uchun qaysi ikkita atribut shart? (Maslahat: biri method, biri enctype.)
Yechim
<form action="/yuklash" method="post" enctype="multipart/form-data">
<label for="rasm">Rasm tanlang</label>
<input type="file" id="rasm" name="rasm" accept="image/*">
<button type="submit">Yuklash</button>
</form>
Fayl yuklash uchun ikkita shart: method="post" (fayl URL'ga sig'maydi) va enctype="multipart/form-data" (faylni to'g'ri "qadoqlash" usuli). enctype bo'lmasa, server faqat fayl nomini oladi, faylning o'zini emas.
Mashq 8. (Mushkulroq) Telefon raqami maydoni yarating: type="tel", required, va pattern bilan faqat +998 bilan boshlanib, keyin to'qqizta raqam bo'lishi shart bo'lsin. placeholder namuna ko'rsatsin. Nega pattern yetarli emasligini (xavfsizlik nuqtai nazaridan) bir jumlada yozing.
Yechim
<label for="tel">Telefon</label>
<input type="tel" id="tel" name="tel"
required
pattern="\+998[0-9]{9}"
placeholder="+998901234567"
autocomplete="tel">
pattern izohi: \+998 β +998 bilan boshlanadi, [0-9]{9} β keyin aniq 9 ta raqam.
Nega yetarli emas: pattern faqat brauzerda tekshiriladi va uni chetlab o'tish oson (foydalanuvchi formani o'zgartirib yoki to'g'ridan-to'g'ri serverga so'rov yuborib). Shuning uchun raqamni serverda ham qayta tekshirish shart β brauzer validatsiyasi qulaylik uchun, xavfsizlik server tomonida ta'minlanadi.
β¬ οΈ Oldingi: 04 β Jadvallar Β· π README Β· Keyingi: 06 β Semantik HTML va accessibility β‘οΈ