Harjoitustyö 3: Verkkosivujen toiminnallisuus (JavaScript) Kurssin kolmannessa harjoitustyössä tutustutaan verkkosivujen toiminnallisuuden toteuttamiseen JavaScriptin avulla. Harjoitustyö koostuu kahdesta osasta (katso Vaatimukset). Toteutettavien tehtävien on liityttävä ryhmäsi teemaan. Harjoitustyö tehdään itsenäisesti. Harjoitustyötä varten on kurssille määritelty yksi luento (23.2.2016) sekä yksi viikkoharjoitus (1.3.2016). Yleisesti ottaen luento tarjoaa kattavan tietopaketin harjoitustyöaiheeseen. Viikkoharjoituksissa voit tehdä harjoitustöitä sekä tarvittaessa kysyä neuvoa assistenteilta, mikäli harjoitustöiden kanssa ilmenee ongelmia. Voit myös lähettää sähköpostia assistenteille (tämän harjoitustyön tapauksessa ensisijaisesti Juuso Lappalainen). Harjoitustyön vaatimukset on jaettu kahteen osaan: numeronarvauspeliin ja vaihtuvasisältöiseen mediaelementtiin. Osat ja niihin liittyvät tehtävät on suunniteltu toteutettavaksi annetussa järjestyksessä. Tällä kierroksella ei ole erillistä bonus-tehtävää, mutta täysiin pisteisiin pääseminen vaatii kaikkien perustehtävien vaatimusten täyttymistä. Lämmittely: Numeronarvauspeli (0-1 pistettä) Ensimmäisessä osassa tutustutaan JavaScriptin perusteisiin toteuttamalla yksinkertainen numeronarvauspeli. Tehtävä totetutetaan jatkamalla harjoitustyöt-sivulla annettua guessthenumber.html-tiedostoa. Numeronarvauspeli palautetaan lataamalla se DIME-palvelimelle siten että se löytyy osoitteesta dime.tml.hut.fi/~aalto-tunnuksesi/guessthenumber.html. Pelin ei tarvitse olla linkitettynä osaksi muuta sivustoasi, riittää että se löytyy ym. osoitteesta. Vaatimukset: Peliä pelataan syöttämällä luku tekstikenttään ja painamalla submitnappulaa Tekemäsi JavaScript-koodin tulee o a) arpoa sivunlatauksen yhteydessä satunnaisluku (väliltä 1-10) ja tallentaa se muuttujaan o b) kuunnella submit-nappulan painamista, ja nappulaa painettaessa hakea tekstikenttään syötetty arvo ja varmistaa että siihen on syötetty numero väliltä 1-10 verrata syötettyä lukua sivunlatauksen yhteydessä generoituun satunnaislukuun
ilmoittaa käyttäjälle popup-ikkunassa (alert) osuiko hänen arvaus oikeaan. arpoa uusi satunnaisluku arvattavaksi, jotta peliä voi pelata uudestaan ilman sivun päivittämistä. Alla on ohjeistusta tehtävän tekemiseen, mutta voit vapaasti toteuttaa tehtävän haluamallasi tavalla kunhan vaatimukset täyttyy. Ohjeistus kuvailee suosittelut vaiheet, mutta ei tarkemmin opasta niiden tekemisessä - > apua löytyy kierroksen luentokalvoista ja Googlesta. Luo JavaScript-tiedosto (esim. guessthenumber.js), johon tästä eteenpäin kirjoitetaan kaikki numeronarvauspeliin liittyvä ohjelmakoodi. Linkitä ko. tiedosto etusivulle script-tagin avulla (guessthenumber.html). Toteuta funktio getrandominteger( min, max ), joka nimensä mukaisesti palauttaa satunnaisen kokonaisluvun väliltä min ja max (mukaan lukien kyseiset numerot). Toteutuksessa kannattaa hyödyntää JavaScript:n Math-objektia: http://www.w3schools.com/js/js_math.asp. Luo muuttuja, johon säilötään numero, jota pelaaja yrittää arvata pelissä. Aseta muuttujan arvoksi sivunlatauksen yhteydessä satunnainen kokonaisluku väliltä 1-10 (mukaan lukien kyseiset numerot). Hyödynnä tässä kohdassa edellisessä tehtävässä toteuttamaasi funktiota. Toteuta funktio comparenumbers( first, second ), joka tarkistaa onko sille annetut kaksi lukua yhtäsuuria, ja palauttaa tulosta vastaavan totuusarvon. Nappulan painallukseen voit reagoida kahdella tavalla: o a) aseta html-koodissa nappulalle onclick-arvoksi haluamasi funktion nimi, esim. guessthenumber() -> tätä funktiota kutsutaan kun nappulaa painetaan o b) luo JavaScript-koodissasi nappulalle tapahtumankuuntelija, joka kuuntelee click-eventtiä, ja reagoi siihen kutsumalla haluamaasi funktiota. Toteuta guessthenumber() -funktiosi, joka o 1) hakee tekstikenttään syötetyn arvon o 2) tarkistaa että se on kokonaisluku, ja että se on väliltä 1-10. Jos ei ole, ilmoittaa popup-ikkunassa (alert) käyttäjälle että syötetty luku ei kelpaa. o 3) kutsuu comparenumbers()-funktiota joka selvittää onko luku yhtäsuuri sivunlatauksen yhteydessä arvotun luvun kanssa. o 4) ilmoittaa käyttäjälle popup-ikkunassa pelin tuloksen, ja arpoo uuden satunnaisluvun seuraavaa arvausta varten. Tehtävän kannalta hyödyllisiä linkkejä - Satunnaisluvut: http://www.w3schools.com/jsref/jsref_random.asp - onclick: http://www.w3schools.com/jsref/event_onclick.asp - Tapahtumankuuntelijat http://www.w3schools.com/jsref/met_element_addeventlistener.asp - Popup-ikkunat http://www.w3schools.com/js/js_popup.asp
Vaihtuvasisältöinen mediaelementti (0-3 pistettä) Toisessa osassa verkkosivustolle toteutetaan vaihtuvasisältöinen mediaelementti. Mediaelementti yhdistää kuvaa ja tekstiä, ja sen sisältö vaihtuu muutaman sekunnin välein. Tähän sisältöön viitataan jatkossa sanalla artikkeli. Mediaelementtiin tulee myös kolme painiketta, joilla käyttäjä voi pysäyttää artikkelin vaihtumisen, vaihtaa seuraavaan artikkeliin tai vaihtaa edelliseen artikkeliin. Tällainen mediaelementti voi olla esimerkiksi uutisikkuna (jokainen uutinen on yksi artikkeli) tai kuvaesitys tekstin kanssa. Mielikuvitusta saa käyttää: voit vaikka tehdä mediaelementin, joka esittelee kuuluisien filosofien aforismeja kasvokuvien kera. Huom: harjoitustyön tekemiseen ei saa käyttää valmiita kuvakarusellikirjastoja (kuten Bootstrapin carousel.js), vaan mediaelementti on tarkoitus toteuttaa itse. Todellisuudessa vastaavien kirjastojen käyttö olisi varsin viisasta, mutta tämän tehtävän tarkoituksena on opetella JavaScriptin perusteita. Tehtävä 3: Artikkelien määrittely (JSON) o Luo JSON-tiedosto (esim. articles.json), joka sisältää vähintään kolme artikkelia. Artikkelit pitää esittää taulukkomuodossa (engl. array) ja niistä pitää löytyä kentät ainakin otsikolle, päivämäärälle ja itse sisällölle. Kentille annettavat nimet ovat vapaavalintaisia. o JSON-tiedoston pitää validoitua ilman virheitä (engl. errors): http://jsonlint.com/. Mikäli tiedostoon jää virheitä, pitää niiden olemassaolo perustella. Tehtävä 4: Uutisten tallennus pilvipalveluun (Firebase) o Rekisteröidy Firebase-pilvipalveluun: https://www.firebase.com/. o Kirjauduttuasi sisään luo itsellesi uusi Firebase-sovellus (Account Dashboard -näkymä). Anna sovelluksen nimeksi (APP NAME) ja osoitteeksi (APP URL) oma Aalto-tunnuksesi (esim. aaltotunnuksesi ja https://aalto-tunnuksesi.firebaseio.com). Avaa sovelluksen hallintapaneeli painamalla Manage App -nappia. o Data-välilehti: Tallenna edellisessä tehtävässä luomasi JSONtiedosto sovellukseen Import JSON -napin kautta. o Security Rules -välilehti: Kytke sovelluksen kirjoitusoikeudet pois päältä määrittelemällä.write -kentän arvoksi false. Muista tallentaa muutokset Save Rules -napista. o Testaa sovelluksesi toimivuutta syöttämällä selaimen osoitekenttään sovelluksesi URL sekä lisäämällä loppuun /.json (esim. https://aalto-tunnuksesi.firebaseio.com/.json). Nyt sinun pitäisi nähdä selaimessa sovellukseen tuomasi JSON-tiedoston sisältö (artikkelit). o Huom. Selaimeen kannattaa asentaa esim. JSONView-lisäosa, joka muuntaa JSON-tiedostot luettavampaan muotoon. Tehtävä 5: Artikkelien haku pilvipalvelusta
o Luo JavaScript-tiedosto (esim. slideshow.js), johon tästä eteenpäin kirjoitetaan kaikki tähän osatehtävään liittyvä ohjelmakoodi. Linkitä ko. tiedosto niihin verkkosivuihin, joissa mediaelementti on tarkoitus näyttää (esim. Etusivu, index.html). o Lisää tapahtumakuuntelija, joka sivun latauduttua hakee edellisessä tehtävässä Firebase-pilvipalveluun tallentamasi JSONtiedoston ja tulostaa sen sisällön selaimen konsolille console.log( data ) komentoa käyttäen. Ajax-haku kannattaa toteuttaa jonkin JavaScript-kirjaston avulla, kuten esimerkiksi jquery:llä (http://api.jquery.com/jquery.getjson/) tai Firebase:llä (https://www.firebase.com/docs/web/quickstart.html). o Huom. Konsoli löytyy esim. Google Chrome selaimen Developer Tools -työkalujen kautta. Tehtävä 6: Artikkelien näyttö (DOM) o Näytä edellisessä tehtävässä Ajaxin avulla hakemasi artikkelit mediaelementissä. Artikkelien on tarkoitus vaihtua automaattisesti X sekunnin välein ts. vain yksi artikkeli näytetään kerrallaan. Tämän aikaansaamiseksi verkkosivun DOM-puuta (mediaelementin sisältöä) pitää manipuloida. DOMin manipuloinnissa kannattaa käyttää apuna jotain JavaScriptkirjastoa, kuten jquery:ä (http://api.jquery.com/category/manipulation/). o Huom. Artikkelien automaattiseen vaihtumiseen voi käyttää esimerkiksi window.settimeout tai window.setinterval -metodeita. Tehtävä 7: Artikkelien vaihtumisen hallinta (Napit) o Lisää mediaelementin yhteyteen hallintapaneeli uutisten kontrollointia varten. o Hallintapaneelista pitää löytyä seuraavat kolme nappia: (1) Edellinen (engl. Previous), (2) Toista/Tauota (engl. Play/Pause) joista vain toinen teksti näkyy riippuen elementin sen hetkisestä tilasta ja (3) Seuraava (engl. Next). Nappien toiminnallisuutta voi korostaa ikoneilla, esimerkiksi käyttäen ilmaista Font Awesome - ikonikirjastoa: http://fortawesome.github.io/font-awesome/. o Huom. Artikkelien automaattisen vaihtumisen tauottamiseen voi käyttää esimerkiksi window.cleartimeout tai window.clearinterval -metodeita. Tehtävä 8: Mediaelementin tila (Web Storage) o Tallenna Web Storage:n (localstorage, http://www.w3.org/tr/webstorage/#storage) avulla mediaelementin tila aina, kun artikkeli vaihtuu. Toisin sanoen, pidä muistissa, mikä artikkeli käyttäjälle on viimeksi näytetty. o Hae Web Storagen avulla mediaelementin tila aina, kun artikkelit on haettu Firebase-pilvipalvelusta. Toisin sanoen, hae muistista, mikä artikkeli käyttäjälle on viimeksi näytetty ja näytä se ensimmäisenä verkkosivun latauduttua. Tehtävä 9: Artikkelien animointi (jquery)
o Linkitä jquery-kirjasto (http://jquery.com/download/#usingjquery-with-a-cdn) niihin verkkosivuihin, joissa mediaelementti on tarkoitus näyttää (esim. Etusivu, index.html). o Lisää vapaavalintainen animaatio/efekti (esim. fade in/out) artikkelien vaihtumisen yhteyteen jquery-kirjaston avulla: http://api.jquery.com/category/effects/. o Huom. Lisäksi voit käyttää jquery UI:ta ja/tai jquery-plugineja. Muut vaatimukset o Tehtävässä 5 luomasi JavaScript-tiedoston pitää validoitua ilman virheitä ja/tai varoituksia (engl. errors and/or warnings): http://jshint.com/. Mikäli tiedostoon jää virheitä ja/tai varoituksia, pitää niiden olemassaolo perustella. Yleistä Riittää, että harjoitustyö on testattu ja se toimii jollain seuraavista selaimista: (1) Google Chrome, (2) Mozilla Firefox tai (3) Apple Safari. Mikäli tehtävänannon suhteen on epäselvyyksiä, niin ota yhteyttä kurssin henkilökuntaan joko postituslistan kautta tai viikkoharjoituksissa. Ohjelmistot Harjoitustyö tehdään asiakaspään web-teknologioita käyttäen, tarkemmin sanottuna JavaScript-kielen ja jquery-kirjaston avulla. Lisäksi harjoitustyön tekeminen vaatii vapaavalintaisen ohjelmointiympäristön tai tekstieditorin (esim. Brackets, Sublime Text, Notepad++ tai GNU Emacs) käyttämistä. Harjoitustyön tekemiseen ei saa käyttää visuaalista editoria vaan ohjelmakoodi on kirjoitettava käsin. Arvostelu Harjoitustyö arvostellaan asteikolla hyväksytty (1-4 pistettä) tai hylätty (merkittäviä puutteita). Arvostelussa huomioidaan ensisijaisesti vaatimusten täyttyminen sekä panostuksen määrä. Tämän lisäksi harjoitustyön arvosteluun vaikuttavat sen idea ts. kuinka vahvasti harjoitustyö liittyy Viestintä 2 -kurssilla annettuun teemaan sekä sen tekninen ja taiteellinen toteutus. Myöhässä palautetut harjoitustyöt arvostellaan samoin perustein, paitsi että jokaiselta alkavalta myöhästymisvuorokaudelta vähennetään 1 piste. Myöhästynyt työ voidaan päästää läpi hyväksyttynä, vaikka myöhästymissakot tiputtaisivat pisteet nollille, mikäli työ muuten täyttää 1 pisteen mukaiset vaatimukset. Hylätyt harjoitustyöt puolestaan uusitaan assistenttien kanssa erikseen sovitun aikataulun mukaisesti tai kurssin lopussa järjestettävän rästikierroksen yhteydessä. Uusintapalautetuista harjoitustöistä voi saada hyväksyttynä vain 0 pistettä.
Palautus Harjoitustyö palautetaan kurssin Dime-verkkopalvelimelle (palvelimen käyttöohjeet löytyvät kurssin MyCourses-sivuilta) viimeistään maanantaina 7.3.2016 klo 18.00 mennessä. Palautettujen tehtävien tulisi olla tarkasteltavissa osoitteessa http://dime.tml.hut.fi/~aalto-tunnuksesi/ Harjoitustyöstä on kirjoitettava lyhyt kuvaus MyCoursesiin Harjoitustyö 3:n alle Harjoitustyöt-sivulle. Kuvauksessa voit kertoa mm. harjoitustyön hienouksista/puutteista tai mitkä osiot siitä on toteutettu kolmannen osapuolen komponentein. Kerro myös, mitkä tehtävät teit sekä millä selaimella (+versio) ja käyttöjärjestelmällä (+versio) harjoitustyön pitäisi toimia virheettömästi.