WWW-lomakkeet
ITKP1011 Web-julkaiseminen · korjattu ja laajennettu laitos
Luennolla käsitellään WWW-lomaketekniikoiden nykyisiä mahdollisuuksia ja mahdottomuuksia HTML-dokumenteissa.
Kaikki hiemankaan monimutkaisemmat WWW-sovellukset käyttävät lomakkeita. Sovellusten toteuttaminen ei kuulu tämän kurssin aiheisiin vaan vasta esimerkiksi kurssille TIEA2120 Web-käyttöliittymien ohjelmointi. Tällä kurssilla opetellaan toteuttamaan yksinkertaisia staattisia lomakkeita.
Tämän luennon jälkeen sinun pitäisi osata:
- kertoa, mihin lomakkeita kannattaa ja ei kannata käyttää;
- rakentaa lomake
form-elementillä ja valitamethod-attribuutin arvo perustellusti; - käyttää tavallisimpia kenttiä:
input,textarea,selectjabutton; - yhdistää jokaisen kentän otsikkoonsa
label-elementillä; - ryhmitellä kentät
fieldset- jalegend-elementeillä; - käyttää selaimen sisäänrakennettua tarkistusta attribuuteilla
required,pattern,minjamax; - tehdä lomakkeesta saavutettava ja tunnistaa tavallisimmat virheet.
1. Mihin WWW-lomakkeita voi ja kannattaa käyttää?
Lomakkeita voi käyttää kaikenlaisten tietojen kysymiseen sivuston käyttäjiltä. Tyypillisiä käyttötilanteita ovat:
- Dynaamiset sivustot ja vuorovaikutus käyttäjän kanssa, jolloin sivun sisältö
riippuu käyttäjän valinnoista.
- Esimerkiksi W3C:n validaattori, jota olet käyttänyt kurssin alusta asti.
- Esimerkiksi Karttapaikan osoitehaku.
- Erilaisten kyselyjen tekeminen sähköpostin sijasta.
- Sivuston tai tapahtuman palautelomake sähköpostin sijasta.
- Haku sivustolta tai hakukoneesta.
- Kirjautuminen ja tunnistautuminen.
1.1 Lomakkeella saavutettavat hyödyt
- Tietoja voi kysyä verkossa ajasta ja paikasta riippumatta.
- Tiedot saadaan talteen valmiiksi sähköisessä muodossa.
- Jatkokäsittelystä jää yksi työläs vaihe pois.
- Vastauspapereita ei tarvitse käsitellä.
- Arkistointi voidaan automatisoida.
- Vuorovaikutus käyttäjän kanssa on mahdollista.
- Sivusto voi muuttua käyttäjän valintojen mukaan.
1.2 Lomakkeen käytöstä aiheutuvat haitat
- Käyttöliittymänä lomake on rajallinen ja usein hankala.
- Käyttäjä ei välttämättä saa omaa kopiota lähettämästään tiedosta, esimerkiksi tilauksesta.
- Tiedot voivat hävitä matkalla, eikä käyttäjä aina huomaa sitä.
- Verkossa tehtävä kysely on helppo ohittaa.
- Lomakkeen tietojen käsittelyyn tarvitaan yleensä erillinen ohjelma.
- Käsittelijäohjelma on itse tehtynä kohtuullisen monimutkainen.
- Erikoistilanteet, kuten ääkköset ja rivinvaihdot, vaativat huolellisuutta.
Kun lomakkeella kerätään henkilötietoja, kerääjä on vastuussa niistä. Kysy vain sellaisia tietoja, joita todella tarvitset käyttötarkoitukseen, ja kerro käyttäjälle mihin tietoja käytetään. Älä kysy henkilötunnusta, ellei sille ole erikseen laissa säädettyä perustetta. Näissä harjoituksissa käytetään keksittyjä tietoja.
2. Lomakkeen tekeminen
Lomakelohko sijoitetaan body-elementin sisään
form-elementillä:
<form action="https://palvelin.example/kasittelija" method="post">
... lomake-elementit ...
</form>
action-attribuutti kertoo, minne lomakkeelle syötetyt tiedot lähetetään. Käytännössä se on osoite palvelimella olevaan ohjelmaan. Kirjoita osoite aina https-alkuisena; selain estää https-sivulta lähtevän http-lomakkeen.method-attribuutti kertoo tavan, jolla tieto lähetetään käyttäjältä käsittelijälle. Mahdollisia arvoja ovatpostjaget. Erot käsitellään luvussa 14.
Yksinkertaisessa esimerkissä on pelkkiä tekstikenttiä
(type="text"). Huomaa kolme asiaa, jotka toistuvat kaikissa hyvissä
lomakkeissa:
- Jokaisella kentällä on otsikko
label-elementillä. - Kentissä on järkevät oletusarvot tai vinkit siitä, mitä niihin kuuluu.
- Kentät ovat siinä järjestyksessä kuin ne täytetään.
Lomakkeita tehdessä kannattaa pitäytyä pelkistetyissä ja yksinkertaisissa muodoissa eikä alkaa kikkailla elementeillä.
3. Lomake-elementit
WWW-lomakkeille voidaan lisätä monenlaisia elementtejä, joiden avulla lomakkeista saadaan käyttökelpoisia. Erilaisia elementtejä käyttämällä lomakkeesta saadaan monipuolinen, ja käyttäjän antamia syötteitä pystytään jonkin verran rajoittamaan. Varsin usein lomakkeelle tehdään pelkästään tekstikenttiä, mutta muitakin mahdollisuuksia kannattaa harkita.
| Elementti | Tarkoitus |
|---|---|
form | Muodostaa lomakkeen |
label | Kentän otsikko |
input | Monikäyttöinen kenttä, jonka tyyppi valitaan type-attribuutilla |
textarea | Monirivinen tekstikenttä |
select, option, optgroup | Valintalista ja sen vaihtoehdot |
datalist | Ehdotuslista tekstikenttään |
fieldset, legend | Kenttäryhmä ja sen otsikko |
button | Painike |
input-elementin tyypeistä.4. Kentän otsikko – label
label-elementti toimii lomake-elementtien otsikkona.
Jokaisella kentällä on oltava otsikko. Ilman sitä ruudunlukijan
käyttäjä ei tiedä, mitä kenttään kuuluu kirjoittaa, eikä otsikon napsauttaminen
siirrä kohdistusta kenttään.
Otsikon voi liittää kenttään kahdella tavalla. Ensimmäinen on kapselointi, jolloin kenttä kirjoitetaan otsikon sisään:
<label>Nimi: <input type="text" name="nimi" /></label>
Toinen tapa on for-attribuutti, jota käytetään silloin, kun kenttää ei
voida sijoittaa suoraan otsikon sisään. Lomake-elementin id-attribuutin ja
otsikon for-attribuutin arvojen on oltava samat. Arvojen on oltava
yksikäsitteisiä, joten otsikko voi viitata ainoastaan yhteen lomake-elementtiin.
<label for="nimi">Nimi:</label>
<input id="nimi" type="text" name="nimi" />
- Tekstikentät, valintalistat ja tekstialueet: otsikko ennen kenttää tai sen yläpuolella.
- Valintaruudut ja valintanapit: otsikko kentän jälkeen, koska ruutu luetaan ensin ja sen merkitys vasta sitten.
Vertaile molempia tapoja esimerkkisivulla.
placeholder ei ole otsikko
placeholder-attribuutin teksti katoaa heti kun käyttäjä alkaa
kirjoittaa, sen kontrasti on tyypillisesti heikko, eivätkä kaikki apuvälineet lue
sitä. Sitä ei siis saa käyttää label-elementin sijasta, vaan
korkeintaan sen lisänä esimerkkinä vaadittavasta muodosta.
5. input-elementti
input-elementti on monipuolinen lomake-elementti, jonka
type-attribuutin arvoa vaihtamalla saadaan käyttöön erilaisia kenttiä.
Se on void-elementti,
joten se suljetaan kauttaviivalla eikä sillä ole lopetustagia.
5.1 Yleiset ominaisuudet
| Attribuutti | Merkitys |
|---|---|
name |
Antaa kentälle nimen. Nimen hyöty näkyy vasta lomakkeen käsittelyssä,
koska kentän arvo lähetetään käsittelijälle muodossa
name=arvo |
value |
Antaa kentälle oletusarvon, joka näkyy valmiiksi kentässä. Valintaruudussa
ja valintanapissa value on se arvo, joka lähetetään, jos kohta on
valittuna |
id |
Yksikäsitteinen tunniste, johon viitataan
label-elementin
for-attribuutilla |
size |
Kentän näkyvä leveys merkkeinä. Vaikuttaa vain tyyppeihin
text, search, url, tel,
email ja password. Ei rajoita syötettävän tekstin
pituutta, ja nykyään leveys kannattaa määritellä mieluummin CSS:llä |
Seuraavassa lyhyt esimerkki name- ja value-attribuutin
käytöstä:
<input type="text" name="kokonimi" value="Etunimi Sukunimi" />
Jos edellisen esimerkin lomakkeen tiedot lähetetään käsittelijälle
oletusasetuksilla, tiedot ovat muotoa name=value:
kokonimi=Etunimi+Sukunimi
tabindex-attribuuttia
Vanhoissa ohjeissa neuvotaan määrittelemään kenttien läpikäyntijärjestys
tabindex-attribuutilla. Positiivisia arvoja ei pidä käyttää:
ne irrottavat kentän sivun luonnollisesta järjestyksestä ja aiheuttavat enemmän
ongelmia kuin ratkaisevat, etenkin jos sivulle myöhemmin lisätään kenttiä. Jos
järjestys ei ole looginen, korjaa elementtien järjestys koodissa. Silloin järjestys
on oikea sekä näppäimistöllä että ruudunlukijalla.
5.2 input-elementin tyyppejä
type-attribuutilla määritellään kentän käyttötarkoitus. Oikean tyypin
valinta kannattaa: selain osaa tarjota sopivan syöttötavan, mobiililaite avaa oikean
näppäimistön ja selain tarkistaa arvon muodon automaattisesti.
| Tyyppi | Käyttötarkoitus |
|---|---|
text | Vapaamuotoinen yksirivinen tekstikenttä |
password | Kuten tekstikenttä, mutta merkit näkyvät pisteinä |
checkbox | Valintaruutu. Useita valittavissa |
radio | Valintanappi. Ryhmästä valitaan yksi |
submit | Lähettää lomakkeen tiedot käsittelijälle |
reset | Tyhjentää lomakkeen. Älä käytä |
file | Tiedoston lähettämistä varten |
hidden | Piilotettua tietoa varten |
image | Painike, jonka tilalla on kuva |
button | Painike, joka ei oletuksena tee mitään |
email | Sähköpostiosoite. Selain tarkistaa muodon |
url | WWW-osoite. Selain tarkistaa muodon |
tel | Puhelinnumero. Ei tarkista muotoa, mutta avaa numeronäppäimistön |
search | Hakukenttä |
number | Numero. Käytä vain, kun arvo on todella luku, jolla lasketaan |
range | Liukusäädin väliltä |
date, time, datetime-local, month, week | Päivämäärän ja ajan valitsimet |
color | Värivalitsin |
type="number"-kenttää
Se sopii määrille ja mitoille, muttei numerosarjoille kuten postinumerolle,
puhelinnumerolle tai tilinumerolle. Numerokenttä hyväksyy miinusmerkin ja
eksponenttimerkinnän, hylkää alkunollat ja reagoi hiiren rullaan. Käytä niissä
tyyppiä text tai tel ja rajoita muotoa
pattern-attribuutilla.
5.3 input-elementin attribuutteja
| Attribuutti | Merkitys |
|---|---|
required | Määrää kentän pakolliseksi. Selain estää lähetyksen, jos kenttä on tyhjä |
maxlength, minlength | Merkkien enimmäis- ja vähimmäismäärä. Koskee tekstipohjaisia tyyppejä ja textarea-elementtiä |
min, max | Pienin ja suurin sallittu arvo numero-, päivämäärä- ja aikakentissä |
step | Sallittu askel. Jos min="0", max="100" ja step="10", arvoksi kelpaavat 0, 10, 20 ja niin edelleen |
pattern | Säännöllinen lauseke, jota vastaan syötetty arvo tarkistetaan |
placeholder | Kentässä näkyvä vinkki vaadittavasta muodosta. Ei korvaa otsikkoa |
checked | Kertoo valintaruudun tai -napin olevan oletuksena valittu (checked="checked") |
readonly | Kenttää ei voi muokata, mutta sen arvo lähetetään |
disabled | Kenttä on pois käytöstä eikä sen arvoa lähetetä lainkaan |
list | Viittaa datalist-elementtiin, jonka sisältöä ehdotetaan kenttään |
autocomplete | Kertoo selaimelle, mitä tietoa kenttään kuuluu, jolloin selain osaa täyttää sen. Katso luku 5.4 |
inputmode | Vihje mobiililaitteen näppäimistölle, esimerkiksi numeric tai email |
autofocus | Asettaa kentän aktiiviseksi sivun latautuessa. Käytä korkeintaan yhdessä kentässä ja vain, jos lomake on sivun pääasia |
multiple | Sallii useamman arvon. Koskee vain tyyppejä email ja file |
5.4 autocomplete – anna selaimen täyttää kentät
autocomplete-attribuutti kertoo selaimelle, mitä tietoa kenttään
kuuluu. Silloin selain osaa tarjota käyttäjän aiemmin tallentamia tietoja oikeisiin
kenttiin. Tämä nopeuttaa täyttämistä huomattavasti ja auttaa erityisesti käyttäjiä,
joille kirjoittaminen on työlästä. Se on myös saavutettavuusvaatimus.
<label for="etunimi">Etunimi</label>
<input id="etunimi" type="text" name="etunimi" autocomplete="given-name" />
<label for="sposti">Sähköposti</label>
<input id="sposti" type="email" name="sposti" autocomplete="email" />
<label for="postinro">Postinumero</label>
<input id="postinro" type="text" name="postinro" autocomplete="postal-code" />
Tavallisimpia arvoja ovat name, given-name,
family-name, email, tel,
street-address, postal-code, country ja
bday. Arvo off estää täydennyksen; sitä kannattaa käyttää
vain harvoin, esimerkiksi kertakäyttöisissä koodikentissä.
5.5 Tekstikenttä – text
text-arvo luo yksirivisen tekstisyöttökentän. Syöttökentän pituutta ei
ole oletuksena rajoitettu, joten riville voi syöttää tekstiä kohtuullisen paljon.
Syötteen pituutta voi rajoittaa maxlength-attribuutilla ja muotoa
pattern-attribuutilla.
Seuraavassa esimerkissä kysytään postinumeroa, joka on Suomessa aina viisi numeroa:
<label for="postinro">Postinumero</label>
<input id="postinro" type="text" name="postinro"
inputmode="numeric" pattern="[0-9]{5}" maxlength="5"
autocomplete="postal-code"
placeholder="40100" required="required" />
Huomaa, että type="number" ei sovi postinumerolle: se hylkäisi
alkunollan, joka kuuluu moneen postinumeroon.
5.6 Salasanakenttä – password
password-arvo luo tekstikentän, jossa syötettyjen merkkien tilalla
näytetään piste tai tähti. Tämä ei salaa mitään: kenttään kirjoitettu
teksti lähetetään käsittelijälle sellaisenaan. Ainoa suoja on se, että yhteys
salataan, eli osoitteen on oltava https.
<label for="salasana">Salasana</label>
<input id="salasana" type="password" name="salasana"
autocomplete="current-password" required="required" />
5.7 Valintaruutu – checkbox
checkbox-arvo tekee elementistä valintaruudun. Valintaruudut ovat
neliön muotoisia kenttiä, joita käyttäjä voi valita päälle tai pois päältä. Ruutuja
voi valita useita, joten ne eivät ole toisensa poissulkevia kuten valintanapit.
Kaikkien valittujen arvot lähetetään.
Saman ryhmän valintaruuduilla on sama name-attribuutin arvo, ja
kullakin oma value. checked-attribuutilla ruutu voidaan
valita oletuksena (checked="checked").
<fieldset>
<legend>Mitä lemmikkejä sinulla on?</legend>
<input id="kissa" type="checkbox" name="lemmikit" value="kissa" />
<label for="kissa">Kissa</label>
<input id="koira" type="checkbox" name="lemmikit" value="koira" />
<label for="koira">Koira</label>
</fieldset>
5.8 Valintanappi – radio
radio-arvo tekee elementistä valintanapin. Valintanappi on pyöreä
kenttä. Käyttäjä voi valita saman ryhmän napeista ainoastaan yhden, koska uuden
valinnan tekeminen poistaa edellisen.
Kaikkien samaan ryhmään kuuluvien valintanappien
name-attribuutin arvon on oltava sama. Jos arvot eroavat,
napit eivät kuulu samaan ryhmään ja niitä voi valita useita, vaikka ne näyttäisivät
ryhmältä.
fieldset-elementin
Yksittäisen napin otsikko kertoo vain sen oman vaihtoehdon. Itse kysymys, johon
napeilla vastataan, välittyy ruudunlukijalle ainoastaan
legend-elementin kautta. Ilman sitä käyttäjä
kuulee vaihtoehdot mutta ei kysymystä.
<fieldset>
<legend>Kuinka usein käytät palvelua?</legend>
<input id="usein" type="radio" name="tiheys" value="usein" />
<label for="usein">Viikoittain</label>
<input id="harvoin" type="radio" name="tiheys" value="harvoin" />
<label for="harvoin">Harvemmin</label>
</fieldset>
5.9 Lähetä-painike, tyhjennyspainike ja piilokenttä
submit-arvo luo painikkeen, jolla lomakkeen tiedot lähetetään
käsittelijälle. Painikkeen teksti tulee value-attribuutista.
<input type="submit" name="laheta" value="Lähetä kommenttisi" />
reset-arvo luo painikkeen, joka tyhjentää lomakkeen kentät ja
palauttaa oletusarvot. Käyttäjä ei koskaan halua tyhjentää huolella täyttämäänsä
lomaketta, mutta osuu painikkeeseen helposti vahingossa lähetyspainikkeen vierestä.
Poikkeuksena on esitäytetty lomake, jossa alkuperäisten arvojen palauttaminen on
aidosti hyödyllistä; silloinkin painikkeen sijoittelu on mietittävä tarkkaan.
<input type="reset" name="tyhjenna" value="Tyhjennä lomake" />
hidden-arvo luo piilotetun kentän, jota ei näytetä käyttäjälle.
Piilokentällä voidaan välittää tietoa, joka on tarpeen käsittelyssä mutta jota on turha
näyttää lomakkeella. Piilokenttään ei saa sijoittaa salaista tietoa,
koska kenttä ja sen arvo näkyvät sivun lähdekoodissa kenelle tahansa.
<input type="hidden" name="lomake_id" value="L0011" />
6. Tekstialue – textarea
textarea-elementti on useampirivinen vapaamuotoinen tekstikenttä. Sitä
kannattaa käyttää vapaamuotoisten tekstien kirjoittamiseen, koska useammalle riville
kirjoittaminen on mielekkäämpää kuin yhdelle.
textarea-elementillä ei ole value-attribuuttia,
vaan oletussisältö kirjoitetaan elementin sisään. Se ei myöskään ole void-elementti,
joten se on aina suljettava lopetustagilla.
<label for="kommentti">Vapaat kommentit</label>
<textarea id="kommentti" name="kommentti" rows="5" cols="40"></textarea>
| Attribuutti | Merkitys |
|---|---|
rows | Näkyvien rivien lukumäärä. Ei rajoita kirjoitettavien rivien määrää; ylimääräiset rivit saa näkyviin vierittämällä |
cols | Näkyvän rivin pituus keskimääräisinä merkkeinä. Ei rajoita riville kirjoitettavien merkkien määrää |
maxlength | Merkkien enimmäismäärä |
Koon voi määritellä myös CSS:llä, jolloin se skaalautuu paremmin eri näyttökokoihin.
7. Valintalista – select
Valintalista on yksi- tai useampivalintainen alasvetovalikko. Käyttötilanteet ovat samanlaisia kuin valintanapeilla ja valintaruuduilla, mutta valintalista vie vähemmän tilaa.
- Säästää tilaa
radio- jacheckbox-elementteihin verrattuna. - Monivalinta on mahdollinen, mutta monille käyttäjille vaikea, koska se vaatii Ctrl-näppäimen käyttöä.
- Ryhmittely
optgroup-elementillä selkeyttää pitkää listaa. - Hyvin pitkät valintalistat ovat käytettävyydeltään huonoja. Alle viisi vaihtoehtoa kannattaa yleensä esittää valintanappeina, jolloin kaikki vaihtoehdot näkyvät kerralla.
Valintalista luodaan select-elementillä, ja sen sisään tulee vähintään
yksi option-elementti.
<label for="paikkakunta">Paikkakunta</label>
<select id="paikkakunta" name="paikkakunta">
<option value="">Valitse</option>
<option value="jkl">Jyväskylä</option>
<option value="tre">Tampere</option>
</select>
| Attribuutti | Merkitys |
|---|---|
name | Listan nimi |
size | Näkyvillä olevien vaihtoehtojen lukumäärä. Arvolla 1 tai ilman attribuuttia lista näkyy alasvetovalikkona, suuremmalla arvolla avoimena listana, jota vieritetään |
multiple | Sallii useamman vaihtoehdon valitsemisen yhtä aikaa |
7.1 option-elementti
option-elementillä määritellään valintalistan vaihtoehdot. Näkyville
tuleva teksti kirjoitetaan elementin sisään. option ei ole
void-elementti, joten sitä ei saa kirjoittaa muodossa
<option ... />.
value-attribuutti kertoo, mikä arvo lähetetään käsittelijälle. Jos sitä ei ole, lähetetään elementin sisältö sellaisenaan.selected-attribuutti valitsee vaihtoehdon oletuksena (selected="selected").
7.2 Valintalistan ryhmittely – optgroup
optgroup-elementillä valinnat saadaan ryhmiteltyä pienempiin ja
selkeämpiin kokonaisuuksiin. label-attribuutilla määritellään otsikko
koko ryhmälle.
<select id="ruokapaikka" name="ruokapaikka">
<optgroup label="Pizza">
<option value="kotipizza">Kotipizza</option>
<option value="rosso">Rosso</option>
</optgroup>
<optgroup label="Burger">
<option value="hese">Hesburger</option>
</optgroup>
</select>
7.3 Ehdotuslista – datalist
datalist-elementti tarjoaa tekstikenttään ehdotuksia, mutta sallii myös
muun arvon kirjoittamisen. Se on eri asia kuin select, jossa käyttäjä voi
valita vain annetuista vaihtoehdoista. Kenttä yhdistetään listaan
list-attribuutilla, jonka arvo on listan id.
<label for="kaupunki">Kaupunki</label>
<input id="kaupunki" type="text" name="kaupunki" list="kaupungit" />
<datalist id="kaupungit">
<option value="Jyväskylä"></option>
<option value="Tampere"></option>
<option value="Oulu"></option>
</datalist>
8. Ryhmittely – fieldset ja legend
fieldset-elementillä ryhmitellään lomakkeen kentät loogisiksi
kokonaisuuksiksi. Ryhmittely havainnollistaa käyttäjälle, mitä kokonaisuutta kysytään,
ja se on ainoa tapa kertoa ruudunlukijalle valintanappi- tai valintaruuturyhmän
kysymys.
legend-elementti on ryhmän otsikko, ja sen on oltava
fieldset-elementin ensimmäinen lapsi. Myös sisäkkäiset
ryhmittelyt ovat mahdollisia.
<fieldset>
<legend>Yhteystiedot</legend>
<label for="nimi">Nimi</label>
<input id="nimi" type="text" name="nimi" autocomplete="name" />
<label for="sposti">Sähköposti</label>
<input id="sposti" type="email" name="sposti" autocomplete="email" />
</fieldset>
9. button – yleispainike
button-elementti on yleinen painike. Sillä voi olla kolme tyyppiä:
submit lähettää lomakkeen, reset tyhjentää sen ja
button ei oletuksena tee mitään.
button-elementin etu input type="submit"-kenttään
verrattuna on, että sen sisään voi laittaa muutakin kuin pelkkää tekstiä, esimerkiksi
kuvan. Haittana on, että type-attribuutti on muistettava
kirjoittaa: ilman sitä painike toimii lähetyspainikkeena, mikä yllättää
usein.
<button name="laheta" type="submit">
<img src="kuva.png" alt="" /> Lähetä
</button>
Esimerkissä kuvan alt-teksti on tyhjä, koska painikkeen merkitys
selviää jo sen tekstistä. Jos painikkeessa on pelkkä kuva, kuvalle on annettava
alt-teksti, joka kertoo mitä painike tekee.
10. Selaimen sisäänrakennettu tarkistus
Selain osaa tarkistaa lomakkeen kentät ennen lähetystä ilman mitään ohjelmointia. Tarkistus perustuu kenttien tyyppiin ja muutamaan attribuuttiin. Jos jokin kenttä ei kelpaa, selain estää lähetyksen, siirtää kohdistuksen ensimmäiseen virheelliseen kenttään ja näyttää siitä viestin omalla kielellään.
| Attribuutti | Tarkistaa | Esimerkki |
|---|---|---|
required | Kenttä ei saa olla tyhjä | required="required" |
type | Arvon muoto tyypeissä email, url ja number | type="email" |
min, max | Arvo on sallitulla välillä | min="1" max="120" |
minlength, maxlength | Merkkien lukumäärä | maxlength="5" |
pattern | Arvo vastaa säännöllistä lauseketta | pattern="[0-9]{5}" |
step | Arvo on sallitun askeleen mukainen | step="0.5" |
<label for="ika">Ikä vuosina</label>
<input id="ika" type="number" name="ika"
min="0" max="120" step="1" required="required" />
Selaimen virheilmoitus tulee vasta, kun käyttäjä on jo yrittänyt lähettää lomakkeen. Kirjoita siksi vaatimus näkyviin jo kentän kohdalle: mitkä kentät ovat pakollisia ja missä muodossa arvo halutaan. Pelkkä tähti pakollisen kentän perässä ei riitä, ellei jossain kerrota mitä tähti tarkoittaa.
pattern-attribuutin kanssa kannattaa aina käyttää myös
title-attribuuttia, koska selain näyttää sen sisällön osana
virheilmoitusta. Se ei kuitenkaan korvaa näkyvää ohjetta.
Tarkistus tapahtuu käyttäjän omassa selaimessa, ja sen voi ohittaa täysin
helposti. Se on käytettävyysominaisuus, joka auttaa käyttäjää huomaamaan
kirjoitusvirheen ajoissa. Vastaanottavan ohjelman on aina tarkistettava
saamansa tiedot itse. Attribuutti novalidate
form-elementissä poistaa selaimen tarkistuksen käytöstä kokonaan.
11. Esimerkkejä
| Elementti | Koodi |
|---|---|
| Kentän otsikko ja tekstikenttä | <label for="lempinimi">Lempinimi</label> |
| Salasana | <label for="salasana">Salasana</label> |
| Valintaruutu | <input id="kissa" type="checkbox" name="lemmikit" value="kissa" checked="checked" /> |
| Valintanappi | <input id="usein" type="radio" name="tiheys" value="usein" /> |
| Tekstialue | <label for="txtalue">Vapaat kommentit</label> |
| Ryhmittely | <fieldset><legend>Yhteystiedot</legend> ... </fieldset> |
| Tiedostokenttä | <label for="tiedosto">Valitse tiedosto</label> |
| Piilokenttä | <input type="hidden" name="ohjaus" value="lomake8" /> |
| Lähetä-painike | <input type="submit" name="laheta" value="Lähetä tiedot" /> |
| Hakukenttä | <input id="haku" type="search" name="haku" /> |
| Puhelinnumero | <input id="puh" type="tel" name="puhnro" autocomplete="tel" /> |
| Numero | <input id="paino" type="number" name="paino" min="1" max="200" step="0.1" /> |
| Liukusäädin | <input id="ika" type="range" name="ika" min="1" max="120" step="1" value="30" /> |
| Päivämäärä | <input id="pvm" type="date" name="pvm" /> |
| Aika | <input id="klo" type="time" name="aika" /> |
| Väri | <input id="vari" type="color" name="vari" /> |
| Sähköpostiosoite | <input id="email" type="email" name="email" autocomplete="email" /> |
12. Lomakkeen käytettävyys ja saavutettavuus
Lomake on sivuston vaikein osa käyttää. Seuraavat asiat ratkaisevat suurimman osan ongelmista.
12.1 Rakenne
- Jokaisella kentällä on
label, joka on yhdistetty kenttään joko kapseloimalla taifor- jaid-attribuuteilla. Tarkista yhdistyminen napsauttamalla otsikkoa: kohdistuksen pitäisi siirtyä kenttään. - Ryhmittele samaan asiaan liittyvät kentät
fieldset- jalegend-elementeillä ja valintalistan kohdatoptgroup-elementillä. - Vältä taulukkoa lomakkeen asettelussa. Asettelu tehdään CSS:llä. Taulukkoon aseteltu lomake hajoaa kapealla näytöllä ja johtaa helposti siihen, että otsikko ja kenttä eivät yhdisty.
- Kentät siihen järjestykseen, jossa ne täytetään. Silloin
järjestys on oikea myös sarkainnäppäimellä liikuttaessa, eikä
tabindex-attribuuttia tarvita. - Lähetyspainike viimeiseksi.
- Lomakkeeseen vain lomake-elementit ja niihin liittyvät täyttöohjeet.
12.2 Ohjeet käyttäjälle
- Kerro ennen lomaketta kaikki täytössä tarvittavat tiedot: mihin tietoja käytetään, kauanko täyttäminen kestää ja mitä tapahtuu lähetyksen jälkeen.
- Kerro ennen kenttää, mitä siihen syötetään ja missä muodossa.
Kirjoita ohje näkyväksi tekstiksi äläkä
title-attribuuttiin: vihjeteksti ei näy kosketuslaitteilla eikä näppäimistöllä liikuttaessa, eivätkä kaikki apuvälineet lue sitä. - Jos ohje on pitkä, liitä se kenttään
aria-describedby-attribuutilla, jolloin ruudunlukija lukee sen kentän kohdalla. - Merkitse pakolliset kentät näkyvästi ja kerro, mitä merkintä tarkoittaa.
- Lisää kenttiin järkevät oletusarvot silloin, kun jokin arvo on selvästi tavallisin.
<label for="tunnus">Käyttäjätunnus</label>
<p id="tunnus-ohje">Vähintään kuusi merkkiä, vain kirjaimia ja numeroita.</p>
<input id="tunnus" type="text" name="tunnus"
aria-describedby="tunnus-ohje"
pattern="[A-Za-z0-9]{6,}" required="required" />
12.3 Vältä näitä
| Älä tee näin | Tee näin |
|---|---|
placeholder ainoana otsikkona | Näkyvä label ja tarvittaessa placeholder sen lisäksi |
Ohje pelkässä title-attribuutissa | Näkyvä teksti ja aria-describedby |
Positiivinen tabindex | Oikea järjestys koodissa |
accesskey-pikanäppäimet | Ei mitään. Ne törmäävät selainten ja apuvälineiden omiin pikanäppäimiin |
| Tyhjennyspainike | Pelkkä lähetyspainike |
Valintanapit ilman fieldset-elementtiä | fieldset ja legend ryhmän ympärille |
| Pitkä valintalista kuukausille tai päiville | Tekstikenttä tai type="date" |
| Kenttien pakottaminen tiettyyn muotoon ilman ohjetta | Kerro vaadittu muoto ennen kenttää |
12.4 Ohjeita ja vihjeitä lomakkeiden suunnitteluun
- MDN: Web forms ja Client-side form validation.
- Creating Accessible Forms (WebAIM).
- Forms Tutorial (W3C Web Accessibility Initiative).
- Esteettömyysopas (TIEKE).
- Saavutettavuusvaatimukset.fi.
13. Lomaketietojen käsittely
Lomakkeen elinkaari menee näin:
- Selain pyytää palvelimelta lomakesivun.
- Palvelin toimittaa sivun selaimelle.
- Käyttäjä täyttää ja lähettää lomakkeen.
- Selain lähettää tiedot palvelimella suoritettavalle ohjelmalle.
- Ohjelma käsittelee tiedot ja palauttaa käyttäjälle vastauksen.
Käsittelijäohjelma voi tehdä esimerkiksi seuraavia asioita:
- Käsitellä erikoismerkit, kuten ääkköset ja rivinvaihdot.
- Tarkistaa syötteen: onko kenttä oikean muotoinen, onko kaikkiin kohtiin vastattu.
- Tallentaa tiedot tietokantaan, lähettää ne sähköpostitse tai liittää ne osaksi www-sivua.
- Palauttaa käyttäjälle varmistuksen onnistumisesta, tiedon virheistä tai yhteenvedon lähetetystä sisällöstä.
Lomakkeen tietojen käsitteleminen edellyttää joko oman ohjelman kirjoittamista tai valmiin käsittelijän käyttämistä. Tällä kurssilla käytetään vain valmista käsittelijää. Omia käsittelijöitä ohjelmoidaan kursseilla TIEA2120 ja TIES4080.
14. Lähettämisessä käytettävät tavat
Tietojen lähettämiseen on kaksi metodia, post ja get.
Kummallakin on oma käyttökohteensa, ja ero huomioidaan myös vastaanottavassa
ohjelmassa.
| post | get | |
|---|---|---|
| Missä tiedot kulkevat | Pyynnön rungossa, eivät näy osoiterivillä | Osoiterivillä kysymysmerkin jälkeen |
| Tietomäärä | Suuretkin määrät, myös tiedostot | Rajallinen |
| Voiko osoitteen tallentaa kirjanmerkiksi | Ei | Kyllä, ja sen voi myös jakaa toiselle |
| Käytä, kun | Lomake muuttaa, lisää tai poistaa tietoja, tai lähetettävät tiedot ovat arkaluontoisia | Lomake tekee haun tai muun toiminnon, joka ei muuta mitään |
<form action="https://palvelin.example/cgi-bin/kasittelija.cgi" method="post">
<form action="https://palvelin.example/haku" method="get">
Jos lomake tallentaa tai muuttaa jotain, käytä
post-metodia. Jos lomake vain hakee tai suodattaa,
käytä get-metodia. Harjoitustyön palautelomake tallentaa tietoa, joten
siinä käytetään post-metodia.
Hakulomake puolestaan käyttää aina
get-metodia.
get jättää jäljen
GET-metodilla lähetetyt tiedot päätyvät osoiteriville, selaimen historiaan ja palvelimen lokitiedostoihin. Älä koskaan lähetä sillä salasanoja tai henkilötietoja.
15. Harjoitustyössä käytettävä käsittelijäohjelma
Harjoitustyössä käytettävä ohjelma on asennettu valmiiksi kurssipalvelimelle.
Aseta lomakkeesi action-attribuutin arvoksi:
https://appro.mit.jyu.fi/cgi-bin/view.cgi
Käsittelijä näyttää lomakkeelle syötetyt tiedot mutta ei tallenna niitä minnekään.
<form action="https://appro.mit.jyu.fi/cgi-bin/view.cgi" method="post">
<fieldset>
<legend>Palaute</legend>
<label for="nimi">Nimi</label>
<input id="nimi" type="text" name="nimi" autocomplete="name" />
<label for="viesti">Viesti</label>
<textarea id="viesti" name="viesti" rows="5" cols="40"></textarea>
</fieldset>
<p><input type="submit" name="laheta" value="Lähetä" /></p>
</form>
Sivusi on https-osoitteessa. Jos kirjoitat
action-attribuuttiin http-alkuisen osoitteen, selain estää
lähetyksen sekasisältönä (mixed content) eikä lomake toimi. Vika ei näy sivulla
mitenkään; ilmoitus tulee vain kehittäjätyökalujen konsoliin.
16. Hakulomake
Sivustohaun toteuttaminen itse vaatii melko hyvää ohjelmointitaitoa. Valmiita
palveluita voi kuitenkin käyttää: hakukoneelle tehdään lomake, joka rajaa haun omille
sivuille. Hakulomake käyttää aina get-metodia,
koska haku ei muuta mitään ja hakutuloksen osoitteen halutaan olevan jaettavissa.
Nykyisin sivustohaun saa tehtyä Google Programmable Search Engine -palvelulla, joka antaa valmiin hakulomakkeen omalle sivustolle rajattuna.
Google ei kovin avoimesti mainosta, että haun voi kohdistaa vain tiettyyn osoitteeseen, mutta seuraava tapa toimii edelleen.
-
Lisää sivullesi uusi lomake:
<form action="https://www.google.com/search" method="get"> <div> <label for="hakusanat">Hakusanat</label> <input type="search" size="20" id="hakusanat" name="q" value="" /> <input type="submit" value="Hae" /> </div> </form>actionviittaa Googlen hakuohjelmaan.- Kentän
name="q"viittaa hakusanoihin, jotka välitetään hakuohjelmalle. method="get", koska haku ei muuta mitään ja hakutuloksen osoitteen pitää olla jaettavissa. Katso lomakeluennon luku 14.
- Kokeile, miten haku toimii.
-
Rajoitetaan haku vain kurssin osoitteeseen. Lisää lomakkeen sisään piilokenttä:
<input type="hidden" name="as_q" value="site:appro.mit.jyu.fi/itkp1011/" />hidden-tyyppistä kenttää ei näytetä sivulla.as_qlisää muiden hakusanojen lisäksi uuden hakutermin.site:-määreellä haku rajataan tiettyyn sivustoon. Osoitteen on tultava heti kaksoispisteen jälkeen ilman välilyöntiä.
-
Kokeile hakua.
Omille sivuille tehdyissä hauissa käy joskus niin, ettei hakukone löydä yhtään tulosta millään hakusanalla. Syynä on se, ettei sivua ole vielä indeksoitu. Automaattinen indeksointi edellyttää yleensä, että jo indeksoidulta sivulta on linkki sivullesi, ja indeksointi tapahtuu viiveellä.
Käyttäjien kommentit