Forma xossalari va metodlari
Formalar (<form>) va ular ichidagi boshqaruv elementlari (input, textarea, select va boshqalar) foydalanuvchi bilan ma'lumot almashishning asosiy vositasi. Ular DOM'da o'ziga xos xossa va metodlarga ega bo'lib, ularni oddiy DOM elementlaridan qulayroq topish va boshqarish imkonini beradi. Ushbu darsda formalarga navigatsiya qilishni va boshqaruv elementlari bilan ishlashni chuqur o'rganamiz.
Formalarga navigatsiya: document.forms
Formalar hujjatdagi maxsus to'plam โ document.formsning bir qismidir. Bu "nomlangan to'plam" (named collection): unga ham tartib raqami, ham forma name atributi orqali murojaat qilish mumkin.
document.forms.my; // name="my" bo'lgan forma
document.forms[0]; // hujjatdagi birinchi forma
Formani olganimizdan so'ng, uning ichidagi istalgan elementga form.elements to'plami orqali yetib boramiz:
<form name="my">
<input name="one" value="1">
<input name="two" value="2">
</form>
<script>
// formani olamiz
let form = document.forms.my;
// element olamiz
let elem = form.elements.one;
alert(elem.value); // 1
</script>
Bir nechta element bir xil namega ega bo'lishi mumkin (masalan, radio tugmalar). Bunday holatda form.elements[name] to'plam (collection) qaytaradi:
<form>
<input type="radio" name="age" value="10">
<input type="radio" name="age" value="20">
</form>
<script>
let form = document.forms[0];
let ageElems = form.elements.age;
alert(ageElems[0]); // [object HTMLInputElement]
</script>
form.elements orqali barcha boshqaruv elementlari to'g'ridan-to'g'ri mavjud bo'ladi.Fieldset "kichik forma" sifatida
Forma ichida bir yoki bir nechta <fieldset> elementi bo'lishi mumkin. Ular ham elements xossasiga ega bo'lib, o'z ichidagi boshqaruv elementlarini saqlaydi:
<form id="form">
<fieldset name="userFields">
<legend>info</legend>
<input name="login" type="text">
</fieldset>
</form>
<script>
alert(form.elements.login); // input orqali
let fieldset = form.elements.userFields;
alert(fieldset); // HTMLFieldSetElement
// login ni ham forma orqali, ham fieldset orqali olsak bo'ladi
alert(fieldset.elements.login === form.elements.login); // true
</script>
Qisqa yozuv: form.name
Uzun form.elements.login o'rniga qisqaroq form.login yozuvi ham ishlaydi โ forma o'zi ham o'z elementlariga nom orqali kirishga imkon beradi:
<form id="form">
<input name="login">
</form>
<script>
// ikkalasi bir xil elementga ishora qiladi
alert(form.elements.login == form.login); // true
form.login.name = 'username'; // name ni o'zgartiramiz
// form.login endi ishlamaydi, chunki name o'zgardi!
alert(form.elements.username); // input
alert(form.login); // undefined
</script>
form.login) qulay, lekin bitta "nozik" kamchiligi bor: elementning nameini kodda o'zgartirsak, u eski nom orqali darhol topilmay qoladi. Bu odatiy holat, lekin nomni dinamik o'zgartirganda esda tutish kerak. Aksincha, form.elements to'plami esa o'zgargan yangi nomni to'g'ri qaytaradi.Orqaga havola: element.form
Har bir forma elementi o'zi tegishli bo'lgan formaga element.form xossasi orqali murojaat qila oladi. Ya'ni forma o'z elementlariga ishora qiladi, elementlar esa formaga qaytadan ishora qiladi:
<form id="form">
<input type="text" name="login">
</form>
<script>
// form -> element
let login = form.login;
// element -> form
alert(login.form); // HTMLFormElement
</script>
element.form hodisa ishlovchilarida juda qulay: masalan, tugma bosilganda uning event.target.form orqali qaysi formaga tegishli ekanligini darhol bilib olish mumkin โ DOM bo'ylab qidirish shart emas.Elementlar bilan ishlash: input va textarea
Matnli input va textareaning qiymatiga input.value (string) orqali kiramiz yoki checkbox/radio uchun input.checked (boolean) orqali:
input.value = 'Yangi qiymat';
textarea.value = 'Yangi matn';
input.checked = true; // checkbox yoki radio uchun
textareaning qiymatini o'qish uchun har doim textarea.valuedan foydalaning, textarea.innerHTMLdan emas! innerHTML faqat sahifa dastlab yuklangandagi HTML'ni saqlaydi va foydalanuvchi kiritgan yangi matnni aks ettirmaydi.select va option bilan ishlash
<select> elementi (ochiladigan ro'yxat) uch muhim xossaga ega:
select.optionsโ<option>elementlari to'plami;select.valueโ hozir tanlangan<option>ning qiymati (value);select.selectedIndexโ hozir tanlangan<option>ning tartib raqami.
Ular <select> uchun qiymat belgilashning uch xil usulini beradi:
- Kerakli
<option>ning tartib raqamini toping vaselect.selectedIndexga bering; - Kerakli qiymatni
select.valuega to'g'ridan-to'g'ri bering; - Kerakli
<option>ningoption.selectedxossasigatruebering.
<select id="select">
<option value="apple">Olma</option>
<option value="pear">Nok</option>
<option value="banana">Banan</option>
</select>
<script>
// uch usul ham "Nok" ni tanlaydi:
select.selectedIndex = 1;
select.value = 'pear';
select.options[1].selected = true;
</script>
Boshqa boshqaruv elementlaridan farqli, <select> multiple atributi bilan bir nechta qiymatni tanlashga ruxsat beradi (garchi kamdan-kam ishlatilsa ham). Bu holatda tanlangan qiymatlarni olish uchun option.selectedni tekshirib chiqish kerak:
<select id="select" multiple>
<option value="blues" selected>Blyuz</option>
<option value="rock" selected>Rok</option>
<option value="classic">Klassik</option>
</select>
<script>
// barcha tanlangan qiymatlarni yig'amiz
let selected = Array.from(select.options)
.filter(option => option.selected)
.map(option => option.value);
alert(selected); // blues,rock
</script>
new Option
<option> elementlarini dinamik yaratish uchun qisqa maxsus sintaksis mavjud โ new Option konstruktori:
let option = new Option(text, value, defaultSelected, selected);
textโ<option>ichidagi ko'rinadigan matn;valueโ<option>ning qiymati;defaultSelectedโtruebo'lsa,selectedHTML-atributi qo'yiladi;selectedโtruebo'lsa,<option>tanlanadi.
// oddiy holat: matn va value bilan
let option = new Option('Matn', 'value');
// tanlangan holatda
let option2 = new Option('Matn', 'value', true, true);
// keyin uni select ichiga qo'shamiz
select.append(option);
<option> elementlari yana bir necha foydali xossaga ega: option.selected (tanlanganmi?), option.index (ro'yxatdagi raqami), option.text (ko'rinadigan matni).Xulosa
- Formalarga navigatsiya:
document.formsโ barcha formalar;form.elementsโ forma ichidagi elementlar;fieldset.elementsโ kichik guruh elementlari; - Qisqa yozuv
form.nameishlaydi, lekin elementnamei o'zgarsa eski nom orqali topilmay qoladi; - Orqaga havola
element.formโ element o'z formasiga ishora qiladi; - Matnli input/textarea qiymati โ
value(har doimvalue,innerHTMLemas!); checkbox/radio holati โchecked; <select>uchun uch usul:selectedIndex,value, yokioption.selected;optionsโ barcha optionlar to'plami;- Yangi
<option>ninew Option(text, value, defaultSelected, selected)bilan tez yaratish mumkin.