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.

Oppimistavoitteet

Tämän luennon jälkeen sinun pitäisi osata:

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:

1.1 Lomakkeella saavutettavat hyödyt

1.2 Lomakkeen käytöstä aiheutuvat haitat

Henkilötiedot ja tietosuoja

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>

Yksinkertaisessa esimerkissä on pelkkiä tekstikenttiä (type="text"). Huomaa kolme asiaa, jotka toistuvat kaikissa hyvissä lomakkeissa:

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.

Lomakkeiden muodostamiseen käytettävät elementit.
ElementtiTarkoitus
formMuodostaa lomakkeen
labelKentän otsikko
inputMonikäyttöinen kenttä, jonka tyyppi valitaan type-attribuutilla
textareaMonirivinen tekstikenttä
select, option, optgroupValintalista ja sen vaihtoehdot
datalistEhdotuslista tekstikenttään
fieldset, legendKenttäryhmä ja sen otsikko
buttonPainike
Kuva lomakkeesta, jossa näkyvät tekstikenttä, salasanakenttä, valintaruutu, valintanappi, valintalista, tekstialue sekä lähetys- ja tyhjennyspainike
Yleisimmät lomakkeella käytettävät elementit sekä osa 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" />
Otsikon paikka riippuu kentän tyypistä

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

Kaikille kenttätyypeille yhteisiä attribuutteja.
AttribuuttiMerkitys
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
Älä käytä 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.

Käytettävissä olevat tyypit.
TyyppiKäyttötarkoitus
textVapaamuotoinen yksirivinen tekstikenttä
passwordKuten tekstikenttä, mutta merkit näkyvät pisteinä
checkboxValintaruutu. Useita valittavissa
radioValintanappi. Ryhmästä valitaan yksi
submitLähettää lomakkeen tiedot käsittelijälle
resetTyhjentää lomakkeen. Älä käytä
fileTiedoston lähettämistä varten
hiddenPiilotettua tietoa varten
imagePainike, jonka tilalla on kuva
buttonPainike, joka ei oletuksena tee mitään
emailSähköpostiosoite. Selain tarkistaa muodon
urlWWW-osoite. Selain tarkistaa muodon
telPuhelinnumero. Ei tarkista muotoa, mutta avaa numeronäppäimistön
searchHakukenttä
numberNumero. Käytä vain, kun arvo on todella luku, jolla lasketaan
rangeLiukusäädin väliltä
date, time, datetime-local, month, weekPäivämäärän ja ajan valitsimet
colorVärivalitsin
Varo 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

Kurssin kannalta tärkeimmät attribuutit.
AttribuuttiMerkitys
requiredMäärää kentän pakolliseksi. Selain estää lähetyksen, jos kenttä on tyhjä
maxlength, minlengthMerkkien enimmäis- ja vähimmäismäärä. Koskee tekstipohjaisia tyyppejä ja textarea-elementtiä
min, maxPienin ja suurin sallittu arvo numero-, päivämäärä- ja aikakentissä
stepSallittu askel. Jos min="0", max="100" ja step="10", arvoksi kelpaavat 0, 10, 20 ja niin edelleen
patternSäännöllinen lauseke, jota vastaan syötetty arvo tarkistetaan
placeholderKentässä näkyvä vinkki vaadittavasta muodosta. Ei korvaa otsikkoa
checkedKertoo valintaruudun tai -napin olevan oletuksena valittu (checked="checked")
readonlyKenttää ei voi muokata, mutta sen arvo lähetetään
disabledKenttä on pois käytöstä eikä sen arvoa lähetetä lainkaan
listViittaa datalist-elementtiin, jonka sisältöä ehdotetaan kenttään
autocompleteKertoo selaimelle, mitä tietoa kenttään kuuluu, jolloin selain osaa täyttää sen. Katso luku 5.4
inputmodeVihje mobiililaitteen näppäimistölle, esimerkiksi numeric tai email
autofocusAsettaa kentän aktiiviseksi sivun latautuessa. Käytä korkeintaan yhdessä kentässä ja vain, jos lomake on sivun pääasia
multipleSallii 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ä.

Valintanappiryhmä tarvitsee aina 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" />
Älä laita lomakkeelle tyhjennyspainiketta

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>
textarea-elementin attribuutteja.
AttribuuttiMerkitys
rowsNäkyvien rivien lukumäärä. Ei rajoita kirjoitettavien rivien määrää; ylimääräiset rivit saa näkyviin vierittämällä
colsNäkyvän rivin pituus keskimääräisinä merkkeinä. Ei rajoita riville kirjoitettavien merkkien määrää
maxlengthMerkkien 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.

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>
select-elementin attribuutteja.
AttribuuttiMerkitys
nameListan nimi
sizeNäkyvillä olevien vaihtoehtojen lukumäärä. Arvolla 1 tai ilman attribuuttia lista näkyy alasvetovalikkona, suuremmalla arvolla avoimena listana, jota vieritetään
multipleSallii 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 ... />.

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.

Tarkistukseen käytettävät attribuutit.
AttribuuttiTarkistaaEsimerkki
requiredKenttä ei saa olla tyhjärequired="required"
typeArvon muoto tyypeissä email, url ja numbertype="email"
min, maxArvo on sallitulla välillämin="1" max="120"
minlength, maxlengthMerkkien lukumäärämaxlength="5"
patternArvo vastaa säännöllistä lausekettapattern="[0-9]{5}"
stepArvo on sallitun askeleen mukainenstep="0.5"
<label for="ika">Ikä vuosina</label>
<input id="ika" type="number" name="ika"
       min="0" max="120" step="1" required="required" />
Kerro käyttäjälle vaatimus etukäteen

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.

Selaimen tarkistus ei ole tietoturvaa

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ä

Lomake-elementit esimerkkeineen.
ElementtiKoodi
Kentän otsikko ja tekstikenttä <label for="lempinimi">Lempinimi</label>
<input id="lempinimi" type="text" name="nick" maxlength="20" autocomplete="nickname" />
Salasana <label for="salasana">Salasana</label>
<input id="salasana" type="password" name="passwd" autocomplete="current-password" />
Valintaruutu <input id="kissa" type="checkbox" name="lemmikit" value="kissa" checked="checked" />
<label for="kissa">Kissa</label>
Valintanappi <input id="usein" type="radio" name="tiheys" value="usein" />
<label for="usein">Viikoittain</label>
Tekstialue <label for="txtalue">Vapaat kommentit</label>
<textarea id="txtalue" name="kommentti" rows="5" cols="40"></textarea>
Ryhmittely <fieldset><legend>Yhteystiedot</legend> ... </fieldset>
Tiedostokenttä <label for="tiedosto">Valitse tiedosto</label>
<input id="tiedosto" type="file" name="liite" accept=".pdf,.png" />
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

12.2 Ohjeet käyttäjälle

<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ä

Tavallisimmat lomakevirheet.
Älä tee näinTee näin
placeholder ainoana otsikkonaNäkyvä label ja tarvittaessa placeholder sen lisäksi
Ohje pelkässä title-attribuutissaNäkyvä teksti ja aria-describedby
Positiivinen tabindexOikea järjestys koodissa
accesskey-pikanäppäimetEi mitään. Ne törmäävät selainten ja apuvälineiden omiin pikanäppäimiin
TyhjennyspainikePelkkä lähetyspainike
Valintanapit ilman fieldset-elementtiäfieldset ja legend ryhmän ympärille
Pitkä valintalista kuukausille tai päivilleTekstikenttä tai type="date"
Kenttien pakottaminen tiettyyn muotoon ilman ohjettaKerro vaadittu muoto ennen kenttää

12.4 Ohjeita ja vihjeitä lomakkeiden suunnitteluun

13. Lomaketietojen käsittely

Lomakkeen elinkaari menee näin:

  1. Selain pyytää palvelimelta lomakesivun.
  2. Palvelin toimittaa sivun selaimelle.
  3. Käyttäjä täyttää ja lähettää lomakkeen.
  4. Selain lähettää tiedot palvelimella suoritettavalle ohjelmalle.
  5. Ohjelma käsittelee tiedot ja palauttaa käyttäjälle vastauksen.
Kaavio lomakkeen käsittelystä: selain pyytää sivun palvelimelta, käyttäjä täyttää lomakkeen, selain lähettää tiedot käsittelijäohjelmalle ja ohjelma palauttaa vastauksen
Lomakkeen tietojen kulku selaimen ja palvelimen välillä.

Käsittelijäohjelma voi tehdä esimerkiksi seuraavia asioita:

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 ja get.
postget
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">
Nyrkkisääntö

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>
Osoitteen on oltava https

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.

  1. 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>
    • action viittaa 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.
  2. Kokeile, miten haku toimii.
  3. 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_q lisää muiden hakusanojen lisäksi uuden hakutermin.
    • site:-määreellä haku rajataan tiettyyn sivustoon. Osoitteen on tultava heti kaksoispisteen jälkeen ilman välilyöntiä.
  4. Kokeile hakua.

Uudet sivut eivät löydy heti

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

Kommentoi Lisää kommentti