ФоÑми Ñа елеменÑи кеÑÑваннÑ, ÑÐ°ÐºÑ Ñк <input>, маÑÑÑ Ð±Ð°Ð³Ð°Ñо ÑпеÑÑалÑниÑ
влаÑÑивоÑÑей Ñ Ð¿Ð¾Ð´Ñй.
ÐÑаÑÑваÑи з ÑоÑмами бÑде набагаÑо зÑÑÑнÑÑе, коли ми ÑÑ Ð²Ð¸Ð²Ñимо.
ÐавÑгаÑÑÑ: ÑоÑми Ñа елеменÑи
ФоÑми в докÑменÑÑ Ñ Ñленами ÑпеÑÑалÑÐ½Ð¾Ñ ÐºÐ¾Ð»ÐµÐºÑÑÑ document.forms.
Це Ñак звана âÑменована колекÑÑÑâ: Ñоб оÑÑимаÑи ÑоÑÐ¼Ñ Ð¼Ð¸ можемо викоÑиÑÑовÑваÑи Ñк ÑÑ ÑмâÑ, Ñак Ñ Ð¿Ð¾ÑÑдковий Ð½Ð¾Ð¼ÐµÑ Ñ Ð´Ð¾ÐºÑменÑÑ.
document.forms.my; // ÑоÑма з Ñменем "my" (name="my")
document.forms[0]; // пеÑÑа ÑоÑма в докÑменÑÑ
Ðоли Ñ Ð½Ð°Ñ Ñ ÑоÑма, бÑдÑ-Ñкий ÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾ÑÑÑпний в ÑменованÑй колекÑÑÑ form.elements.
ÐапÑиклад:
<form name="my">
<input name="one" value="1">
<input name="two" value="2">
</form>
<script>
// оÑÑимÑÑмо ÑоÑмÑ
let form = document.forms.my; // ÐµÐ»ÐµÐ¼ÐµÐ½Ñ <form name="my">
// оÑÑимÑÑмо елеменÑ
let elem = form.elements.one; // ÐµÐ»ÐµÐ¼ÐµÐ½Ñ <input name="one">
alert(elem.value); // 1
</script>
У колекÑÑÑ Ð¼Ð¾Ð¶Ðµ бÑÑи кÑлÑка елеменÑÑв з однаковим ÑмâÑм (name). Це Ñипово Ð´Ð»Ñ Ð¿ÐµÑемикаÑÑв (radio buttons) Ñа ÑекбокÑÑв (checkboxes).
Ð ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ form.elements[name] â Ñе колекÑÑÑ. ÐапÑиклад:
<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.
<fieldset> Ñк âпÑдÑоÑмиâФоÑма може мÑÑÑиÑи вÑеÑÐµÐ´Ð¸Ð½Ñ Ð¾Ð´Ð¸Ð½ або кÑлÑка елеменÑÑв <fieldset>. Ðони Ñакож маÑÑÑ Ð²Ð»Ð°ÑÑивÑÑÑÑ elements, Ñка мÑÑÑиÑÑ ÐºÐ¾Ð»ÐµÐºÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв кеÑÑÐ²Ð°Ð½Ð½Ñ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð½Ð¸Ñ
.
ÐапÑиклад:
<body>
<form id="form">
<fieldset name="userFields">
<legend>info</legend>
<input name="login" type="text">
</fieldset>
</form>
<script>
alert(form.elements.login); // <input name="login">
let fieldset = form.elements.userFields;
alert(fieldset); // HTMLFieldSetElement
// ми можемо оÑÑимаÑи поле за Ñменем Ñк з ÑоÑми, Ñак Ñ Ð· елеменÑÑ fieldset
alert(fieldset.elements.login == form.elements.login); // true
</script>
</body>
form.nameÐÑнÑÑ ÐºÐ¾ÑоÑÑий ваÑÑÐ°Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑ: ми можемо оÑÑимаÑи доÑÑÑп до елеменÑа ÑеÑез form[index/name].
ÐнÑими Ñловами, замÑÑÑÑ form.elements.login ми можемо напиÑаÑи form.login.
Такий ваÑÑÐ°Ð½Ñ Ñакож пÑаÑÑÑ, але Ñ Ð½ÐµÐ·Ð½Ð°Ñна пÑоблема: ÑкÑо ми оÑÑимÑÑмо доÑÑÑп до елеменÑа, а поÑÑм змÑнÑÑмо його ÑмâÑ (name), Ñо вÑн вÑе Ñе бÑде доÑÑÑпний пÑд ÑÑаÑим ÑмâÑм (а Ñакож пÑд новим).
Це легко побаÑиÑи на пÑикладÑ:
<form id="form">
<input name="login">
</form>
<script>
alert(form.elements.login == form.login); // true, Ñе один Ñ Ñой Ñамий <input>
form.login.name = "username"; // змÑнÑÑмо ÑмâÑ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ñ
// form.elements оновив ÑмâÑ:
alert(form.elements.login); // undefined
alert(form.elements.username); // input
// а Ñ ÑоÑÐ¼Ñ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð¾Ð±Ð¸Ð´Ð²Ð° ÑменÑ: нове Ñа ÑÑаÑе
alert(form.username == form.login); // true
</script>
Ðднак Ñе зазвиÑай не пÑоблема, оÑкÑлÑки ми ÑÑдко змÑнÑÑмо Ñмена елеменÑÑв ÑоÑми.
ÐвоÑоÑне поÑиланнÑ: element.form
ÐÐ»Ñ Ð±ÑдÑ-Ñкого елеменÑа ÑоÑми, Ñама ÑоÑма доÑÑÑпна Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ element.form. Таким Ñином, ÑоÑма поÑилаÑÑÑÑÑ Ð½Ð° вÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñи, а елеменÑи поÑилаÑÑÑÑÑ Ð½Ð° ÑоÑмÑ.
ÐÑÑ ÐºÐ°ÑÑинка:
ÐапÑиклад:
<form id="form">
<input type="text" name="login">
</form>
<script>
// form -> element
let login = form.login;
// element -> form
alert(login.form); // HTMLFormElement
</script>
ÐлеменÑи ÑоÑми
РозглÑнемо елеменÑи кеÑÑÐ²Ð°Ð½Ð½Ñ ÑоÑмоÑ.
input Ñа textarea
Ðи можемо оÑÑимаÑи доÑÑÑп до ÑÑ
знаÑÐµÐ½Ð½Ñ ÑеÑез влаÑÑивÑÑÑÑ input.value (ÑÑдок) або input.checked (логÑÑне знаÑеннÑ) Ð´Ð»Ñ ÑекбокÑÑв Ñ Ð¿ÐµÑемикаÑÑв (radio buttons).
ÐÑÑ Ñак:
input.value = "Ðове знаÑеннÑ";
textarea.value = "Ðовий ÑекÑÑ";
input.checked = true; // Ð´Ð»Ñ ÑекбокÑа або пеÑемикаÑа (radio button)
textarea.value замÑÑÑÑ textarea.innerHTMLÐаÑважÑе, Ñо, попÑи Ñе, Ñо <textarea>...</textarea> збеÑÑÐ³Ð°Ñ ÑÐ²Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ñк вкладений HTML, ми нÑколи не Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи textarea.innerHTML Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ нÑого.
ÐлаÑÑивÑÑÑÑ innerHTML мÑÑÑиÑÑ Ð»Ð¸Ñе поÑаÑковий HTML, а не поÑоÑне знаÑеннÑ.
select Ñа option
ÐÐ»ÐµÐ¼ÐµÐ½Ñ <select> Ð¼Ð°Ñ 3 Ð²Ð°Ð¶Ð»Ð¸Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ:
select.optionsâ набÑÑ Ð¿ÑделеменÑÑв<option>,select.valueâ знаÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑоÑного обÑаного елеменÑа<option>,select.selectedIndexâ Ð½Ð¾Ð¼ÐµÑ Ð¿Ð¾ÑоÑного обÑаного елеменÑа<option>.
Ðони надаÑÑÑ ÑÑи ÑÑÐ·Ð½Ñ ÑпоÑоби вÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð´Ð»Ñ <select>:
- ÐнайÑи вÑдповÑдний елеменÑ
<option>(напÑиклад, ÑеÑедselect.options) Ñ Ð²ÑÑановиÑи Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ влаÑÑивоÑÑÑoption.selectedзнаÑеннÑtrue. - ЯкÑо ми знаÑмо нове знаÑеннÑ: вÑÑановиÑи нове знаÑÐµÐ½Ð½Ñ Ð´Ð»Ñ
select.value. - ЯкÑо ми знаÑмо поÑÑдковий Ð½Ð¾Ð¼ÐµÑ Ð¾Ð¿ÑÑÑ: вÑÑановиÑи Ñе ÑиÑло длÑ
select.selectedIndex.
ÐÑÑ Ð¿Ñиклад ÑÑÑÑ ÑÑÑÐ¾Ñ Ð¼ÐµÑодÑв:
<select id="select">
<option value="apple">ЯблÑко</option>
<option value="pear">ÐÑÑÑа</option>
<option value="banana">Ðанан</option>
</select>
<script>
// вÑÑ ÑÑи ÑÑдки ÑоблÑÑÑ Ñе Ñаме
select.options[2].selected = true;
select.selectedIndex = 2;
select.value = 'banana';
// звеÑнÑÑÑ ÑвагÑ: опÑÑÑ Ð¿Ð¾ÑинаÑÑÑÑÑ Ð· нÑлÑ, ÑÐ¾Ð¼Ñ ÑÐ½Ð´ÐµÐºÑ 2 ознаÑÐ°Ñ 3-й ваÑÑанÑ.
</script>
Ðа вÑдмÑÐ½Ñ Ð²Ñд бÑлÑÑоÑÑÑ ÑнÑиÑ
елеменÑÑв кеÑÑваннÑ, <select> дозволÑÑ Ð²Ð¸Ð±ÑаÑи декÑлÑка опÑÑй одноÑаÑно, ÑкÑо вÑн Ð¼Ð°Ñ Ð°ÑÑибÑÑ multiple. Ðднак Ñей аÑÑибÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ ÑÑдко.
ÐÐ»Ñ Ð²Ð¸Ð±Ð¾ÑÑ ÐºÑлÑкоÑ
знаÑÐµÐ½Ñ ÑкоÑиÑÑайÑеÑÑ Ð¿ÐµÑÑим ÑпоÑобом вÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°ÑенÑ: вÑÑановÑÑÑ Ð°Ð±Ð¾ видалÑÑÑ Ð²Ð»Ð°ÑÑивÑÑÑÑ selected Ð´Ð»Ñ Ð¿ÑделеменÑÑв <option>.
ÐÑÑ Ð¿Ñиклад Ñого, Ñк оÑÑимаÑи вибÑÐ°Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð· елеменÑа <select> з множинним вибоÑом:
<select id="select" multiple>
<option value="blues" selected>ÐлÑз</option>
<option value="rock" selected>Рок</option>
<option value="classic">ÐлаÑика</option>
</select>
<script>
// оÑÑимаÑи вÑÑ Ð²Ð¸Ð±ÑÐ°Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð· множинного вибоÑÑ
let selected = Array.from(select.options)
.filter(option => option.selected)
.map(option => option.value);
alert(selected); // blues,rock
</script>
ÐÑÑ ÑнÑоÑмаÑÑÑ Ñодо елеменÑа <select> доÑÑÑпна в ÑпеÑиÑÑкаÑÑÑ https://html.spec.whatwg.org/multipage/forms.html#the-select-element.
new Option
У ÑпеÑиÑÑкаÑÑÑ Ñ Ð³Ð°Ñний коÑоÑкий ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа <option>:
option = new Option(text, value, defaultSelected, selected);
Цей ÑинÑакÑÐ¸Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²âÑзковий. Ðи можемо викоÑиÑÑаÑи document.createElement('option') Ñ Ð²ÑÑановиÑи аÑÑибÑÑи вÑÑÑнÑ. Ðднак Ñе Ñаме можна зÑобиÑи коÑоÑÑе, ÑÐ¾Ð¼Ñ Ð¾ÑÑ Ð¿Ð°ÑамеÑÑи:
textâ ÑекÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð¾Ð¿ÑÑÑ,valueâ знаÑÐµÐ½Ð½Ñ Ð¾Ð¿ÑÑÑ,defaultSelectedâ ÑкÑоtrue, Ñо до опÑÑÑ Ð±Ñде додано HTML-аÑÑибÑÑselected,selectedâ ÑкÑоtrue, Ñо опÑÑÑ Ð±Ñде обÑаноÑ.
Ð ÑзниÑÑ Ð¼Ñж defaultSelected Ñа selected полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо defaultSelected вÑÑановлÑÑ HTML-аÑÑибÑÑ (Ñкий ми можемо оÑÑимаÑи за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ option.getAttribute('selected'), ÑÐ¾Ð´Ñ Ñк selected визнаÑаÑ, обÑана опÑÑÑ Ñи нÑ.
Ðа пÑакÑиÑÑ Ð·Ð°Ð·Ð²Ð¸Ñай ÑлÑд вÑÑановлÑваÑи знаÑÐµÐ½Ð½Ñ Ð¾Ð±Ð¾Ñ
паÑамеÑÑÑв на true або false. (Ðбо пÑоÑÑо не додавайÑе ÑÑ
â за замовÑÑваннÑм вони маÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ false.)
ÐÑÑ, напÑиклад, ÑÑвоÑÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ âневибÑаноÑâ опÑÑÑ:
let option = new Option("ТекÑÑ", "value");
// ÑÑвоÑÑÑ <option value="value">ТекÑÑ</option>
Та Ñама опÑÑÑ, але обÑана:
let option = new Option("ТекÑÑ", "value", true, true);
ÐлеменÑи <option> маÑÑÑ ÑÐ°ÐºÑ Ð²Ð»Ð°ÑÑивоÑÑÑ:
option.selected- ÐказÑÑ Ñи обÑана опÑÑÑ.
option.index- ÐÐ¾Ð¼ÐµÑ Ð¾Ð¿ÑÑÑ ÑеÑед ÑнÑиÑ
в елеменÑÑ
<select>. option.text- ТекÑÑовий змÑÑÑ Ð¾Ð¿ÑÑÑ (Ñе, Ñо баÑиÑÑ Ð²ÑдвÑдÑваÑ).
ÐоÑиланнÑ
- СпеÑиÑÑкаÑÑÑ: https://html.spec.whatwg.org/multipage/forms.html.
ÐÑдÑÑмки
ÐавÑгаÑÑÑ Ð¿Ð¾ ÑоÑмам:
document.forms- ÐÑÑимаÑи ÑоÑÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð° ÑеÑез
document.forms[name/index]. form.elements- ÐлеменÑи ÑоÑми можна оÑÑимаÑи за допомогоÑ
form.elements[ÑмâÑ/ÑндекÑ], або можна викоÑиÑÑовÑваÑи лиÑеform[name/index]. ÐлаÑÑивÑÑÑÑelementsÑакож доÑÑÑпна длÑ<fieldset>. element.form- ÐлеменÑи поÑилаÑÑÑÑÑ Ð½Ð° ÑÐ²Ð¾Ñ ÑоÑÐ¼Ñ ÑеÑез влаÑÑивÑÑÑÑ
form.
ÐнаÑÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑв ÑоÑми доÑÑÑÐ¿Ð½Ñ Ñк input.value, textarea.value, select.value ÑоÑо (Ð´Ð»Ñ ÑекбокÑÑв Ñа пеÑемикаÑÑв викоÑиÑÑовÑйÑе input.checked, Ñоб визнаÑиÑи, Ñи вибÑано знаÑеннÑ.)
ÐÐ»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа <select> Ñакож можна оÑÑимаÑи знаÑÐµÐ½Ð½Ñ Ð·Ð° ÑндекÑом select.selectedIndex або за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÐºÐ¾Ð»ÐµÐºÑÑÑ Ð¾Ð¿ÑÑй select.options.
Це бÑли оÑнови Ð´Ð»Ñ Ð¿Ð¾ÑаÑÐºÑ ÑобоÑи з ÑоÑмами. ÐÐ°Ð»Ñ Ð¼Ð¸ зÑÑÑÑÑнемо Ñе багаÑо пÑикладÑв Ñ Ð¿ÑдÑÑÑникÑ.
У наÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑоздÑÐ»Ñ Ð¼Ð¸ ÑозглÑнемо подÑÑ focus Ñа blur, ÑÐºÑ Ð¼Ð¾Ð¶ÑÑÑ Ð²ÑдбÑваÑиÑÑ Ð½Ð° бÑдÑ-ÑÐºÐ¾Ð¼Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑ, але в оÑÐ½Ð¾Ð²Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑоблÑÑÑÑÑÑ Ñ ÑоÑмаÑ
.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)