TODO

Tässä harjoituksessa rakennat yksinkertaisen TODO-luettelosovelluksen.

Lataa malli

todo.zip

Ohjeet

../../_images/w05ex2a.gif ../../_images/w05ex2b.gif

Yllä olevat kuvat havainnollistavat tavoitetta, jonka yritämme saavuttaa. Ensimmäinen kuva näyttää kuinka sovellus käyttäytyy, kun lisäät kohteita luetteloon ja toinen kuva näyttää mitä tapahtuu, kun napsautat luettelon yksittäisiä kohteita. Uudet kohteet liitetään luettelon loppuun lomakkeen lähettämisen jälkeen. Samaan aikaan, kun uusi kohde lisätään luetteloon, syöttökenttä tyhjennetään. Kohteen napsauttaminen merkitsee sen valmiiksi ja lisää CSS-luokan “done”, joka muuttaa kohteen tyyliä vastaavasti. Jos samaa kohdetta napsautetaan kahdesti, se poistetaan luettelosta.

HUOM: Kaikki alla olevat vaiheet eivät ole pakollisia, ja lopputulos ratkaisee. Kokeneemmille JavaScript-koodareilla jotkin vaiheet saattavat tuntua tarpeettomilta, mutta toisille niiden pitäisi osoittautua hyödyllisiksi kun välissä on muutamia tarkistuspisteitä ja joitain toimintoja rakennetaan asteittain.

1. Aloita ensin lataamalla mallitiedostot. HTML-malli huolehtii JavaScript-tiedoston lataamisesta ja sinun ei tarvitse muuttaa muuta kuin todo.js-tiedostoa. Kaikki koodisi menee todo.js tiedoston sisään, ja tämä on ainoa tiedosto, jonka palautat tässä harjoituksessa.

2. HTML-tiedostossa on kolme tärkeää elementtiä: lomakesyöttö, jonka id on “type-input”, kohdeluettelon ul-elementti, jonka id on “todo” ja itse lomake, jonka id on “form”. Sinun Ensimmäinen tehtävä on saada käsiisi kaikki nämä elementit koodisi sisällä. Jälleen, voit käyttää document.getElementById() tai document.querySelector().

3. Seuraavaksi sinun tulee ottaa käyttöön addListItem(text)-funktio. Se vastaa uusien luettelokohteiden luomisesta (li-elementit) ja lisää ne sitten luetteloon. Kuten näet, se saa argumentiksi text. Tämä on teksti jonka käyttäjä on kirjoittanut syöttökenttään. Tämän funktion pitäisi ensin luoda uusi li-elementti ja sitten laittaa teksti elementin sisään. Lopuksi funktio lisää li-elementin listan loppuun. Hyödyllisiä toimintoja tässä ovat document.createElement() ja Element.append() sekä ominaisuus textContent, jota olet käyttänyt jo edellisessä harjoituksessa. Katso: Asiakirjan muokkaaminen

4. Seuraavaksi sinun tulee toteuttaa submitHandler(e)-funktio. Tiedät jo, että tämä funktio on vastuullinen lomakkeen lähetystapahtuman keskeyttämisestä ja peruuttamisesta. Mutta tämä funktio on myös vastuussa syöttökentän arvon lukemisesta aivan kuten aiemmassa harjoituksessa. Ja jälleen tämä funktio tarkistaa, onko arvo tyhjä tai sisältää vain välilyöntejä, jolloin ei tehdä mitään. Toisaalta, jos syöttöarvo ei ole tyhjä, tämän funktion pitäisi kutsua addListItem(text)-funktiota ja välittää syötearvo argumenttina. Voit tietysti yksinkertaisesti luoda ja lisätä luettelokohteen submitHandler(e) sisään, mutta se on yleensä parempi idea erottaa kunkin funktion vastuut, jotta koodisi on helpompi ymmärtää ja ylläpitää tulevaisuudessa, jos sinun täytyy muuttaa sitä. Samasta syystä olemme nimenneet funktiot pitkillä ja kuvaavilla nimillä niin, että kuka tahansa voi koodia lukemalla heti ymmärtää, mistä kukin funktio on vastuussa. Lopuksi submitHandler(e) tulisi palauttaa syöttökentän arvo takaisin tyhjäksi merkkijonoksi.

5. Liitä submitHandler(e)-funktio lomakkeen lähetystapahtumaan. Sinun pitäisi jo tietää kuinka tämä tehdään edellisen harjoituksen perusteella.

6. Lataa sivusi uudelleen varmistaaksesi, että JavaScript-tiedostoon tekemäsi muutokset on ladattu, ja testaa ohjelmasi. Yritä lähettää tekstiä ja katso, lisätäänkö teksti oikein TODO-luetteloon ja tyhjeneekö syöttökenttä. Kokeile tätä muutaman kerran. Jos kaikki toimii, voit siirtyä seuraavaan vaiheeseen. Jos ei, sinun pitäisi nähdä joitakin virheilmoituksia selainkonsolissa. Viestistä riippuen sinun tulee yrittää paikantaa viestin lähde ja korjata se. Tässä vaiheessa todennäköisin virhelähde on addListItem(text)-funktio, mutta myös submitHandler(e) -kohdassa saattaa olla virheitä. Joka tapauksessa virheilmoitus sisältää rivin numeron, jossa virhe esiintyy. Katso: Debugging in Chrome

7. Seuraavaksi sinun tulee toteuttaa funktio listClickHandler(e), joka on tapahtumakäsittelijä ja käsittelee kaikki napsautukset luettelon kohteissa. Funktio antaa valmiiksi merkityille kohdille luokan done ja toisen napsautuksen jälkeen luettelokohteen poistetaan asiakirjasta. Tällä kertaa sinun ei tarvitse peruuttaa mitään oletustapahtumaa luettelon napsautuksen jälkeen, sillä li-elementillä ei ole oletustoimintoa, mutta siitä ei ole haittaa, jos peruutat sen joka tapauksessa. Tällä kertaa e-argumentti viittaa napsautustapahtumaan ja sinun on päästävä käsiksi varsinaiseen napsautettuun li-elementtiin. Onneksi tapahtuma tietää sen ja tarjoaa sen target-ominaisuudessaan. Tämä tarkoittaa, että luettelon kohteeseen, jota klikataan, voidaan päästä käsiksi käyttämällä e.target. Meidän tapauksessamme tämän pitäisi aina olla luettelokohde, mutta se on mahdollista, että jotenkin käyttäjä on napsauttanut toista elementtiä ja on yleensä hyvä idea tarkistaa, että olet todella tekemisissä oikean elementin kanssa. Siksi heti seuraava asia on kysyä elementiltä itseltään, onko se li-elementti vai ei. Tämä voidaan tehdä Element.tagName-ominaisuuden avulla tai meidän tapauksessamme e.target.tagName ja sen tulee palauttaa arvo “LI”. Jos elementti ei ole luettelokohde, sinun ei pidä tehdä mitään, koska emme halua muuttaa mitään muuta asiakirjassa. Nyt poistetaan kohde luettelosta. Elementin poistaminen voidaan tehdä komennolla node.remove(). Katso: Node removal

8. Liitä listClickHandler(e)-funktio TODO-luettelon ul-elementin click-tapahtumaan. Sinun pitäisi jo tietää miten tämä tehdään. HUOM: Liitämme kuuntelijan ul-elementtiin, ei jokaiseen yksittäiseen li-elementtiin. Tämä on mahdollista tapahtumien kuplimisen (bubbling) vuoksi. Katso: Bubbling and capturing ja Event delegation

9. Lataa sivusi uudelleen ja testaa ohjelmasi. Lisää ensin muutama kohde luetteloon. Yritä sitten napsauttaa jotakin luettelon kohdista ja varmista sen katoavan. Napsauta myös kaikkia muita elementtejä ja katso, voitko tyhjentää luettelon. Jos jokin meni pieleen, näet virheet konsolissa tavalliseen tapaan. Tällä kertaa kaikkien virheiden pitäisi olla listClickHandler(e)-funktiossa. Korjaa virheet ja yritä uudelleen.

10. Nyt on aika lisätä luokan “done” tarkistus ja lisätä luokka, jos se puuttuu. Pääset kaikkiin elementin luokkiin käsiksi classList-ominaisuuden avulla. Voit lisätä elementtiin uuden luokan, poistaa olemassa olevan luokan ja joko lisätä tai poistaa luokan riippuen siitä, onko se liitetty elementtiin vai ei. Tässä tapauksessa voit lisätä luokan elementtiin komennolla e.target.classList.add("done") ja voit kysyä, onko elementillä jo kyseinen luokka e.target.classList.contains("done"). Muista, että jos li-elementtissä ei ole “done”-luokkaa, sinun tulee lisätä elementti, ei poistaa sitä luettelosta. Ja vain kun elementin luokka on “done”, sinun tulee poistaa elementti. Katso: CSS-luokkien muokkaaminen JavaScriptissä

11. Lataa sivusi uudelleen ja testaa sovelluksesi. Lisää ensin muutama kohde luetteloon. Tämän pitäisi toimia hyvin, koska olet jo suorittanut kyseisen vaiheen. Yritä sitten napsauttaa jotakin luettelon kohdista. Jos kohde muuttaa ulkoasuaan, yritä napsauttaa toista elementtiä nähdäksesi myös sen muuttuvan. HUOM! Tässä vaiheessa sinun on myös tullut liittää CSS stylesheet tai luokka “done” ei muuta mitään etkä näe muutosta luettelossa. Jos kaikki toimi toistaiseksi, napsauta jotakin kohteista toisen kerran ja näet sen toivottavasti katoavan. Jos näin tapahtuu, napsauta myös kaikkia muita elementtejä ja katso, voitko tyjentää luettelon. Jos jokin meni pieleen, näet virheet konsolissa tavalliseen tapaan. Tällä kertaa kaikki virheet pitäisi liittyä listClickHandler(e). Korjaa virheet ja yritä uudelleen.

12. Ennen kuin palautat harjoituksen, tee viimeinen tarkistus, jotta kaikki toimii ja lopuksi palauta todo.js -tiedosto. Onnittelut!

Tehtävää ladataan...
Palautusta lähetetään...