FormuláÅe a ovládacà elementy, napÅ. <input>, majà mnoho speciálnÃch vlastnostà a událostÃ.
Když se je nauÄÃme, práce s formuláÅi bude mnohem pohodlnÄjÅ¡Ã.
Navigace: formuláŠa elementy
FormuláÅe v dokumentu jsou prvky speciálnà kolekce document.forms.
Je to tzv. âjmenná kolekceâ: je souÄasnÄ pojmenovaná a seÅazená. Můžeme zÃskat formuláŠpodle jeho názvu i podle jeho poÅadà v dokumentu.
document.forms.můj; // formuláŠs name="můj"
document.forms[0]; // prvnà formuláŠv dokumentu
Když máme formuláÅ, je každý jeho element k dispozici ve jmenné kolekci formuláÅ.elements.
PÅÃklad:
<form name="můj">
<input name="jedna" value="1">
<input name="dvÄ" value="2">
</form>
<script>
// zÃskáme formuláÅ
let form = document.forms.můj; // element <form name="můj">
// zÃskáme element
let elem = form.elements.jedna; // element <input name="jedna">
alert(elem.value); // 1
</script>
Stejný název může mÃt vÃce elementů, což je typické pro rádiová tlaÄÃtka a checkboxy.
V takovém pÅÃpadÄ je formuláÅ.elements[název] kolekce. PÅÃklad:
<form>
<input type="radio" name="vÄk" value="10">
<input type="radio" name="vÄk" value="20">
</form>
<script>
let formuláŠ= document.forms[0];
let elementyVÄků = formuláÅ.elements.vÄk;
alert(elementyVÄků[0]); // [object HTMLInputElement]
</script>
Tyto navigaÄnà vlastnosti nezávisejà na struktuÅe znaÄek. Ve formuláÅ.elements jsou k dispozici vÅ¡echny ovládacà elementy, aÅ¥ jsou ve formuláÅi jakkoli hluboko.
FormuláŠmůže obsahovat jeden nebo vÃce elementů <fieldset>. I ty majà vlastnost elements, která obsahuje ovládacà prvky formuláÅů uvnitÅ nich.
PÅÃklad:
<body>
<form id="formuláÅ">
<fieldset name="uživatelskáPole">
<legend>info</legend>
<input name="login" type="text">
</fieldset>
</form>
<script>
alert(formuláÅ.elements.login); // <input name="login">
let sadaPolà = formuláÅ.elements.uživatelskáPole;
alert(sadaPolÃ); // HTMLFieldSetElement
// můžeme zÃskat vstup podle názvu jak z formuláÅe, tak ze sady polÃ
alert(sadaPolÃ.elements.login == formuláÅ.elements.login); // true
</script>
</body>
formuláÅ.názevExistuje kratšà notace: můžeme k elementu pÅistupovat pomocà formuláÅ[index/název].
Jinými slovy, mÃsto formuláÅ.elements.login můžeme psát formuláÅ.login.
To funguje také, ale má to drobnou nevýhodu: když pÅistoupÃme k elementu a pak zmÄnÃme jeho název (name), bude element stále dostupný pod starým názvem (stejnÄ jako pod novým).
Snadno to uvidÃme na pÅÃkladu:
<form id="formuláÅ">
<input name="login">
</form>
<script>
alert(formuláÅ.elements.login == formuláÅ.login); // true, stejný <input>
formuláÅ.login.name = "uživatelskéJméno"; // zmÄnÃme název vstupnÃho pole
// formuláÅ.elements aktualizovala název:
alert(formuláÅ.elements.login); // undefined
alert(formuláÅ.elements.uživatelskéJméno); // input
// formuláŠumožÅuje oba názvy: nový i starý
alert(formuláÅ.uživatelskéJméno == formuláÅ.login); // true
</script>
Obvykle to vÅ¡ak nenà problém, protože názvy elementů formuláÅe mÄnÃme jen málokdy.
ZpÄtný odkaz: element.form
V každém elementu je formuláŠdostupný jako element.form. FormuláŠse tedy odkazuje na vÅ¡echny elementy a elementy se odkazujà na formuláÅ.
Zde je obrázek:
PÅÃklad:
<form id="formuláÅ">
<input type="text" name="login">
</form>
<script>
// formuláŠ-> element
let login = formuláÅ.login;
// element -> formuláÅ
alert(login.form); // HTMLFormElement
</script>
Elementy formuláÅů
Promluvme si o ovládacÃch prvcÃch formuláÅů.
input a textarea
K jejich hodnotám můžeme pÅistupovat pomocà input.value (ÅetÄzec) nebo v pÅÃpadÄ checkboxů a rádiových tlaÄÃtek input.checked (boolean).
PÅÃklad:
input.value = "Nová hodnota";
textarea.value = "Nový text";
input.checked = true; // pro checkbox nebo rádiové tlaÄÃtko
textarea.value, ne textarea.innerHTMLProsÃme vÅ¡imnÄte si, že i když <textarea>...</textarea> udržuje svou hodnotu jako vnoÅený HTML kód, nikdy bychom k nà nemÄli pÅistupovat použitÃm textarea.innerHTML.
Ukládá si totiž jen HTML kód, který byl na stránce původnÄ, ne aktuálnà hodnotu.
select a option
Element <select> má tÅi důležité vlastnosti:
select.optionsâ kolekce podelementů<option>,select.valueâ hodnota aktuálnÄ zvolené<option>,select.selectedIndexâ ÄÃslo aktuálnÄ zvolené<option>.
Poskytujà tÅi různé způsoby, jak nastavit hodnotu <select>:
- Najdeme odpovÃdacà element
<option>(napÅ. meziselect.options) a nastavÃme jeho vlastnostoption.selectednatrue. - Pokud známe novou hodnotu: nastavÃme
select.valuena tuto hodnotu. - Pokud známe ÄÃslo novÄ zvolené možnosti: nastavÃme
select.selectedIndexna toto ÄÃslo.
PÅÃklad vÅ¡ech tÅà metod:
<select id="select">
<option value="jablko">Jablko</option>
<option value="hruška">Hruška</option>
<option value="banán">Banán</option>
</select>
<script>
// vÅ¡echny tÅi Åádky udÄlajà totéž
select.options[2].selected = true;
select.selectedIndex = 2;
select.value = 'banán';
// prosÃme vÅ¡imnÄte si: možnosti se ÄÃslujà od nuly, takže index 2 znamená 3. možnost.
</script>
Na rozdÃl od vÄtÅ¡iny ostatnÃch ovládacÃch prvků <select> umožÅuje zvolit vÃce možnostà najednou, pokud má atribut multiple. Ten se vÅ¡ak použÃvá jen zÅÃdka.
VÃce zvolených hodnot nastavujte prvnÃm uvedeným způsobem: pÅidávánÃm a odstraÅovánÃm vlastnosti selected na podelementech <option>.
NásledujÃcà pÅÃklad ukazuje, jak zÃskat zvolené hodnoty z vÃcenásobné volby:
<select id="select" multiple>
<option value="blues" selected>Blues</option>
<option value="rock" selected>Rock</option>
<option value="klasika">Klasika</option>
</select>
<script>
// zÃskáme vÅ¡echny hodnoty zvolené vÃcenásobnou volbou
let zvolené = Array.from(select.options)
.filter(možnost => možnost.selected)
.map(možnost => možnost.value);
alert(zvolené); // blues,rock
</script>
Ãplná specifikace elementu <select> je k dispozici ve specifikaci https://html.spec.whatwg.org/multipage/forms.html#the-select-element.
new Option
Ve specifikaci je uvedena pÄkná krátká syntaxe vytvoÅenà elementu <option>:
možnost = new Option(text, hodnota, standardnÄZvolen, zvolen);
Tato syntaxe je nepovinná. Můžeme použÃt document.createElement('option') a nastavit atributy ruÄnÄ. Může vÅ¡ak být kratÅ¡Ã, takže jejà parametry jsou:
textâ text uvnitÅ možnosti,hodnotaâ hodnota možnosti,standardnÄZvolenâ pokud jetrue, pak je vytvoÅen HTML atributselected,zvolenâ pokud jetrue, pak je tato možnost zvolena.
RozdÃl mezi standardnÄZvolen a zvolen spoÄÃvá v tom, že standardnÄZvolen nastavà HTML atribut (který můžeme zÃskat pomocà option.getAttribute('selected')), zatÃmco zvolen nastavÃ, zda je tato možnost zvolena nebo ne.
V praxi bychom zpravidla mÄli obÄ hodnoty nastavit na true nebo na false (nebo je jednoduÅ¡e vynechat; obÄ jsou standardnÄ false).
NapÅÃklad zde vytvoÅÃme novou ânezvolenouâ možnost:
let možnost = new Option("Text", "hodnota");
// vytvoÅÃ <option value="hodnota">Text</option>
Stejná možnost, ale zvolená:
let možnost = new Option("Text", "hodnota", true, true);
Elementy možnostà majà tyto vlastnosti:
option.selected- Zda je možnost zvolena.
option.index- PoÅadové ÄÃslo možnosti mezi ostatnÃmi v jejÃm
<select>. option.text- Textový obsah možnosti (který vidà návÅ¡tÄvnÃk).
Odkazy
- Specifikace: https://html.spec.whatwg.org/multipage/forms.html.
ShrnutÃ
Navigace ve formuláÅi:
document.forms- FormuláŠje k dispozici jako
document.forms[název/index]. formuláÅ.elements- Elementy formuláÅe jsou k dispozici jako
formuláÅ.elements[název/index]nebo staÄà použÃtformuláÅ[název/index]. Vlastnostelementsfunguje i pro<fieldset>. element.form- Elementy se odkazujà na svůj formuláŠve vlastnosti
form.
Hodnota je k dispozici jako input.value, textarea.value, select.value atd. (Pro checkboxy a rádiová tlaÄÃtka použÃvejte ke zjiÅ¡tÄnÃ, zda je tlaÄÃtko zaÅ¡krtnuto, input.checked.)
Pro <select> můžeme zvolenou hodnotu zÃskat také podle indexu select.selectedIndex nebo z kolekce možnostà select.options.
To jsou základy k zahájenà práce s formuláÅi. Dále v tomto tutoriálu se setkáme s mnoha pÅÃklady.
V následujÃcà kapitole probereme události focus a blur, které mohou nastat na kterémkoli elementu, ale nejÄastÄji se zpracovávajà na formuláÅÃch.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)