Rivinvaihdot ja kappaleet datan käsittelyssä, luku 3 Erityisongelmia:

Rivinvaihdot HTML-lomakkeiden syöttökentissä

HTML-kielellä tehdyissä lomakkeissa Web-sivuilla voi olla muun muassa seuraavanlaisia kenttiä:

  • kenttä yhden tekstirivin syöttöä varten (input type="text")
  • kenttä monirivisen tekstin syöttöä varten (textarea)
  • kenttä lomakkeen lähettämistä varten (input type="submit")

Return- tai enter-näppäimen painamisella eri kentissä voi olla hyvin erilaisia vaikutuksia. Kyse ei varsinaisesti ole rivinvaihtokoodeista vaan näppäimistä, mutta on olennaista, milloin rivinvaihtonäppäimen painaminen aiheuttaa rivinvaihtokoodin sisällyttämisen lomakedataan ja milloin ei.

Tämä on pelkkä demolomake, jossa on ohessa mainitut kenttätyypit.

Tekstirivin syötössä alkuperäisenä ideana oli se, että jos lomakkeessa on vain yksi tekstinsyöttökenttä, selain voisi käsitellä return- tai enter-näppäimen painalluksen lomakkeen lähettämispyyntönä. Tämä ei aiheuta mitään rivinvaihtokoodia lähtevään lomakedataan (esim. hakusanoihin). Tämä sopii hyvin yksinkertaisiin hakulomakkeisiin:

Sonera Plaza -haku.

Tällöin on huomattava, että jos lomakkeessa olisi esimerkiksi valintanapeilla valittavia vaihtoehtoja, jotka tarkemmin ohjaavat hakua, käyttäjä saattaa tulla lähettäneeksi lomakkeen liian aikaisin. Hän ehkä ajatteli kirjoittaa ensin hakusanat ja sitten kiinnittää huomionsa nappeihin, mutta "vaistonvaraisesti" lopetti tekstin kirjoittamisen enterillä. Hakulomakkeissa tämä ei ole kovin vakavaa, koska haun voi uusia, mutta se voi olla ikävää, jos lomakkeella tilattiin auto ja oletusarvona oli Rolls Royce.

Erityisiä hankaluuksia on aiheuttanut se, että Internet Exploreriin tuli versiossa 4 "parannus": edellä kuvattu idea toimii myös silloin, kun lomakkeessa on useita tekstirivikenttiä. Tämä saattaa joissakin erikoistapauksissa; ks. esim. lomakettani nyyseistä tehtäviä hakuja varten, jota tämän ansiosta voi IE:llä käyttää niin, että esim. kirjoittaa vain meiliosoitteen yhteen kenttään ja painaa enteriä, jolloin saa listan artikkeleista, joiden From-kentässä on kyseinen osoite. Mutta yleisesti tämä piirre on erittäin huono. Ks. Alan Flavellin kirjoitusta Submit form by hitting ENTER? Käytännössä

Yleisemmin tällainen enterin tai returnin käyttö on esimerkki kyseisten näppäinten käytöstä valintaan tai vahvistukseen. Tämä saattaa olla jossain määrin hämäävää, koska sillä loogisesti ottaen ei ole rivinvaihdon kanssa muuta tekemistä kuin että voidaan tulkita, että kyse on tyhjän rivin syöttämisestä. Esimerkiksi tekstipohjaisissa käyttöliittymissä on tavallista, että valikosta valitaan vaihtoehto menemällä sen kohdalle ja painamalla enteriä. (Toinen tavallinen vaihtoehto on välilyöntinäppäin, mutta tämä tietysti riippuu ohjelmasta.) Vastaavasti ohjelma saattaa kysyä vahvistusta jonkin toimenpiteen suorittamiselle, oletusarvojen hyväksymiselle tms. siten, että pelkän enterin painaminen merkitsee vahvistusta. Tilanteesta riippuu, onko tämä mielekästä. Varmempi varmistus on toki sellainen, jossa käyttäjän pitää kirjoittaa esim. yes ja painaa enteriä. Mitä tärkeämmästä toimenpiteestä on kyse, sitä hyväksyttävämpää on vaatia ylimääräistä näpyttelyä.

Monirivisessä tekstikentässä perusajatuksena on mahdollistaa mielivaltaisen tekstimäärän syöttö. Käytännössä selaimet asettavat tälle joitakin rajoituksia. Mutta erityisesti ideana on, että textarea-elementin rows- ja cols-määrite ilmoittavat vain näkyvän alueen koon; sekin on sarakkeiden määrän osalta lähinnä viitteellinen ainakin silloin, kun kirjasimet eivät ole tasalevyisiä. Tarkoitus ja joidenkin selainten käytäntö on, että käyttäjä voi kirjoittaa mielivaltaisen pitkiä rivejä ja niin monta riviä kuin haluaa, vaikka tämä "rullauksen" takia voikin olla hankalaa, jos näkyvän alueen koko ylitetään. Kun käyttäjä kirjoittaessaan vaihtaa riviä (painaa returnia tai enteriä), dataan tulee mukaan rivinvaihtokoodi. Sen esitys on tässä yhteydessä lisäksi tarkoin määritelty, siitä riippumatta, mikä on käytetyn tietokonejärjestelmän "oma" esitysmuoto: CR LF, jonka selain lomakedataa koskevien koodaussääntöjen mukaan esittää ns. URL-koodatussa muodossa %0D%0A. Lomaketta käsittelevä ohjelma yleensä "näkee" tämän datan kuitenkin sellaisen liitynnän kautta, että ohjelmassa voidaan suoraan testata rivinvaihtoa tyyliin if(merkki=='\n') (tietenkin kunkin ohjelmointikielen sääntöjen mukaan). Yksityiskohdat riippuvat siitä, millaisia rutiineita käytetään, mutta edellä sanottu pätee esim. yleisesti käytettyyn CGI.pm-moduliin.

Valitettavasti ainakin Internet Explorer ja Opera toimivat väärin. Ne jakavat tekstiä eri riveille omia aikojaan (tekstinkäsittelyohjelmien tapaan). Tosin tämä koskee vain näkyvää esitysmuotoa, sillä itse lomakedataan ne eivät sisällytä mitään tästä johtuvia rivinvaihtoja. Mutta tästä seuraa, että käyttäjä ei näe, mikä on hänen kirjoittamansa ja siten itse datan mukana lähtevä rivinvaihto.

Asia voidaan korjata IE:n osalta lisäämällä textarea-elementtiin määrite wrap="off". Tällainen määrite ei kuulu mihinkään HTML-spesifikaatioihin, mutta se siis tarvitaan, jos halutaan IE:n toimivan spesifikaation mukaisesti!

IE ja Netscape, ainakin niiden tarpeeksi uudet versiot, tunnistavat myös määritteen wrap="hard", mutta sen aiheuttamat ns. kovat rivinvaihdot ovat vielä pahempi vaihtoehto: selain lisäilee todellisia rivinvaihtoja dataan siten, että muun haitan lisäksi käyttäjän on mahdotonta syöttää pitempää riviä kuin cols-määrite ilmoittaa. (Lomakkeen tekijä ei tietenkään voi luottaa tällaiseen rajoitukseen, koska se on selainkohtainen ja muutenkin kierrettävissä.) - Lisätietoja wrap-määritteestä on dokumenttini How to limit the number of characters entered in a textarea in an HTML form kohdassa Implementations, especially wrapping.

Jos lomakedatan käsittelyssä halutaan huolehtia siitä, että rivit eivät ole liian pitkiä jatkokäsittelyyn mennessään, täytyy käsittelevän ohjelman joka tapauksessa varautua pilkkomaan tai katkomaan rivejä. Tarvittaessa on tietysti annettava käyttäjälle huomautus tai varoitus tai ehkä palautettava lomake korjaamista varten.

Lomakkeenlähetyskentän input type="submit" tyypillinen graafinen selain toteuttaa "nappina" (fyysistä painonappia tai nappulaa muistuttavana näyttöoliona, engl. button), ja tavallisin tapa käyttää sitä on napsauttaa (engl. click) sitä hiiren avulla. On kuitenkin mahdollista - useissa graafisissakin selaimissa - siirtyä lomakkeen kentästä toiseen sarkausnäppäintä (tab key) käyttämällä. Ja kun on tällä tavoin siirrytty lomakkeenlähetyskenttään, enterin painaminen yleisesti vastaa napsauttamista eli lähettää lomakkeen. Tämä on käytettävyyttä olennaisesti parantava seikka muun muassa siksi, että se mahdollistaa lomakkeen täyttämisen ja lähettämisen silloinkin, kun hiirtä ei ole tai sitä ei syystä tai toisesta voi käyttää.