JWT 2016 luento 5. ti klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Samankaltaiset tiedostot
JWT 2017 luento 6. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Helsingin yliopisto/tktl XML-metakieli XML:n-käsittely. XML:n käsittely ohjelmallisesti. XML:n käsittely ohjelmallisesti

Digitaalisen median tekniikat. Luento 4: JavaScript

11 Lyhyesti XML-sovellusohjelmoinnista

HTML & CSS. HTML (HyperText Markup Language) Antti Koivisto. ! HTML on sivujen kuvauskieli.

Aulikki Hyrskykari Antti Sand

Javascript 2: Ohjelmointikielen ominaisuudet. Jaana Holvikivi Metropolia

Olion ominaisuuksiin ja metodeihin viitataan pistenotaatiolla:

Luento 7: XML-ohjelmointirajapinnat

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

Sisältö. XML, XHTML ja CSS XML XML. XML:n ja HTML:n ero. XML kieliä XML XHTML CSS XSL. T Hypermediadokumentin laatiminen 2002

WWW-ohjelmoinnin kokonaisuus. WWW-OHJELMOINTI 1 Merkkauskielet. Merkkauskielten idea. Merkkauskielet (markup languages) Merkkauskielten merkitys

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Algoritmit 2. Luento 4 To Timo Männikkö

Ohjelmoinnin perusteet Y Python

A TIETORAKENTEET JA ALGORITMIT

JWT 2017 luento 10. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Sisältö. 22. Taulukot. Yleistä. Yleistä

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

CSS - tyylit Seppo Räsänen

Digitaalisen median tekniikat css tyylimääritykset

Digitaalisen median tekniikat css tyylimääritykset Harri Laine 1

Helsingin yliopisto/tktl XML-metakieli XPath

Luento 3. Jouni Ikonen - Jouni.Ikonen lut.fi

Sisältö. 2. Taulukot. Yleistä. Yleistä

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Algoritmit 2. Luento 6 Ke Timo Männikkö

Luento 3: Tietorakenteiden esittäminen

Ohjelmoinnin perusteet Y Python

Internet-pohjaisen oppimisympäristön laadinta. Luento 3

Algoritmit 2. Luento 6 To Timo Männikkö

DOORS Word DOORS SoftQA Pekka Mäkinen

Taulukot. Jukka Harju, Jukka Juslin

XML prosessori. XML prosessointi. XML:n kirjoittaminen. Validoiva jäsennin. Tapahtumaohjattu käsittely. Tapahtumaohjattu käsittely.

Digitaalisen median tekniikat css tyylimääritykset

Algoritmit 1. Luento 6 Ke Timo Männikkö

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 2 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Formaalit menetelmät: Kirjaston formalisointi Z-kuvauskielellä

Algoritmit 2. Luento 2 To Timo Männikkö

Java-kielen perusteet

Ajax ja sen käyttö peliohjelmoinnissa

Internet-pohjaisen oppimisympäristön laadinta. Luento 4

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

Binäärihaun vertailujärjestys

Algoritmit 2. Luento 9 Ti Timo Männikkö

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

H T M L eli kuinka laadin itselleni päheät kotisivut. Janne Käki

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

MITÄ JAVASCRIPT ON?...3

Ohjelmoinnin perusteet Y Python

Tietokanta.java Luokka tarjoaa välineet tietokannan lukemiseen. Haetuista tiedoista muodostetaan kurssi- ja opetus-olioita.

Miten käydä läpi puun alkiot (traversal)?

Ohjelmoinnin peruskurssi Y1

XHTML - harjoitus. Tehtävä1: Tee xhtml tiedosto käyttäen notepad (muistio) ohjelmaa. Tiedoston tallennus notepad (muistio) ohjelmassa:

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Kotisivuohjeet. Eteläpohjalaiset Kylät ry. Sivupohjien rakenne

Ohjelmoinnin peruskurssi Y1

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Algoritmit 2. Luento 3 Ti Timo Männikkö

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Digitaalisen median tekniikat JavaScript_osa Harri Laine 1

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Olio-ohjelmointi Syntaksikokoelma

Visma Fivaldi -käsikirja Asiakaskohtaiset hinnat

Aulikki Hyrskykari. JWT Hyrskykari, SIS, Tampereen yliopisto 4/23/2014

HTML ja CSS. Tästä se lähtee: portfolio-sivusto. Sivuston pääkansio, jonka sisällä on kaikki sivustoon kuuluvat alikansiot ja tiedostot.

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Laajuus 5 op Luennot: 12 x 2t Harjoitukset: 7 viikkoharjoitusta harjoitusten tekemiseen saatavissa apua 2 ryhmää / harjoitus

Algoritmit 2. Luento 5 Ti Timo Männikkö

Aulikki Hyrskykari. CSS Taustaa CSS syntaksi CSS Valitsimet Kuvat verkkosivulla

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

H T M L eli kuinka laadin itselleni päheät kotisivut. Janne Käki

Luku 8. Aluekyselyt. 8.1 Summataulukko

Verkkosivut perinteisesti. Tanja Välisalo

Ohjelmoinnin perusteet Y Python

WWW-Sivustojen suunnittelu. Miten WWW toimii. Suunnittelun lähtökohdat

WWW-Sivustojen suunnittelu

Ohjelmoinnin peruskurssi Y1

Algoritmit 2. Luento 11 Ti Timo Männikkö

XML, XHTML ja CSS. T Hypermediadokumentin laatiminen. Mikko Pohja

18. Abstraktit tietotyypit 18.1

Hohde Consulting 2004

Algoritmit 2. Luento 5 Ti Timo Männikkö

8 XSLT-muunnoskieli XSLT-muunnoskieli

Digitaalisen median tekniikat JavaScript

Digitaalisen median tekniikat JavaScript Harri Laine 1

Transkriptio:

JWT 2016 luento 5 ti 22.3.2016 klo 14-16 Aulikki Hyrskykari PinniB 1096 1

Viime luennolla o JavaScriptin perusteista Tänään o JavaScriptin perusteista muutama poiminta o DOM puun käsittely haun tallentaminen o Yksittäisen elementin haku (Node) getelementbyid, queryselector o Useamman elementin haku (NodeList) getelementsbyclassname, getelementsbytagname, queryselectorall o Solmujen haku puussa liikkumalla parentnode, previoussibling, nextsibling, firstchild, lastchild o Testisolmun sisällön muuttaminen nodevalue o Elementtisolmun tekstisisältö textcontent o HTML-koodia elementin sisällöksi innerhtml o Elementtisolmun lisäys ja poisto createelement(), createtextnode() ja appendchild(), removechild() o Attribuuttien käsittely 2

Dynaamisesti tyypitetty kieli o Muuttujat ovat joko globaaleja tai lokaaleja (funktion sisäisiä) o Muuttujan tyyppi määräytyy dynaamisesti siihen sijoitetun arvon perusteella o Muuttujan voi ottaa käyttöön esittelemättä sitä ensin silloin sen esittely tehdään automaattisesti ja siitä tehdään automaattisesti globaali muuttuja 3

Muuttujien viittausalue o Viittausalue sidottu funktioihin funktiossa esitellyt muuttujat aina paikallisia omassa funktiossaan funktioiden ulkopuolella esitellyt globaaleja muuttujia var a = 5; function TekeeJotain () { var b = 12; // paikallinen muuttuja, olemassa vain funktion sisällä c = 10; // globaali muuttuja, olemassa myös funktion ulkopuolella... } potentiaalinen ongelmakohta: kannattaa esittellä muuttujat aina 4

Muuttujien viittausalue, esim. 1 external = 5; function ekafunktio() { var external = 6; window.alert("eka funktio: " + external); } function tokafunktio() { external = 7; window.alert("toka funktio: " + external); } alert(external); ekafunktio(); alert(external); tokafunktio(); alert(external); Mitä funktiokutsut tulostavat? 5

Muuttujien viittausalue, esim. 2 var summa = 21; function testaa(arvo) { if (arvo) { var summa = 42; } alert(summa); } testaa(true); testaa(false); Mitä funktion kutsut tulostavat? Miksi? 6

DOM Document Object Model (1) Oliomalli HTML-sivun elementeistä (DOM-puu) (2) Ohjelmointirajapinta HTMLdokumenttien rakenteen ja sisällön muokkaukseen 7

DOM Document Object Model o W3C DOM-standardi ei siis ole osa HTML:ää eikä JavaScriptiä kehitys tapahtunut tasoittain DOM Taso 1 (1998) sisältää mm. metodit elementtien luomiseen ja noutamiseen, esim. document.getelementsbytagname( p ) document.getelementsbytagname(*) palauttaa listan sivun kaikista elementeistä DOM Taso 2 (2000) sisältää metodit dokumenttien tyylin muokkaukseen tuki erilaisten tapahtumien (mm. hiiri ja näppäimistö) käsittelylle DOM Taso 3 (2004) laajennuksia tasoon 2 mm. dokumenttien ja elementtien käsittelyssä 8

Esimerkkisivu... <body> </body> </html> <div id="page"> <h1 id="header">kauppalista</h1> <h2>kauppalista</h2> <ul> <li id="one" class="hot"><em>ruodottomia</em> kuhafileitä</li> <li id="two" class="hot">pinaattia</li> <li id="three" class="hot">sitruunalohkoja</li> <li id="four">tilliä</li> </ul> </div> <script src="js/list.js"></script> /* css */....hot { background-color: #f08080; }.cool { background-color: #80eeee; }.normal { background-color: #ffee77; }.complete { background-color: #bbc5c5;... 9

Sivun DOM-puu o Jokaista puun solmua käsitellään JavaScript ohjelmassa oliona, jolla on metodeja ja oliomuuttujia o Jokaista sivun elementtiä, attribuuttia, ja tekstipalaa edustaa solmu DOM-puussa elementtisolmut kuvaavat puun (ja sivun) rakenteen elementtisolmu document on puun juuri (ylimpänä puussa) kaikki haut dokumenttipuuhun tapahtuvat document-solmun kautta attribuuttisolmu ei ole elementtisolmun lapsi on osa elementtisolmua tekstisolmulla ei voi olla lapsia aina puun lehtisolmu 10

document html body div attribute <body> <div id="page"> <h1 id="header">kauppalista</h1> <h2>kauppalista</h2> <ul> <li id="one" class="hot"> <em>ruodottomia</em> kuhafileitä </li> <li id="two" class="hot">pinaattia</li> <li id="three" class="hot">sitruunalohkoja</li> <li id="four">tilliä</li> </ul> </div> <script src="js/list.js"></script> </body> h1 attribute h2 ul script attribute text text li attribute li attribute li attribute li attribute em text text text text text 11

DOM puun käsittely (1) Noudetaan puusta elementti, jota halutaan käsitellä (2) Käytetään/käsitellään sen tekstisisältöä, lapsielementtejä, attribuutteja 12

DOM-puu haun tallentaminen o Kun puusta noudettua elementtiä tarvitaan useammin kuin kerran, se kannattaa tallentaa muuttujaan esim. li var itemnode = getelementbyid('one'); kun elementtiä vastaava solmu puusta on noudettu, sen avulla pääsee käsiksi solmun äitiin, sisaruksiin tai lapsiin o Elementin tallennus muuttujaan tarkoittaa itse asiassa että muuttujaan tallennetaan viittaus ko. solmuun DOM-puussa tehokkaampaa, kun ei jouduta tekemään solmun etsintää uudelleen body div h1 h2 ul script li li li 13

Yksittäisen elementin haku DOM-puusta o Kolme yleistä tapaa hakea elementtipuusta yksi solmu (Node, element-olio) getelementbyid('tunnus') - elementin id-tunnus queryselector('valitsin') - css-valitsin käyttäen hyväksi solmujen sukulaisuussuhteita // haetaan elementti ja tallennetaan se muuttujaan var el = document.getelementbyid("two"); // muutetaan elementin class-attribuutin arvo el.classname = "cool"; // haetaan elementti css-valitsimen avulla var el = document.queryselector('li:lastchild') el.classname = 'cool'; 14

Useamman elementin haku DOM-puusta o Kolme yleistä tapaa useampia solmuja (solmulistan) getelementsbyclassname('luokka') käytetään luokkatunnusta getelementsbytagname('elementti') elementin perusteella queryselectorall('valitsin') kaikki css-valitsimeen sopivat solmut vaikka palauttaisivat vain yhden solmun, palautettava olio on solmulista (=HTMLCollection) HTMLCollection-olioon voidaan viitata kuin Array-olioon sen pituus oliomuuttujassa length elementteihin viittaaminen kuten taulukossa 15

Esimerkkejä o getelementsbyclassname // haetaan kaikki luokkaan hot kuuluvat var elements = document.getelementsbyclassname('hot'); // muutetaan kolmas niistä (jos se on olemassa) if (elements.length > 2) { var el = elements[2]; el.classname = 'cool'; } o getelementsbytagname // haetaan kaikki li-elementtisolmut var els = document.getelementsbytagname('li'); // jos niitä löytyi, muutetaan ensimmäistä if (elements.length > 0) { var el = elements[0]; el.classname = 'cool'; } 16

Esimerkkejä o queryselector, queryselectorall // queryselector palauttaa ensimmäisen löydetyn var el = document.queryselector('li.hot'); el.classname = 'cool'; // queryselectorall palauttaa NodeList-olion, muutos // loydetyistä luokkaan cool kuuluvista toiseen var els = document.queryselectorall('li.hot'); els[1].classname = 'cool'; o NodeLista-olion läpikäynti // haetaan kaikki hot-luokkaan kuuluvat // li-elementtisolmut var hotitems = document.queryselectorall('li.hot'); // muutetaan kaikkien luokka for (var i = 0; i < hotitems.length; i++) { hotitems[i].classname = 'cool'; } 17

Solmujen haku puussa liikkumalla o sukulaissuhteiden avulla parentnode previoussibling, nextsibling firstchild, lastchild // noudetaan aloituskohta ja sen sisarukset var solmu = document.getelementbyid('two'); var edellinen = solmu.previoussibling; var seuraava = solmu.nextsibling; // muutetaan sisarusten class-attribuutit edellinen.classname = 'complete'; seuraava.classname = 'cool'; 18

DOM ja HTML-dokumentin white spaces o HTML dokumentissa peräkkäiset white space -merkit luhistetaan yhdeksi välilyönniksi o DOM-puussa selaimet käsittelevät tyhjätilamerkkejä eri tavoin sukulaissuhteita käytettäessä tähän joutuu kiinnittämään huomiota osa selaimista lisää HTML-dokumentin tyhjätilamerkeistä (välilyönnit, rivinvaihdot) DOM puuhun tekstisolmun solmun elementtityypin voi kysyä: oliomuuttuja nodename NodeName- muuttujan arvot samoja kuin tag-nimet, mutta isoin kirjaimin ( P, UL, DIV, jne.) var solmu = document.getelementbyid('two'); var edellinen = solmu.previoussibling; var seuraava = solmu.nextsibling; // Etsi li-sisarukset (ohita tyhjätilamerkit) while ((edellinen!= null) && (edellinen.nodename!= 'LI')){ edellinen = edellinen.previoussibling; } while ((seuraava!= null) && (seuraava.nodename!= LI')){ seuraava = seuraava.nextsibling; } // jos li-sisarukset löytyivat, muuta niiden luokka if (edellinen!= null) { edellinen.classname = 'complete'; } if (seuraava!= null) { seuraava.classname = 'cool'; } 19

DOM ja HTML-dokumentin white spaces o HTML dokumentissa peräkkäiset white space -merkit luhistetaan HTML dokumentissa yhdeksi välilyönniksi o DOMissa selaimet käsittelevät tyhjätilamerkkejä eri tavoin sukulaissuhteita käytettäessä tähän joutuu kiinnittämään huomiota osa selaimista lisää HTML-dokumentin tyhjätilamerkeistä (välilyönnit, rivinvaihdot) DOM puuhun tekstisolmun solmun elementtityypin voi kysyä (oliomuuttuja nodename) 20

Tekstisolmun sisällön muuttaminen o Tekstisolmun sisältämään tekstiin pääsee käsiksi oliomuuttujalla nodevalue // noudetaan ensin solmu jolla on tekstisisältöä // tekstisolmu on sen solmun lapsi var solmu = document.getelementbyid('two'); var txt = solmu.firstchild.nodevalue; solmu.firstchild.nodevalue = txt + ' 150 gr'; 21

Listan ylimmän rivin teksti? o Kokoilemalla itse solmun eka ensimmäisen lapsenlapsen tekstisisältö + toisen lapsen tekstisisältö ei kovin yleispätevä keino o Oliomuuttuja textcontent sisältää alipuun tekstisisällön (ilman html-merkintöjä) 22

HTML-koodia elementin sisällöksi o innerhtml-ominaisuuden avulla voi elementtiin viedä HTML-koodia sitä voi käyttää mille tahansa elementille potentiaalinen turvallisuusriski (!) sen avulla ei pitäisi tuoda käyttäjältä sisältöä var eka = document.getelementbyid('one'); // hae elementti var msg1 = eka.firstchild.firstchild.nodevalue + eka.firstchild.nextsibling.nodevalue; var msg2 = eka.textcontent; // hae sen textcontent // Kirjoita nämä kappaleiksi listan alle var msg = '<p>elementin \'eka\' tekstit itse keräiltynä: ' + msg1 + '</p>'; msg += '<p>elementin \'eka\' textcontent: ' + msg2 + '</p>'; var el = document.getelementbyid('tulostusalue'); // viedään html-koodipalan kappaleet tulostusalue-elementin sisällöksi el.innerhtml = msg; 23

Solmun tekstisisältö o Sijoittaminen oliomuuttujaan textcontent ylikirjoittaa koko elementin sisällön // noudetaan ensin solmu, ja sitten solmun, sekä // sen alipuun tekstit yhteen koottuna var solmu = document.getelementbyid('one'); var txt = solmu.textcontent; solmu.textcontent = txt + ' 150 gr'; 24

Elementtisolmun lisäys o createelement(), createtextnode() ja appendchild() luodaan ensin uusi elementtisolmu (ja mahdollisesti uusi tekstisolmu, joka viedään lapseksi elementtisolmulle) ja liitetään solmu DOM-puuhun jonkun solmun lapseksi // luodaan uusi elementtisolmu ja tallennetaan se muuttujaan var el = document.createelement('li'); // Luodaan uusi tekstisolmu ja tallennetaan muuttujaan var txt = document.createtextnode('smetanaa'); // Liitetaan tekstisolmu uuden elementin lapseksi el.appendchild(txt); // haetaan äiti, jolle uusi elementti halutaan viedä var aiti = document.getelementsbytagname('ul')[0]; // lisataan uusi elementti puuhun aiti.appendchild(el); 25

Elementtisolmun poisto o removechild() kun elementtisolmu poistetaan DOM-puusta, häviävät myös sen lapset // haetaan poistettava elementtisolmu var el = document.getelementsbytagname('li')[3]; // hae sen aiti var aiti = el.parentnode; // poista elementti aiti.removechild(el); 26

Attribuuttien käsittely o Kun elementtisolmu on noudettu, voi sen attribuutteja käsitellä oliomuuttujien: classname ja id kautta (kuten edellisissä esimerkeissä tehtiin) kysyä attribuutin olemassaoloa metodilla: hasattribute(), ja sen arvoa metodilla getattribute() var el1 =document.getelementbyid('one'); // Noudetaan elementti if (el1.hasattribute('class')) { // jos sillä on luokka var attr = el1.getattribute('class'); // attribuutti, tallenna // attribuutin arvo // lisaa tulostualueelle kappale, jossa kerrotaan luokan nimi var uusiel = document.getelementbyid('tulostusalue'); uusiel.innerhtml = '<p>the first item has a class name: ' + attr + '</p>'; } 27

Attribuutin muuttaminen ja poistaminen o Elementtisolmun attribuutin voi lisätä tai sen arvon muuttaa metodilla setattribute() ja poistaa metodilla removeattribute() yritys poistaa olematonta attribuuttia ei johda virheeseen, mutta silti on hyvä käytäntö tarkistaa onko se olemassa ennen kuin yrittää poistaa sitä // annetaan listan viimeisellekin li-solmuelementille class-attribuutti hot var el = document.queryselector('li:last-child'); el.setattribute('class', 'hot'); // ja poistetaan luokka-attribuutti kokonaan listan ensimmäiseltä el = document.getelementsbytagname('li')[0]; if (el.hasattribute('class')) { el.removeattribute('class'); } // näinkin mahdollista tehdä suoraan document.getelementsbytagname('li')[1].setattribute('class','complete'); 28