html5 - az új szabvány

271
Mark Pilgrim HTML 5 AZ ÚJ SZABVÁNY Ugorjunk fejest a webfejlesztés jövőjébe!

Upload: balint-sipka

Post on 24-Jul-2015

1.081 views

Category:

Documents


11 download

DESCRIPTION

Mi a HTML5? A HTML5 a HTML következő nemzedéke, amely a HTML 4.01, az XHTML 1.0 és az XHTML 1.1 felváltására hivatott. A HTML5 olyan új szolgáltatásokat kínál, amelyek elengedhetetlenek a modern webalkalmazásokban, ezen kívül szabványossá teszi a webes felület számos olyan lehetőségét, amelyeket a webfejlesztők már évek óta használnak, de a szabványügyi bizottságok eddig még nem foglaltak írásba. ...

TRANSCRIPT

Page 1: HTML5 - Az új Szabvány

Mark Pilgrim

HTML 5 AZ ÚJ SZABVÁNY

Ugorjunk fejest a webfejlesztés jövőjébe!

Page 2: HTML5 - Az új Szabvány

A kiadvány a következő angol eredeti alapján készült: Dive Into HTMLS

Copyright© 2011 by Mark Pilgrim. Some rights reserved! ©Kiskapu Kft. 2011

A kiadás a Creative Commons engedélyével készült a CC-BY-3.0 változat alapján.

Fordítás és magyar változat© 2011 Kiskapu Kft. Kapcsolódó jogok fenntartva! A kiadó a lehető legnagyobb körültekintéssel járt el e kiadvány elkészítésekor. A kiadó nem vállal semminemű felelősséget vagy garanciát a könyv tartalmával, teljességével kapcsolatban. A kiadó nem vonható felelősségre bármilyen baleset vagy káresemény miatt, mely közvetve vagy közvetlenül kapcsolatba hozható e kiadvánnyal.

Fordítás és lektorálás: Rézműves László

Műszaki szerkesztő: Tóth Klára

Tördelés: Tóth Klára

Felelős kiadó a Kiskapu Kft. ügyvezető igazgatója © 2011 Kiskapu Kft. 1134 Budapest, Csángó u. 8.;

Fax: (+36-l) 303-1619;

http://www.kiskapukiado.hu/; e-mail: [email protected]

ISBN: 978 963 9637 77 l

Nyomdai előállítás: Radin Group Felelős vezető: Antun Basic Kereskedelmi képviselet: Kvadrát '97 Kft.

Tel./Fax: +361 319 1599. Mobil: +36 302806656 E-mail:[email protected]

Page 3: HTML5 - Az új Szabvány

Tartalom

Előszó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1. fejezet- Hogyan jutottunk el idáig?

Ugorjunk fejest! . . . . . . . MIME-típusok. . . . . . . . Hosszú kitérő a szabványok születéséről Töreden fejlődés . . . . . . . . . A HTML fejlődésének története 1997 és 2004 között . Minden, amit az XHTML-ről tudunk, téves Egy versenyképes látomás. Milyen munkacsoport?. Vissza a W 3C-hez. . Utószó . . . . . .

További olvasmányok

2. fejezet - A HTML5-képességek észlelése

Ugorjunk fejest! . . . . . . . . . Észlelési módszerek . . . . . . . . Modernizr: egy HTML5-észlelő könyvtár A rajzvászon . . . . . Rajzvászonra Írt szöveg. Videó . . . . . . . Videoformátumok Kérdezzük meg Leírókód professzort! Helyi tárolás. . . . . . . . . . Webmunkások . . . . . . . . . Kapcsolat nélküli webalkalmazások. Helymeghatározás Bevitelielem-típusok. . . Helyőrző szöveg . . . . Automatikus űrlapfókusz . Mikroadatok. . . .

További olvasmányok . .

13 13 14

. 23

. 25

. 26 . 28 . 30 . 32 . 33 . 34

. 35

. 35

. 36

. 37

. 38

. 40

. 41

. 44

. 44 . 45 . 46 . 48 . 49

51 . 52 . 53 . 54

Page 4: HTML5 - Az új Szabvány

3. fejezet- Mit jelent mindez?

Ugorjunk fejest! . . . 57 A dokumentumtípus. . 57 A gyökérelem . . 60 A <head> elem . . . . 61 Karakterkódolás . . . 62 Viszonyleíró elemek . . 64 Egyéb viszonyleíró elemek a HTML5-ben . 67 Új jelentéstükröző elemek a HTML5-ben . 71 Hosszú kitérő arról, hogy miként kezelik a böngészők

az ismereden elemeket. . 73 Címsorok . . . . . . . 77 Cikkek . . . . . . . . 80 Dátumok és időpontok. . 83 Navigáció . . . . . . 85 Láblécek . . . . . . 87 További olvasmányok . 90

4. fejezet- A rajzvászon ördöge (ne fessük a falra!)

Ugorjunk fejest! . . . . 93 Egyszerű alakzatok . . . 94 Rajzvászon-koordináták . 96 Útvonalak. . . 98 Szöveg . . . 101 Színátmenetek 105 Képek . . . 109 Mi a helyzet az Internet Explorerrel? 113 Egy teljes példa. . . 115 További olvasmányok 120

5. fejezet - Videó a Weben

Ugorjunk fejest! 121 Videorárolók. 122 Videokodekek 123 H.264 125 Theora . . . 126 VP8 . . . . 126 Audiokodekek 127 MPEG-1 Audio Layer 3 129 Advanced Audio Coding . 130 Yorbis . . . . . . . . 130 Ami a Weben működik . 131 A H.264-videók felhasználási engedélyével kapcsolatos kérdések. 134

Page 5: HTML5 - Az új Szabvány

Ogg-videók kódolása a Firefogg segítségéveL . . . . . . 136 Ogg-videók kötegelt kódolása az ffmpeg2theora segítségével 143 H.264-videók kódolása a HandBrake segítségével . . . . 145 H.264-videók kötegelt kódolása a HandBrake segítségével . .153 WebM-videók kódolása az ffmpeg segítségéve!. 154 És végül, a leírókód! . . . . . . . . 157 A MIME-típusok beleköpnek a levesbe 161 Mi a helyzet az Internet Explorerrel? 163 Egy teljes példa . . . !64 További olvasmányok . . . . . . 165

6. fejezet- Itt áll ön (és mindenki más)

Ugorjunk fejest! . 167 A Geolocation API 167 Mutasd a kódot! . 168 A hibák kezelése . 171 Választást! Szabad választást! 172 Mi a helyzet az Internet Explorerrel? 175 A felmentő sereg: geo.js. 176 Egy teljes példa . . . 178 További olvasmányok . 179

7. fejezet- A helyi tárolás múltja, jelene és jövője a webalkalmazásokban

Ugorjunk fejest! . . . . . . . . . . . . . . . . . . . . . 181 A helyi tárolásra a HTML5 előtt alkalmazott

trükkök rövid története . . 182 Bemutatkozik a HTML5-tároló . . . . . 183 A HTML5-tároló használata . . . . . . 185 A HTML5-tárolóterület változásainak nyomon követése. 186 A jelenleg használt böngészők korlátai . . . . . 188 A HTML-tároló működés közben . . . . . . 188 A kulcs-érték párokon túl: versengő elképzelések 191 További olvasmányok . . . . . . . . . . . 193

8. fejezet- Bontsuk a kapcsolatot!

Ugorjunk fejest! . 195 A gyorstárjegyzék. 196 Hálózati szakaszok 198 Tartalék szakaszok 199 Az eseményfolyam 201 A hibakeresés művészete, avagy "Ölj meg! Ölj meg itt és most!" 203 Építsünk egyet!. . . 206 További olvasmányok . . . . . . . . . . . . . . . . 207

Page 6: HTML5 - Az új Szabvány

9. fejezet- Örültűrlapok Ugorjunk fejest! . . . . . . Helyőrző szöveg . . . . . . Automatikus fókuszálású mezők E-mail címek . . . . .

Webcímek . . . . . . . Számok léptetőmezőkben . Számok csúszkákon Dátumválasztók Keresőmezők . . Színválasztók . . És még egy dolog ... További olvasmányok

1 O. fejezet- .,Elosztott", .,bővíthetőség" és más divatos szavak Ugorjunk fejest! . . . . .

Mik azok a mikroadatok? . .

A mikroadarok adatmodellje. Személyek felcímkézése. . .

Bemutatkozik a Google Rich Snippets . Szervezetek felcímkézése . . . .

Események felcímkézése . . . . A Google Rich Snippets visszatér . Kritikák felcímkézése További olvasmányok

Függelék A "mindent egyben tartalmazó

és majdnem ábécésorrendbe rendezett" útmutató, amelyet követve bármit észlelhetünk

Az elemek listája . . További olvasmányok

209

209

211

213

.215

217

220

221

224

226

226

228

229

230

232

236

243

246

251

257

259

263

265

265

271

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . .. 273

Page 7: HTML5 - Az új Szabvány

Előszó

Mi a HTMLS? A HTMLS a HTML következő nemzedéke, amely a HTML 4.01, az XHTML 1.0 és az XHTML 1.1 felváltására hivatott. A HTMLS olyan új szolgáltatásokat kínál, amelyek elengedhetetlenek a modern webalkalma­zásokban, ezen kívül szabványossá teszi a webes felület számos olyan lehető­ségét, amelyeket a webfejlesztök már évek óta használnak, de a szabványügyi bizottságok eddig még nem foglaltak írásba. (Meglepődnénk, ha megtudnánk például, hogy a Window objektumot még soha nem írták le hivatalosan? A HTMLS tesz először kísérletet arra, hogy formális leírást adjon sok-sok "de facto" szabványról, amelyeket a webböngészők már jó ideje támogatnak.)

Elődeihez hasonlóan a HTML5-öt is úgy tervezték, hogy rendszerfüggeden legyen. Ahhoz, hogy kihasználhassuk a HTMLS előnyeit, nem követelmény, hogy Windows, Mac OS X, Linux, Multics vagy bármilyen más konkrét operációs rendszert futassunk, csupán egy modern webböngészőre van szük­ségünk (de arra feltétlenül). Modern webböngészők ingyenesen elérhetők minden fontosabb operációs rendszerhez. Az Apple Safari, a Google Chrome, a Mozilla Firefox vagy az Opera legújabb változatai kivétel nélkül támogatják a HTMLS számos szolgáltatását. (A könyvben a böngészők megfelelőségéről részletesebb táblázatokkal is találkozni fogunk.) Az iPhone, iPad és Android mobilkészülékekre előre telepített mobil webböngészők mind kitűnő támo­gatást nyújtanak a HTMLS-höz. Még a Microsoft is bejelentette, hogy az Internet Explorer közelgő 9-es változata is ismerni fogja a HTMLS számos elemér.

Ebben a könyvben nyolc témakörrel foglalkozunk: • Új nyelvi elemek, például a <header>, a <footer> vagy a <section>

(3. fejezet) • A rajzvászon-az a kétdimenziós rajzfelület, amelyet JavaScript segítségé­

vel programozhatunk (4. fejezet)

Előszó l 9

Page 8: HTML5 - Az új Szabvány

• A weboldalakba külső bővítmények segítsége nélkül beágyazható videók (5. fejezet)

• Helymeghatározás- hogyan oszthatják meg a weboldalak látogatói a tartóz­kodási helyüket a webalkalmazásokkal (6. fejezet)

• Tartós helyi tárolás külső bővítmények segítsége nélkül (7. fejezet) • Kapcsolat nélküli webalkalmazások, amelyek a hálózati kapcsolat meg­

szakadása után is képesek működni (8. fejezet)

• A HTML továbbfejlesztett webes űrlapjai (9. fejezet) • Mikroadatok, amelyek lehetövé teszik, hogy a HTML5-be beépített szó­

tárakon túl saját szótárakat hozzunk létre, és egyéni értékekkel lássuk el

a weboldalainkat (10. fejezet)

A HTML5-öt úgy tervezték, hogy amennyire lehetséges, visszamenőlegesen képes legyen együttműködni a meglevő webböngészőkkeL Az új szolgáltatások a már meglevökre épülnek, és megengedik, hogy helyettesítő tartalmat bizto­sítsunk a régebbi böngészőknek Ha pedig még jobban kézben szeretnénk tartani a weboldalaink működését, néhány sornyi JavaScript-kóddal kiderít­hetjük, hogy egy adott böngésző támogatja-e a HTML5 szükséges szolgáltatá­sait (2. fejezet). Ne a törékeny "böngészőszimatoló" kódokra támaszkodjunk annak meghatározásában, hogy mely böngészők támogatják a HTML5-öt:

a vizsgálatot végezzük el magának a HTML5-nek a segítségéve!!

A könyvben használt jelölések

A könyv tipográfiai jelölései a következők:

Dőlt betű

Az új fogalmakat, az URL-eket, az elektronikus levélcímeket, a fájl­neveket és a fájlkiterjesztéseket dőlt betűvel írtuk.

Állandó szélességű betű (írógépbetű) Ezt a betűstílust használtuk a programkódokhoz, valamint ami-kor a törzsszövegen belül olyan programelemekre hivatkoztunk, mint

a változó- és függvénynevek, az adatbázisok, az adattípusok, a kör­

nyezeti változók, az utasítások és a kulcsszavak.

10 l Előszó

Page 9: HTML5 - Az új Szabvány

Félkövér, állandó szélességű betű Ez a stílus azokat a parancsokat és más elemeket jelöli, amelyeket pontosan a megadott módon kell beírni.

Dőlt, állandó szélességű betű

Azokat az elemeket szedtük így, amelyeknek a helyére a megfelelő

- a felhasználó által megadott vagy a környezet által meghatározott­

értékeknek kell kerülniük

Ez az ikon jelzi a tippeket, javaslatokat vagy általános megjegyzéseket.

Ha egy webcím vagy egy programutasítás nem fért el egy sorban, így je­

löltük, hogy folytatólagosan írandó:

return ! ! (v. canPlayType && v. canPlayType (' video/ogg; codecs= "theora '" ) . � replace (/no/, ' ' ) ) ;

Megjegyzés a könyv különböző változatairól

A könyv eredeti kiadásának nyomtatott változatát a szerző által karbantartott

HTML5-forrásból készítették, amelyet a http://diveintohtml5.orgl címen

érhetünk el. Ha a nyomtatott változatot olvassuk, és kíváncsiak vagyunk

a többi hivatkozásra is, tekintsük meg az eredeti forrást. Mivel a szerző a http://diveintohtml5.org/ oldalt HTML5 nyelven tartja fenn, a könyvben

szereplő példakódok az oldalon működő változatban találhatók - sokat kö­zülük némileg módosítani kellett a közzétételhez. Ha látni szecetnénk ezeket

a példákat, látogassunk el a http://diveintohtml5.orgl címre, de vegyük figye­lembe, hogy az egyes böngészőkben nem biztos, hogy egyfon;nán működnek.

Page 10: HTML5 - Az új Szabvány

1. fejezet

Hogyan jutottunk el idáig?

Ugorjunk fejest!

Nemrég rábukkantam a Mozilla egyik fejlesztőjének írására, aki a szabványok

megalkotásának eredendő nehézségéről értekezett (http:!llists. w 3. orgiArchívesi Public/public-html/201 O jan/O l 01 h tm l}:

A megvalósírások és a szabványleírások bonyolult táncot lejtenek egy­

más körüL Nem akarjuk, hogy a megvalósírások elkészüljenek, mielőtt

a szabványt véglegesítenék, mert a felhasznáJók ezeknek a megvalósítá­

soknak a részleteitől kezdenek majd függni, és ez korlátozná a szabványt.

Ugyanakkor azt sem akarjuk, hogy a szabványleírás kész legyen, mielőtt

megszületne néhány megvalósítás, és a programozók kipróbálták volna

azokat, mert a szabványhoz szükség van visszajelzésre. Ez óhatatlanul

feszültséghez vezet, amivel viszont meg kell tanulnunk együtt élni.

Tartsuk észben a fenti idézetet, miközben elmesélem, hogyan is született meg

a HTML5.

MIME-típusok

Ez a könyv a HTML5-ről szól, nem a HTML korábbi változatairól, és nem is

az XHTML bármelyik változatáról. Ahhoz azonban, hogy megérthessük

a HTML5 történetét és megalkotásának mozgatórugóit, tisztában kell lennünk

néhány technikai részlettel- egészen pontosan a MIME-típusok mibenlétével.

Minden alkalommal, amikor a webböngészőnk egy oldalt kér, a webki­

szolgáló először néhány fejlécet küld neki, mielőtt átadná az oldal tényleges

l. fejezet Hogyan jutottunk el idáig? l 13

Page 11: HTML5 - Az új Szabvány

jelölőnyelvi kódját. Ezek a fejlécek alapesetben láthatók, bár több webfejlesztő eszköz is létezik, amelyekkel láthatatlanná tehetjük őket, amennyiben erre lenne szükségünk. A fejlécek lényegesek, mert ezek árulják el a böngészőnek, hogy miként kell értelmeznie az utánuk következő oldalleíró kódot. A legfon­tosabb fejléc neve Content-Type, és így néz ki:

Content-Type: text/html

A text/html az oldal "tartalomtípusa" (content type) vagy "MIME­típusa". Ez a fejléc az egyeden dolog, ami meghatározza, hogy valójában mi­lyen forrásanyagról van szó, és ebből következően hogyan kell megjeleníteni. A képeknek saját MIME-típusuk van (a JPEG-képek esetében ez az image/

jpeg, a PNG-képeknél az image/png, és így tovább), és a JavaScript-fájlok is saját MIME-típussal rendelkeznek, akárcsak a CSS-stíluslapok. Mindennek megvan a maga MIME-típusa- a W ebet a MIME-típusok működtetik.

A valóság persze bonyolultabb ennél. A nagyon régi webkiszolgálók (és itt most 1993-ra gondolok) nem küldték el a Content-Type fejlécet, mert az akkor még nem is létezett (csak 1994-ben találták fel). Az egészen 1993-ig visszanyúló megfelelőség érdekében egyes népszerű webböngészők bizonyos körűlmények között figyelmen kívül hagyják a Content-Type fejlécet. (Ezt hívják "tartalomszimatolásnak ", angolul "content sniffing"-nek.) Általános alapszabályként azonban elfogadhatjuk, hogy minden, amivel csak találko­zunk a Weben- HTML-oldalak, képek, parancsfájlok, videók, PDF-ek vagy bármi, aminek van URL-je - egy a Content-Type fejlécben megadott konkrét MIME-típus szerint jut el hozzánk a kiszolgálótól.

Ezt tűzzük a kalapunkra, mert még visszatérünk rá.

Hosszú kitérő a szabványok születéséről

Miért létezik az <img> elem? Nem hiszem, hogy ezt a kérdést gyakran tesz­szük fel magunknak. Valaki bizonyára megalkotta- ilyesmik nem pattannak elő csak úgy a semmiből. Ez minden elemre, minden jellemzőre és minden HTML-szolgáltatásra érvényes, amit valaha csak használtunk: valakik létre­hozták őket, eldöntötték, hogyan működjenek, aztán leírták ezt az egészet. Az alkotók nem istenek, csupán egyszerű halandók, így nem is hibátlanok. Persze okos emberek, de csak emberek.

14 l Hogyan jutottunk el idáig? l. fejezet

Page 12: HTML5 - Az új Szabvány

A "nyílt terepen" fejlesztett szabványokban az az egyik legjobb, hogy visz­szarnehetünk az időben, és megválaszolhatjuk az ilyen kérdéseket. A vita levelezőlistákon zajlik, amelyeken az üzeneteket általában archiválják, és nyil­

vánosan kereshetövé teszik. Ezért aztán úgy döntöttem, hogy végzek egy kis

"email-ásatást", hogy rábukkanjak az <img> elem eredetére. Olyan régre kellett visszamennem, amikor a World Wide Web Consortium (W3C) nevű szervezet még nem is létezett: a Web kezdeteihez, amikor a két kezünk ujjain

megszámolhattuk az összes webkiszolgálót (na jó, talán néhány lábujjat is igénybe kellett vennünk).

1993. február 25-én Marc Andreessen ezt írta:*

Szeretnék javasolni egy új, nem kötelező HTML-címkét: IMG Kötelező argumentuma: SRC= "ur 1 ".

Egy bitképes vagy pixelképes fájlt nevezne meg, amelyet a böngésző a hálózaton keresztül megkísérelhet letölteni és képként értelmezni, majd beszúrni a szövegbe ott, ahol a címke szerepel. Példa:

<IMG SRC= "file: l /foobar. com/foo/bar/blargh. xbm ">

(Záró címke nincs; az IMG önálló címke lenne.) Ezt a címkét ugyanúgy be lehetne ágyazni egy horgonyba, mint bármi mást. Ilyenkor egy ikon válna belőle, amelyet ugyanúgy aktiváini le­hetne, mint egy szokványos szöveghorgonyt. A böngészők rugalmasak lehetnek abban, hogy mely képformátumokat támogatják- az Xbm és az Xpm például jó választás. Ha egy böngésző nem tudja értelmezni az adott formátumot, tetszés szerint járhat el. (Az

X Mosaic egy alapértelmezett bitképet jelenít meg helyőrzőként.) Az X Mosaicban ez beépített képesség. Nálunk működik, és legalábbis belső használatra igénybe fogjuk venni. Természetesen nyitott vagyok minden javasia tra, hogy mikém kezelhetnénk ezt a címkét a HTML-ben. Ha valakinek jobb ötlete van, mint amit én az imént bemutat tam, kérem,

* hrtp:lll997.webhisrory. org/www.lisrsiwww-ralk.1993ql/0182.hrml. A következő néhány olda­lon leírt Üzenetválrás a "Nexr message" (Következő üzener) és "Previous message" {Előző üze­net) hivatkozásokra kaninrva köverherő.

1. fejezet Hogyan jutottunk el idáig? l 15

Page 13: HTML5 - Az új Szabvány

tudassa velem. Tudom, hogy a képformátum szempontjából ködös meg­oldás, de egyelőre nem tudok jobbat annál, mint hogy egyszerűen azt mondjuk, hogy "csinálja a böngésző azt, amire képes", és várunk, hogy megszülessen a tökéletes megoldás (egy nap talán a MIME).

Ez az idézet némi magyarázatra szorul. Először is, az Xbm és az Xpm a Unix rendszerek népszerű grafikus formátumai voltak akkoriban, a Mosaic pedig az egyik legrégebbi webböngésző. (Az X Mosaic ennek volt a Unix rendsze­reken futó változata.) Amikor Marc ezt az üzenetet írta 1993 elején, még nem alapította meg azt a vállalatot, a Mosaic Communications Corporationt, amely híressé tette, és még nem kezdett el dolgozni a vállalat legfőbb termékén, a Mosaic Netscape-en. (A vállalat és a program későbbi nevei talán ismerő­sebbek: a Netscape Corporation-ről és a Netscape Navigatorról van szó.)

Az "egy nap talán a MIME" a tartalomegyeztetésre utal: a HTTP-nek arra a szolgáltatására, amelynek az a lényege, hogy az ügyfél (például egy webböngésző) elárulja a kiszolgálónak (például egy webkiszolgálónak), hogy milyen típusú "erőforrásokat" támogat (például az image/jpeg típusú ké­peket), hogy a kiszolgáló az ügyfél által előnyben részesített formátumban adhasson vissza valamit. "Az eredeti HTTP, ahogy 1991-ben leínák" (1993 februárjában ez volt az egyetlen megvalósított változat) nem adott módot az ügyfélnek arra, hogy közölje a kiszolgálókkal, hogy milyen fajta képeket tá­mogat - ez okozott fejtörést Marcnak a tervezés során. Néhány órával később Tony Johnson válaszolt:

Nekem van valamim a Midas 2.0-ban, ami nagyon hasonló (itt, az SLAC-n már használjuk, és elvileg heteken belül sor kerül a nyilvános közzétételre is), csak az elnevezése más, és van még egy argumentuma, a NAME="név". Majdnem pontosan úgy működik, mint a javasolt IMG

címke. Itt egy példa:

<ICON name= "NoEntry" href= "http: //note/foo/bar/NoEntry .xbm ">

A name paramétert azért találtuk ki, mert így a böngésző rendelkezhet egy "beépített" képkészletteL Ha a megadott név megegyezik egy "be­épített" képével, a böngésző ezt a beépített képet használhatja, és nem kell lekérnie a képet. A név ezen kívül a "szöveges" böngészőknek is segít, hogy tudják, milyen jelet kell helyőrzőként betenniük a kép helyére.

16 l Hogyan jutottunk el idáig? 1. fejezet

Page 14: HTML5 - Az új Szabvány

Nekem nem számítanak különösebben a paraméter- vagy címkenevek, de ésszerű lenne ugyanazokat az elnevezéseket használni. A rövidítéseket nem szecetern- miért ne lehetne például IMAGE= és SOURCE=? Az ICON-t azért részesíteném előnyben, mert utal arra, hogy az IMAGE-nek kicsinek kell lennie - vagy már túl sok dolgot akarunk rátukmálni az ICON-ra?

AMidas szintén a korai webböngészők egyike- az X Mosaic kortársa- volt. Rendszerfüggetlen böngészőkém Unix és VMS rendszeren egyaránt futott. Az

"SLAC" a Stanford Linear Accelerator Center-re utal (ma SLAC National

Accelerator Laboratory-nak hívják), ahol az Egyesült Államok első webki­szolgálóját (Európán kívül a legelső webkiszolgálót) üzemeltették. Amikor Tony a fenti üzenetet írta, az SLAC már régi rootorosnak számított a WWW

területén, mivel öt oldalt működtetett a webkiszolgálóján, méghozzá példát­lanul hosszú ideig- 441 napig.

Tony így folytatta:

H a már új címkékről esik szó, van egy másik, némileg hasonló címkém, amit támogatni szecetnék aMidas 2.0-ban. Elvileg így néz ki:

<INCLUDE HREF= " ... ">

A célja az lenne, hogy egy második dokumentumot lehessen beágyazni az első be ott, ahol a címke szerepel. A hivatkozott dokumentum elvileg bármi lehet, de elsősorban képeket szecetnék beágyazni (ez esetben tet­szőleges méretben) szöveges dokumentumokba. Amikor aztán megérke­zik a HTTP2, a beágyazott dokumentum formárumát külön meg le­hetne vitatni.

A "HTTP2" a Basic HTTP 1992-es változatára utal, amit ekkor - 1993

elején- még nagyrészt nem valósítottak meg. A "HTTP2"-ként isrne.llt váz­latot aztán továbbfejlesztették, és végül

"HTTP 1.0" néven vált belőle szab­

vány. A HTTP 1.0-ba valóban belefoglalták a tattalomegyeztetésre szolgáló kérelemfejléceket, vagyis eljött "a MIME napja".

T o ny ugyanakkor még tovább ment:

Egy másik megoldás, amin töprengtem, ez volt:

<A HREF= • ... " INCLUDE>See photo</A>

l. fejezet Hogyan jutottunk el idáig? l 17

Page 15: HTML5 - Az új Szabvány

Nem igazán szeretnék további feladatokat róni az <A> címkére, de így meg lehetne őrizni az együttműködést az INCLUDE paramétert figyelembe venni nem képes böngészőkkeL A cél az lenne, hogy az INCLUDE-ot értő böngészők a horgonyszöveget (ami itt a See photo - Lásd a képet) a beágyazott dokumemumea (képre) cseréljék, míg a régebbi vagy bu­tább böngészők teljesen figyelmen kívül hagyják az INCLUDE címkét.

Ezt a javaslatot soha nem valósították meg, bár az az ötlet, hogy a böngésző szöveget jelenítsen meg a hiányzó képek helyén, igen fontosnak bizonyult az akadálymemesítés szempomjából, és ezt a megoldást Marc eredeti javaslata az <IMG> címkére nem tartalmazta. Évekkel később ebből lett az <img

alt> jellemző, amelyet a Netscape rögtön el is szúrt, mert tévesen súgószö­vegkém kezelte.

Néhány órával azt követően, hogy Tony közzétette a levelét, Tim Berners­Lee válaszolt rá:

Én úgy képzeltem, hogy az ábrákat így írnánk le:

<a name=figl href= "fghj kdfghj • REL= "EMBED, PRESENT ''>Ábra </a>

A fenti viszonyértékek jelentése pedig ez lenne:

EMBE D

PRESENT Eztágyazd be ide, am ikor m egjeleníted Jelenítsct meg a forrásdokumentum megjelenítésekor

Észrevehető, hogy a fentieknek különböző kombinációi lehetnek, és ak­kor sincs gond, ha a böngésző nem támogatja valamelyiket. Belátom ugyanakkor, hogy a kiválasztható ikonok megvalósításának ez a módszere horgonyok beágyazását jelentené-hmmm ... -de nem akartam külön címkét erre a célra.

Ezt a javaslatot sem valósították meg, de a rel jellemző még ma is létezik (lásd a "Viszonyleíró elemek" című részt a 3. fejezetben).

Jim Davis a következőket f űzte hozzá a témához:

Klassz lenne, ha lenne rá valamilyen mód, hogy megadjuk a tartalom típusát. Például: <IMGHREF="http://nsa.gov/pub /sounds/gorby.au"CONTENT-TYPE=audio/basic>

18 l Hogyan jutottunk el idáig? l. fejezet

Page 16: HTML5 - Az új Szabvány

Persze én teljesen jól elvagyok azzal a követelménnyel, hogy a tartalom­típust a fájlkiterjesztés határozza meg.

Ezt a javaslatot sem valósították meg, de a Netscape később beépítette a tet­szőleges médiaobjektumok beágyazásának lehetőségét az <embe d> elemmel.

Jay C. Webber ezt a kérdést tette fel:

A képek nálam az első helyen állnak a WWW-böngészőkben támoga­tandó médiatípusok kívánságlistáján, de nem gondolom, hogy külön horgokat kellene megadnunk minden egyes kép beágyazásakor. Hová lett a MIME-típusok iránt érzett lelkesedés?

Marc Andreessen ezt válaszolta:

Ez nem helyettesítené a jövőbeli MIME-ot, mint szabványos doku­mentumleíró módszert, csupán egyszerű megvalósitását nyújtaná egy a MIME-tól függetlenül szükséges szolgáltatásnak.

Jay C. Webber erre ezt írta vissza:

Akkor egy időre feledkezzünk meg a MIME-ról, ha elfedi a lényeget. Én azt kifogásoltam, hogy azon töprengünk, hogy "miként támogassuk a képek beágyazását", ahelyett, hogy arról beszélnénk, hogy "miként tá­mogathatnánk a különféle hordozókba beágyazott objektumokat". Ha ebben az irányban tapogatózunk, a jövő héten valaki majd azzal áll elő, hogy vegyünk fel egy <AUD SRC=">file://foobar.com/foo/bar/

blargh. snd "> alakú új címkét a hangfájlok számára. Szeriotem jobb lenne valamilyen általánosabb megoldást alkalmazni.

Visszatekintve úgy tűnik, hogy Jay teljesen jogosan aggódott. Valamivel to­vább tartott egy hétnél, de a HTMLS végül csak bevezetett új <video> és <audio> elemeket.

J a y eredeti üzenetére válaszolva Dave Ragget t a következőket Írta:

Milyen igaz! Én is sok-sok kép- és vonalrajztípust szeretnék használni, és lehetőséget szeretnék a formátum egyeztetésére. Ezen felül Tim

l. fejezet Hogyan jutottunk el idáig? l 19

Page 17: HTML5 - Az új Szabvány

megjegyzése a képeken belüli kattintható területek támogatásáról ugyan­

csak fontos. 1993 folyamán később Dave felvetette a HTML+, mint a HTML-szabvány

továbbfejlesztése ötletét. A javaslatát soha nem valósították meg, végül pedig

túllépett rajta a HTML 2.0. A HTML 2.0 "retrospektív szabványnak" ké­

szült, vagyis olyan szolgáltatásokat szabványosított, amelyeket már régóta

széles körben használtak. "Ez a szabvány azokat a lehetőségeket gyűjti össze,

tisztázza és írja le formálisan, amelyek nagyjából megfelelnek a HTML 1994

júniusa előtt általánosan használt szolgáltásainak."

Dave később a HTML+ régi vázlata alapján megírta a HTML 3.0-t, de

a W3C saját referencia-megvalósításától, azArenától eltekintve ezt sem való­

sították meg. A helyébe a szintén "retrospektív szabvány" HTML 3.2 lépett:

"A HTML 3.2 széles körben használt elemekkel- táblázatokkal, kisalkalma­

zásokkal és képek köré folyatott szöveggel - bővíti a nyelvet, miközben teljes

körű visszamenőleges együttműködést biztosít a meglevő HTML 2.0 szab­vánnyal."

Dave később társszerzőként közreműködött a HTML 4.0 elkészítésében,

megalkotta a HTML Tidy-t, és segített az XHTML, az XForms, a MathML

és más újabb W3C-szabványok kidolgozásában.

De térjünk vissza 1993-hoz. Marc ezt felelte Dave-nek:

Tulajdonképpen lehet, hogy egy általános célú, eljárásközpontú grafikai

nyelvet kellene kidolgoznunk, amelyen belül lehetőség lenne tetszőleges,

ikonokra, képekre, szövegre vagy bármi másra mutató hi perhivatkozások

beágyazására. Ismeri más is az Intermedia ilyen irányú képességeit?

Az Intermedia a Brown Egyetem hiperszöveges programja volt, amelyet

1985-től 1991-ig fejlesztettek, és azA/UX-en, a korai Macintosh-számítógépek

Unix-szerű operációs rendszerén futott. Az "általános célú, eljárásközpontú grafikai nyelv" ötlete végül teret is

nyert. A mai böngészők mind az SVG-t (deklaratÍv leírókód beágyazott pa­

rancsokkal), mind a <canvas>-t (eljárásközpontú, közvetlen módú grafikai

API) támogatják, bár az utóbbi magánfejlesztésű bővítményként kezdte a pá­

lyafutását, mielőtt a WHAT munkacsoport "retrospektív szabványosítással"

hivatalossá tette volna.

Bill Janssen az alábbiakat válaszolta:

20 l Hogyan jutottunk el idáig? l. fejezet

Page 18: HTML5 - Az új Szabvány

Vannak más figyelemre méltó rendszerek is, amelyek rendelkeznek az

említett ( meglehetősen hasznos) képességekkel: az Andrew és a Slate. Az

Andrew-t úgynevezett "betét"-ek (inset-ek) építik fel, amelyeknek kü­

lönböző érdekes típusai vannak: szöveg, bitkép, rajz, animáció, üzenet,

táblázat, és így tovább. Az Andrew-ban adott a tetszőleges szimű be­

ágyazás lehetősége, vagyis bármilyen betét beágyazható bármilyen más

betétbe, amely támogatja a beágyazást. Egy betét például beágyazható

egy szövegvezérlő szövegének bármely pontján, vagy egy rajzvezérlő tet­

szőleges téglalap alakú területébe, vagy egy táblázat bármely cellájába.

Az "Andrew" az Andrew User Interface System-re utal, bár akkor még csak

egyszerűen Andrew Project-kém ismerték.

Közben Thomas Fine egy másik ötlettel állt elő:

Az én véleményem a következő. A WWW-ben a képek beágyazására a legjobb megoldás a MIME használata. Biztos vagyok benne, hogy a

pastscript már támogatott altípus a MIME-ban, és a pastscript nagyon

ügyesen kezeli a képekkel kevert szövegeket.

Csak éppen nem kattimható, ugye? Igen, így igaz- de gyanítom, hogy

erre már van megoldás a display postscriptben. De még ha nincs is,

a szabványos pastscript könnyen bővíthető vele. Csak meg kell hatá­

rozni egy horgonyparancsot, amely megadja az URL-t, és az aktuális

elérési utat a gomb zárt területekém használja. Mivel a pastscript na­

gyon jól kezeli az elérési utakat, tetszőleges gombalakot lehet létrehozni

pofonegyszerűen.

A Display Postscript egy képernyős megjelenítési technológia volt, amelyet

közösen fejlesztett ki az Adobe és a NeXT.

Ezt a javaslatot sem valósították meg, de az ötlet, miszerint a HTML hi­báit úgy lehet a legjobban kijavítani, hogy valami teljesen másra cseréljük, ma

is időről időre felbukkan.

1993. március 2-án Tim Berners-Lee az alábbi megjegyzést fűzte a témához:

A HTTP2 bármilyen típusú adatot megenged egy dokumentum­ban, amelyről a felhasználó azt állítja, hogy képes kezelni, nem csak a

bejegyzett MIME-típusokat. Tehát kísérletezhetünk. Azt hiszem, lenne

1. fejezet Hogyan jutottunk el idáig? l 21

Page 19: HTML5 - Az új Szabvány

létjogosultsága a hiperszöveges postscriptnek, azt viszont nem tudom, hogy a display postscript elég érvet tud-e felsorakoztatni mellette. Azt

tudom, hogy az Adobe fejleszti a saját, postscript alapú "PDF"-jét, amelyben hivatkozások is lesznek, és az Adobe saját megjelenítőprog­

ramjaival lehet majd olvasni. Arra gondoltam, hogy ha a horgonyokhoz lenne egy általános (HyTime

alap ú?) "ráfektető" nyelv, akkor a hi perszöveges és a grafika- vagy vicleoszab­ványok egymástól függetlenül fejlődhetnének, ami mindkettőn segítene.

Legyen az IMG címke INCLUDE, és mutasson tetszőleges dokumentumtÍ­pusra. Vagy legyen EMBED, ha az INCLUDE úgy hangzana, mintha cpp­beágyazásról lenne szó, amitől az ember azt várja, hogy SGML-forrás­

kódot ad, amit helyben kell feldolgozni - márpedig nem ez a cél.

A HyTime egy korai, SGML alapú hiperszöveges dokumentumrendszer volt,

és az árnyéka kezdetben jócskán ráverült a HTML-lel és később az XML-lel kapcsolatos eszmecserékre.

Timnek az <INCLUDE> címkére vonatkozó javaslatát soha nem valósítot­ták meg, bár az öröksége tetten érhető az <object>, az <embed> és az

<iframe> elemben. Végüll993. március 12-én Marc Andreessen is visszatért az üzenetszálhoz:

Ismét a beágyazott képekről: egyre közelebb kerülök a Mosaic vO.lO

kiadásához, amely - ahogy korábban említettem - támogaeni fogja a beágyazott GIF és XBM képeket/bitképeket. [ ... ] Jelenleg nem állunk készen az INCLUDE!EMBED támogatására, [ ... ] ezért

valószínűleg az <IMG SRC="url"> változatnál maradunk (nem az ICON

mellett döntöttünk, mert nem minden beágyazott képre igaz, hogy ikon

lenne). A beágyazott képek egyelőre nem kapnak kifejezetten tartalom­

tÍpust, de később ezt is támogatn i tervezzük (a MIME általános megva­

lósításával együtt). A képolvasó eljárások, amelyeket jelenleg használunk, valójában mener közben képesek felismerni a kép formátumát, ezért a fájlnév-kiterjesztésnek nem is lesz jelentősége.

22 l Hogyan jutottunk el idáig? l. fejezet

Page 20: HTML5 - Az új Szabvány

Töretlen fejlődés

Engem minden szempontból lenyűgöz ez a 17 éves eszmecsere, amely végül egy olyan HTML-elem megalkotásához vezetett, amelyet szinte minden va­laha létrehozott weboldalon felhasználtak. Gondoljuk csak végig:

• A HTTP még mindig létezik. Sikeresen eljutott a 0.9-estől az 1.0-s, majd később az 1.1-es változatig, és még mindig fejlődik (http:llwww.ieif.org/ dynlwglcharterlhttpbis-charter. h tm l}.

• A HTML még mindig létezik. Ez a kezdetleges adatformárum (még a szövegbe ágyazott képeket sem támogatta!) sikeresen elérte a 2.0, 3.2 és 4.0 változatszámoL A HTML fejlődésének vonala töretlen. Kanyar­gós, itt-ott csomókkal és vadhajtásokkal tarkított - evolúciós fája jócs­kán tartalmaz "halott ágakat", vagyis olyan helyeket, ahol a szabványok megszállottjai önmagukat (és persze a programozókat) is megelőzték -, de akkor is töretlen, és ma, 2010-ben az 1990-ből származó weboldalak még mindig megjeleníthetők a mai böngészőkben. Épp az imént töltör­tem be egyet simán a csúcstechnikás Android mobiltelefonom böngé­szőjébe, és még olyan üzenetet sem kaptam, hogy "kérem, várjon, amíg a böngésző feldolgozza a régi formátumot ... ".

• A HTML mindig is népszerű társalgási téma volt a böngészőkészírők, a szakkönyvírók, a szabványokkal foglalkozók és más emberek körében, akik bármikor szívesen cserélnek eszmét a csúcsos zárójelekrőL A HTML legsikeresebb változatai "retrospektív" szabványok voltak, amelyek egy­szerre igyekeztek lépést tartani a világgal és a helyes irányba terelni azt. Azok, akik azt mondják, hogy a HTML-nek "tisztának" kellene maradnia (feltehetően a böngészőgyártók, a programozók vagy mindkét csoport figyelmen kívül hagyásával), egyszerűen nincsenek tisztában a helyzetteL A HTML soha nem volt tiszta, és minden kísérlet, amely a megtisztí­rására irányult, látványosan elbukott, akárcsak a felváltására tett pró­bálkozások.

• Az 1993-ban használt böngészők egyike sem létezik semmilyen felismer­hető formában. A Netscape Navigator fejlesztését 1998-ban abbahagy­ták, és az alapoktól újraírták a programot - ebből lett a Mozilla Suite, majd a projekt egyik elágazásából megszületett a Firefox. Az Internet Explorer szerény "kezdetei" a Microsoft Plus! for Windows 95-ig nyúlnak

1. fejezet Hogyan jutottunk el idáig? J 23

Page 21: HTML5 - Az új Szabvány

vissza, ahol a programot még asztaltémákkal és egy flipperjátékkal cso­magolták össze. Persze, ha akarjuk, a böngésző eredetéhez mélyebbre is áshatunk.

• Az 1993-ban létező operációs rendszerek némelyike ma is megvan, de egyik sem játszik lényeges szerepet a Web szempontjábóL A V ilágháló élményét

"megtapasztaló" felhasználók többsége ma (2000 utáni) Windowst vagy valamilyen Linux rendszert futtató PC-t, Mac OS X rendszerű Mac-et, illetve az iPhone-hoz hasonló kézi eszközöket használ. 1993-ban a Win­dows még csak a 3.1-es változatnál tartott (és az OS/2-vel versenyzett a piacért), a Mac-ek a System 7-re épültek, a Linuxot pedig aUseneten keresztül terjesztették. (Szeretnénk egy jót nevetni? Keressünk egy ősz szakállú informatikust, és mondjuk neki, hogy "T rumpet Winsock" vagy azt, hogy "MacPPP".)

• Azoknak a kereteknek a kidolgozásában, amelyeket ma egyszerűen "web­szabványoknak" nevezünk, a "régiek" közül is részt vesznek néhányan. Pedig azóta eltelt 20 év! Vannak, akik még a HTML előfutárain is dol­goztak, az 1980-as években vagy még régebben.

• Ha már az előfutárokról beszélünk . .. A HTML és a Web mai népsze­rűsége könnyen elfeledteti az emberrel azokat a velük egyidős formá­tumokat és rendszereket, amelyek nagy hatással voltak a fejlődésükre. Mielőtt elolvastuk ezt a fejezetet, hallottunk valaha az Andrew-ról? És az lntermediáról? Vagy a HyTime-ról? A HyTime ráadásul nem valamilyen ütött-kopott kutatóintézeti projekt volt, hanem katonai használatra elfo­gadott ISO-szabvány- Nagy Üzlet! Magunk is olvashatunk róla a http:/1

www.sgmlsource. comlhistorylhthist. h tm l címen.

Ez persze mind szép, de nem ad választ az eredeti kérdésünkre: miért létezik az <img> elem? Miért nem <icon>-nak hívják? Vagy <include>-nak? Miért nem hiperhivatkozás include jellemzővel, vagy rel értékek valamilyen kombi­nációja? Miért pont az <img> elemet fogadták el? Nos, egyszerűen azért, mert Marc Andreessen kidolgozta és közzétette, és mindig a kész kód nyer.

Ezzel persze nem azt akarom mondani, hogy minden kész kód nyer -végtére is, az Andrew, az Intermedia és a HyTime is kész kódokból álltak. A kész kód szükséges, de nem elégséges a sikerhez. És természetesen nem is úgy értem, hogy a szabvány elkészülte előtt leszállított kód a legjobb megol­dás. Marc <img> eleme nem követelt meg egy adott grafikaformátumot;

24 l Hogyan jutottunk el idáig? 1. fejezet

Page 22: HTML5 - Az új Szabvány

nem szabta meg, hogyan folyja körül a szöveg a képet; és nem támogatta a helyettesítő szövegeket vagy a régebbi böngészőknek nyújtott alapértelme­zett tartalmat. 17 évvel később még mindig küszködünk a tartalom kiszimato­lásával, ami még mindig őrült biztonsági kockázatok forrása. Mindezt nyomon követhetjük a Nagy Böngészőháborún át egészen 1993. február 25-ig, amikor Marc Andreessen mellékesen odavetette, hogy "egy nap talán a MIME

", aztán

ettől függetlenül közreadta a kódját.

A HTML fejlődésének története 1997 és 2004 között

1997 decemberében a World Wide Web Consortium (W3C) közzétette a HTML 4.0-t, és nyomban le is állította a HTML-munkacsoport (HTML Warking Group) munkáját. Kevesebb mint két hónappal később a W3C egy másik munkacsoportja közreadta az XML 1.0-t. Mindössze három hónappal ezt követően a W3C "Shaping the Future of HTML" (A HTML jövőjének alakítása) címmel műhelyt szervezett, hogy választ adjon a kérdésre: "A W3C feladta a HTML fejlesztését?

". A válaszuk ez volt:

A megbeszélések során egyetértettünk abban, hogy a HTML 4.0 további

bövítése körülményes lenne, akárcsak a 4.0 átalakítása XML-alkalma­zássá. A korlátok közül úgy kívánunk kitörni, hogy a HTML következő nemzedékét új alapokra helyezzük, és XML-elemhalmazokra építjük.

A W3C újjászervezte a HTML-munkacsoportot, és azt a feladatot adta neki, hogy alkossa meg ezeket az "XML-elemhalmazokat

". A munkacsoport ragjai

első lépésként 1998 decemberében elkészítettek egy ideiglenes szabványváz­

latot, amely egyszerűen XML-ben fogalmazta újra a HTML-t, anélkül, hogy bármilyen új elemet vagy jellemzőt adott volna hozzá. Ez a szabványleírás vált később XHTML 1.0 néven ismertté. A vázlat az XHTML-dokumentumok számára egy új MIME-típust határozott meg, az application/xhtml+

xml-r. Ugyanakkor a meglevő HTML 4 szabványú oldalak átalakírásának

megkönnyítése érdekében hozzábiggyesztették a C függeléket, amely "ösz­szefoglalja a tervezési irányelveket azoknak az oldalfejlesztöknek a szá­mára, akik az XHTML-dokumentumaik megfelelő megjelenítését a meglevő HTML-megjelenítő programokban is biztosítani szeretnék

". A C függelék

l. fejezet Hogyan jutottunk el idáig? l 25

Page 23: HTML5 - Az új Szabvány

kimondta, hogy megengedett olyan "XHTML-oldalak" készítése, amelyeket

a kiszolgáló továbbra is a text/html MIME-típussal ad át. A következő célpontot a webes űrlapok jelentették. 1999 augusztusában

ugyanez a HTML-munkacsoport közzétette az XHTML Extended Forms

(XHTML bővített űrlapok) leírásának első vázlatát. A munkacsoport tagjai

már a vázlat első néhány mondatában (http:llwww.w3.org/TR/1999/WD­

xhtmljorms-req-19990830#intro) megfogalmazták az elvárásaikat:

Gondos médegelés után a HTML Warking Group arra a megállapításra

jutott, hogy az űrlapok következő nemzedékére háruló feladatok nem

egyeztethetők össze a HTML korábbi változataihoz tervezett böngé­

szöknek való visszamenőleges megfelelőséggeL A célunk az, hogy egy

tiszta, új űrlapmodellt ("XHTML Extended Forms") állítsunk fel, amely

jól meghatározott követelményeknek tesz eleget. Az ebben a dokumen­tumban leírt követelmények az űrlapalkalmazások igen széles körének

használata során szerzett tapasztalatokra épülnek.

Néhány hónappal később az "XHTML Extended Forms"-t átnevezték

"XForms"-ra, és külön munkacsoportot jelöltek ki a kidolgozására. Ez a cso­

port párhuzamosan dolgozott a HTML-munkacsoporttal, és az XForms első

kiadását végül 2003 októberében tette közzé.

Közben, az XML-re történő átállás befejeztével, a HTML-munkacsoport

tagjai nekiláttak "a HTML következő nemzedékének" megalkotásához.

200 l májusában közzétették az XHTML 1.1 első kiadását, amely csak né­

hány apróbb szolgáltatással bővítette az XHTML l. O-t, viszont kiküszöbölte a C függelékből eredő ellentmondást. Az 1.1-es változattól kezdve minden

XHTML-dokumentumot az application/xhtml+xml MIME -típussal

kell szolgáltatni.

Minden, amit az XHTML-ről tudunk, téves

Miért fontosak a MIME-típusok? Miért térek vissza hozzájuk újra meg újra?

Két szóban összefoglalhatom: a drákói hibakezelés miatt. A böngészők mindig

"elnézőek" voltak a HTML nyelvű dokumentumokkal szemben. Ha elkészí­

tünk egy HTML-oldalt, de elfelejtünk címer adni neki a <title> elemmel,

26 l Hogyan jutottunk el idáig? l. fejezet

Page 24: HTML5 - Az új Szabvány

a böngészők akkor is megjelenítik a lapot, annak ellenére, hogy a <title>

elem mindig is kötelező volt, a HTML minden változatában. Ezen kívül bi­zonyos címkék nem megengedettek más címkéken belül, de ha olyan oldalt készítünk, amely ilyen címkéket ágyaz egymásba, a böngészők (valamilyen módon) megbirkóznak vele, és még csak hibaüzenetet sem adnak.

Ahogy az várható is volt, az a tény, hogy a webböngészőkben a "hibás"

HTML-kódok is működnek, ahhoz vezetett, hogy a szerzők hibás HTML­oldalakat készítettek. Sok-sok hibás oldalt. Egyes becslések szerint a Weben ma található HTML-oldalak 99 százaléka tartalmaz legalább egy hibát. Mi­vel azonban ezek a hibák nem kényszerítik látható hibaüzenetek megjeleníté­sére a böngészőket, senki sem vesződik a kijavításukkal.

A W3C ezt alapvető problémaként értékelte a Webbel kapcsolatban, és elhatározta, hogy megoldást ad rá. Az 1997-ben közzétett XML szakított az elnéző ügyfélprogramok hagyományával, és minden XML-fogyasztó program számára kötelezővé tette, hogy az úgynevezett "jólformáltsági hibákat" vég­zetes hibának kell tekinteni. Az első hiba végzetességének ez az elve "drákói hibakezelés" néven vált ismertté, az i.e. VII. században élt görög törvényhozó, Drakón után, aki a viszonylag kisebb kihágásokat is halállal büntette. Amikor a W3C XML-szótárként újrafogalmazta a HTML-t, a feladattal megbízott szakemberek megkövetelték, hogy az új application/xhtml+xml MIME­

típussal kiszolgált valamennyi dokumentum drákói elbírálás alá essen a hibák szempontjábóL Ha az XHTML-oldalunkon akár csak egyetlen hiba is van, a webböngészőknek nincs más választásuk, mint hogy leállítsák az oldal fel­dolgozását, és hibaüzenetet jelenítsenek meg a végfelhasználónak

Ez az elv nem örvendett általános népszerűségnek. Mivel a meglevő olda­lak a becslések szerint 99 százalékban hibásak voltak, és így a végfelhaszná­lóknak folyamatosan hibaüzeneteket kellett volna küldeni, az XHTML 1.0 és 1.1 új szolgáltatásainak szűkössége pedig nem ellensúlyozta ezt az árat, a weboldalak szerzői lényegében figyelmen kívül hagyták az application/

xhtml+xml-t. Ez persze nem azt jelenti, hogy teljesen levegőnek nézték az XHTML-t. A legkevésbé sem. Az XHTML 1.0 szabványleírás C függeléke biztosított egy kiskaput a világ webfejlesztői nek: "Használjunk valami olyas­

mit, ami hasonlít az XHTML nyelvtanára, de adjuk át továbbra is a text/

html MIME-típussal." A webfejlesztök ezrei pontosan ezt tették: "frissítet­tek " az XHTML nyelvtanára, de a dokumentumokat továbbra is a text/

h tm l MIME-típussal szalgálták ki.

1. fejezet Hogyan jutottunk el idáig? l 27

Page 25: HTML5 - Az új Szabvány

Még ma is, amikor számtalan weboldal állítja magáról, hogy XHTML nyelvű -az első sorban az XHTML dokumentumtípus-meghatározással kezdődik, kisbetűs címkeneveket használ, idézőjelek közé zár minden jellem­zőértéket, és záró perjelet tesz az olyan üres elemek után, mint a <b r /> vagy a <hr /> -csupán az oldalak töredéke használja az application/

xhtml +xml MIME-típust, amely kiváltaná az XML drákói hibakezelését. A text/html MIME-típussal kiszolgált oldalakat azonban a dokumen­

tumtípusuktól, a nyelvtanuktól és a kódolási stílusuktól függetlenül kivétel nélkül egy "elnéző" HTML-értelmező dolgozza fel, amely csendben figyel­men kívül hagyja a leírókód hibáit, és soha nem figyelmezteti a végfelhasz­nálót (vagy bárki mást), még ha az oldal technikailag hibásnak minősül is.

Az XHTML 1.0-ban még megvolt ez a kiskapu, de az XHTML U lezárta,

a véglegesítésig soha el nem jutó XHTML 2.0 pedig folytatta a drákói hibake­zelés hagyományát. Ezért léteznek oldalak milliárdjai, amelyek XHTML l. O

tÍpusúnak adják ki magukat, és ezért van csak egy maroknyi, amely azt állítja magáról, hogy az XHTML 1.1-et (vagy az XHTML 2.0-t) követi. Valóban

XHTML-t használunk hát? Nézzük meg a MIME-típust (valójában, ha nem tudjuk, milyen MIME-típust használunk, elég biztosra vehető, hogy még mindig a text/html lesz): hacsak nem az application/xhtml+xml

MIME-típussal szolgáltatjuk az oldalainkat, az állítólagos "XHTML-olda­laink" csak a nevükben követik az XML-t.

Egy versenyképes látomás

2004 júniusában a W3C Workshop on Web Applications and Compound Documents rendezvényén részt vettek a böngészőgyártók és a webfejlesztő cégek képviselői, valamint a W3C más tagjai. Az érdekelt felek -köztük

a Mozilla Foundation és az Opera Software -egy csoportja előadást tartott arról, hogy ők hogyan képzelik el a Web jövőjét: a meglevő HTML 4 szab­vány továbbfejlesztésével, és a modern webalkalmazások fejlesztését segítő új szolgáltatások beépítésével (http://www. w 3. org/2004/04/webapps-cdfws/ paperslopera. h tm/):

A következő hét alapelv jelképezi, hogy mi mit tartunk a legfontosabb követelményeknek:

28 l Hogyan jutottunk el idáig? l. fejezet

Page 26: HTML5 - Az új Szabvány

Visszirányú megfelelöség, világos átállási útvonal

A webalkalmazások technológiáinak olyan szabványokon kell alapulniuk,

amelyeket a webfejlesztök jól ismernek, beleértve a HTML-t, a CSS-t,

a DOM-ot és a JavaScriptet.

A webalkalmazások alapszolgáltatásainak megvalósíthatónak kell len­

niük a ma az IE6-ban rendelkezésre álló műveletek, parancskóclak és

stíluslapok segítségéve!, hogy a fejlesztök világos átállási útvonalat kö­

vethessenek. Igen valószínűtlen, hogy bármely olyan megoldás sikeres­

nek bizonyulna, amely nem alkalmazható bináris bővítmények nélkül

a jelenleg a legnagyobb piaci részesedéssei bíró böngőszőben.

jól körülírt hibakezelés

A hibakezelést a webalkalmazásokban olyan részletességgel kell megha­

tározni, hogy a böngészőknek (felhasználói ügynököknek-User Agent,

UA) ne kelljen saját hibakezelő eljárásokat kidolgozniuk, vagy más fel­

használói ügynökök kódját visszafejteniük

A felhasználónak nem szabad találkoznia a szerzöi hibákkal

A szabványoknak pontosan le kell írniuk a hiba utáni helyreállítás mód­

ját minden lehetséges hibaforgatókönyvre. A hibakezelést, amikor csak

lehet, elegáns helyreállásként kell megvalósítani (mint a CSS-ben), nem

pedig nyilvánvaló és katasztrofális vészhelyzetként (mint az XML-ben).

Gyakorlati haszon

A webalkalmazások szabványaiba bekerülő minden szolgáltatásnak iga­

zolható gyakorlati haszna kell legyen. Ennek fordítottja nem feltétlenül

igaz: nem minden gyakorlati haszon igazolja egy új szolgáltatás szüksé­

gességét.

A gyakorlati hasznot igazoló használati eseteket lehetőleg olyan valós

webhelyekről kell venni, ahol a szerzők korábban más, sikertelen meg­

oldással próbáltak túllépni a korlátokon.

A parancskódok velünk maradnak ...

. . . ugyanakkor kerülendők, amennyiben kényelmesebb, deklaratív leíró­

kód is használható helyettük. A parancskódoknak eszköz- és megjelenítő­

függetleneknek kell lenniük, kivéve ha a hatókörüket eszközfüggő mó­

don határozzák meg (vagyis XBL-be foglalják).

Az eszközfüggö profilokat célszerű elkerülni

A szerzőknek képesnek kell lenniük ugyanazokra a szolgáltatásokra tá­

maszkodni a felhasználói ügynökök asztali és mobilválrozataiban.

1. fejezet Hogyan jutottunk el idáig? l 29

Page 27: HTML5 - Az új Szabvány

Nyílt folyamat A Web nyer azzal, hogy a fejlesztése nyílt környezetben folyik. A Web középpontj ában a webalkalmazások fognak állni, ezért ezek fejlesztésének

is nyíltan kell történnie. A levelezőlistákat, archívumokat és szabvány­tervezeteket folyamatosan elérhetővé kell tenni a nagyközönség számára.

A műhely résztvevőit megszavaztatták, hogy "a W3C deklaratív bővítéseket dolgozzon ki a HTML-hez és a CSS-hez, valamint imperatív bővítéseket a DOM-hoz, hogy eleget tegyen a középszintű webalkalmazások követelmé­nyeinek" vagy "kifinomult, teljes értékű, operációs rendszer szintű alkalma­zásprogramozási felületeket

"? Az első megoldásra 8-an, a másodikra ll-en

szavaztak. A műhely összefoglalójában (http:llwww.w3.org/2004104/webapps­cdfwslsummary) a W3C tagjai ezt írták: " A W3C jelenleg nem kíván semmi­lyen erőforrást áldozni a harmadik szavazás kérdésében érintett területre -a HTML és a CSS bővítésére a webalkalmazásokat illetően -, eltekintve

a W3C munkacsoportjai által jelenleg is fejlesztett technológiáktól." Ezzel a döntéssel szembesülve azoknak, akik a HTML és a HTML­

űrlapok továbbfejlesztését javasolták, két lehetőségük maradt: feladják, vagy a W3C keretein kívül folytatják a munkájukat. Az utóbbi mellett döntöttek: bejegyeztették a whatwg.org tartománynevet, és 2004 júniusában megszüle­tett a WHAT Warking Group.

Milyen munkacsoport?

Mi a túró az a WHAT Warking Group? Mondják el ők a saját szavaikkal

(http://www. whatwg. orginewsis tart):

A Web Hypertext Applications Technology Warking Group web­böngésző-gyártók és webfejlesztésben érdekelt felek laza, nem hivatalos, nyílt társulása. A csoport célja szabványok kidolgozása a HTML és a hozzá kapcsolódó technológiák alapján, hogy megkönnyítse az együtt­működni képes webalkalmazások készítését, és eredményeit szándéká­

ban áll benyújtani egy szabványügyi szervezetnek. Ezek a benyújtott tervezetek képeznék a HTML szabványos, hivatalos bővítésének alapját.

30 l Hogyan jutottunk el idáig? 1. fejezet

Page 28: HTML5 - Az új Szabvány

Fórumunkat több hó napnyi, az említett technológiák szabványairól foly­

tatott privát elektronikus levelezés után nyitottuk meg. Eddig a HTML4

Forms bővítésére összpomosítottunk, azzal a céllal, hogy úgy támogassuk a webfejlesztök által igényelt új szolgáltatásokat, hogy közben visszame­

nőlegesen megőrizzük az együttműködést a meglevő tartalmakkal. A cso­

portot azzal a szándékkal hoztuk létre, hogy biztosítsuk az említett szab­ványok jövőbeli fejlesztésének teljes nyilvánosságát egy a nagyközönség számára hozzáférhető, nyílt levelezőlistán keresztül.

A kulcsmondat itt a "visszamenőlegesen megőrizzük az együttműködést a meglevő tartalmakkal". Az XHTML (leszámítva a C függelék nyújtotta kiskaput) visszamenőlegesen nem egyeztethető össze a HTML-lel: teljesen új MIME-típust igényel, és drákói hibakezelést követel meg minden ilyen MIME­típussal szolgáltatott tartalom esetében. Az XForms sem képes a visszirányú

együttműködésre a HTML-űrlapokkal, mert csak olyan dokumentumokba építhető be, amelyek az XHTML új MIME-típusát használják, ami azt je­

lenti, hogy az XForms is kötelezővé teszi a drákói hibakezelést. Minden út a MIME-hoz vezet.

Ahelyett, hogy sutba dobott volna egy évtizednyi, a HTML-be fektetett

erőfeszítést, és használhatatlanná tette volna a meglevő weboldalak 99 szá­zalékát, a WHAT munkacsoport úgy döntött, hogy más megközelítést

követ: dokumentálja a böngészők által ténylegesen alkalmazott "elnéző"

hibakezelő algoritmusokat. A webböngészők mindig is elnézőek voltak

a HTML-hibákkal szemben, de senki sem vette a fáradságot, hogy pontosan leírja a viselkedésüket. Az NCSA Mosaic-nak saját algaritmusai voltak a hi­bás oldalak kezelésére, és a Netscape ezekhez próbált igazodni. Aztán az

Internet Explorer követte a Netscape-et, az Opera és a Firefox megpróbálta

utánozni az Internet Explorert, aSafari pedig a Firefox nyomába eredt, és így tovább, egészen a mai napig. Közben pedig a fejlesztök ezer meg ezer mun­kaórát öltek abba, hogy a termékeiket egyenértékűvé tegyék a versenytársak programjaivaL

Ha ez eszetlen mennyiségű munkának tűnik, az azért van, mert tényleg

az. Vagy legalábbis az volt. Sok évbe telt, de a WHAT munkacsoport (néhány homályos esetet leszámítva) sikeresen dokumentálta, hogyan kell a HTML-t a meglevő webes tartalmakkal összeegyeztethető módon értelmezni. A végső

l. fejezet Hogyan jutottunk el idáig? l 31

Page 29: HTML5 - Az új Szabvány

algoritmusban egyetlen olyan lépés sincs, amely megkövetelné a HTML­

értelmező programtól, hogy állítsa le a feldolgozást, és jelenítsen meg hiba­

üzenetet a végfelhasználónak

Miközben ez a visszafejtés folyt, a WHAT munkacsoport csendben más

dolgokon is ügyködött. Az egyik egy szabvány volt, amelynek kezdetben a Web Forms 2.0 nevet adták, és új fajta vezérlőkkel bővítette a HTML­

űrlapokat (a webes űrlapokról a 9. fejezetben bővebben is szó lesz), a másik

pedig egy szabványtervezet "Web Applications 1.0" címen, amely olyan jelen­tősebb új szolgáltatásokat tartalmazott, mint a közvetlenül festhető rajzvá­

szon (lásd a 4. fejezetet) vagy a videók és hangfájlok bővítmények nélküli,

beépített támogatása (lásd az 5. fejezetet).

Vissza a W3C-hez

A W3C és a WHAT Warking Group lényegében évekig levegőnek nézte

egymást. Miközben a WHAT munkacsoport a webes űrlapokra és az új

HTML-szolgáltatásokra összpontosított, a W3C HTML-munkacsoportja az XHTML 2.0-s változatán szorgoskodott. 2006 októberére azonban világossá

vált, hogy a WHAT munkacsoport jelentős előnyre tett szert, míg az X HTML

2 még mindig csak vázlatszinten létezett, és egyetlen komolyabb böngésző

sem valósította meg. 2006 októberében Tim Berners-Lee - személyesen

a W3C alapítója- bejelentette, hogy a W3C a jövőben a WHAT munkacso­

porttal közösen fog dolgozni a HTML rovábbfejlesztésén (http://dig.esail. mit. edu!breadcrumbs/node/166):

Bizonyos dolgok évekkel későbbről visszatekintve világosabbá válnak.

A HTML-t fokozarosan tovább kell fejleszteni. A kísérlet, hogy a világot

rá vegyük arra, hogy egyszerre álljon át az XML-re, zárja idézőjelek közé

a jellemzőértékeket, zárja le perjellel az üres címkéket, és használjon

névtereket, megbukott. A HTML-oldalakat készítő nagyközönség nem

mozdult, nagyrészt azért, mert a böngészők nem panaszkodtak. Egyes

nagyobb közösségek megvalósították ugyan az átállást, és élvezik

a jólformált rendszerek előnyeit, de nem mindenki. Fontos, hogy folya­

matosan továbbfejlesszük a HTML-t, miközben nem mondunk le

32 l Hogyan jutottunk el idáig? 1. fejezet

Page 30: HTML5 - Az új Szabvány

a jólformált világ felé vezető átmenetről sem, és egyre hatékonyabbá tesszük ezt a világot. Tervünk egy teljesen új HTML-csoport felállítása. Az előzőtől eltérően

ennek az lesz a feladata, hogy fokozatosan továbbfejlessze a HTML-t és vele

párhuzamosan az XHTML-t. A csoport vezetősége és tagjai kicserélődnek,

és együtt fognak munkálkodni a HTML-en és az XHTML-en. Az új

csoport erős támogatással bír, többek között a böngészőgyártók részéről.

Az űrlapok fejlesztésén is dolgozni kívánunk. Ez bonyolult terület, mivel

mind a meglevő HTML Forms, mind az XForms űrlapnyel v. A HTML­

űrlapokat mindenütt használják, de az X-űrlapoknak is számos megvalósí­

tása és felhasználója létezik. Ezenkivül a Webforms-csapat benyújtott tervei is ésszerű bővítéseket javasolnak a HTML-űrlapokhoz. A Webforms­csapat terve- elmondásuk szerint- a HTML-űrlapok bövítése.

A W3C újonnan felállított HTML-munkacsoportjának egyik legelső dön­tése az volt, hogy a "Web Applications l. O" nevet "HTML5"-re változtatták­és ezzel el is érkeztünk a HTML5-höz.

Utószó

2009 októberében a W3C leállította az XHTML 2 Working Group munká­

ját, és a döntés indoklásaként a következő nyilatkozatot bocsátotta ki (http:/1 www. w 3. org/2009/06/xhtml-faq. h tm/):

Amikor a W3C 2007 márciusában bejelentette a HTML- és XHTML

2-munkacsoporrok megalakítását, jelezte, hogy folyamatosan figyelni

fogja az XHTML 2 piacának alakulását. A W3C fontosnak tartja, hogy világossá tegye az álláspontját a közösségnek a HTML jövőjéről.

Miközben értékeljük az XHTML 2-munkacsoportnak az évek során

tett erőfeszítéseit, a résztvevőkkel folytatott megbeszélés után a W3C vezetősége úgy döntött, hogy a munkacsoport 2009 végén lejáró meg­

bízatását nem kívánja megújítani.

Mindig a kész kód nyer.

1. fejezet Hogyan jutottunk el idáig? l 33

Page 31: HTML5 - Az új Szabvány

További olvasmányok

• The History of the Web (http:llhixie.chlcommentarylweblhistory)- lan Hickson régi vázlata

• Michael Smith, Henri Sivonen és mások: HTML/History (http:llesw. w3.orgltopic!HTML/history)

• Scott Reynen: A Brief History of HTML (http://www.atendesigngroup. comlbloglbriefhistory-ofhtml}

Page 32: HTML5 - Az új Szabvány

2. fejezet

A HTML5-képességek észlelése

Ugorjunk fejest!

Joggal tehetjük fel a kérdést: "Hogyan kezdhetnék el átállni a HTML5 hasz­nálatára, ha a régebbi böngészők nem támogatják?". A kérdés azonban félre­vezető, ugyanis a HTML5 nem egyetlen nagy egység, hanem önálló szolgál­tatások gyűjteménye. A "HTML5-támogatás

" tehát nem deríthető fel, mert

ilyesmi nem létezik. Az egyes szolgáltatások- a rajzvászon, a vicleobeágyazás vagy a helymeghatározás - meglétét azonban igenis észlelhetjük.

Észlelési módszerek

Amikor a böngészőnk megjelenít egy weboldalt, egy dokumentumobjektum­

modellt (Document Object Model, DOM) épít fel, ami nem más, mint az olda­lon található HTML-elemeket ábrázoló objektumok gyűjteménye. Minden elemet- minden <p>-t, minden <d i v>-et és minden <span>-t- önálló objek­tumok képviselnek a DOM-ban. (Ugyanakkor léteznek globális objektumok is, mint a window vagy a document, amelyek nem kötődnek konkrét elemekhez.)

Minden DOM-objektum rendelkezik bizonyos közös tulajdonságokkal, de egyes objektumoknak több tulajdonsága van, mint másoknak. A HTML5 szolgáltatásait támogató böngészőkben egyes objektumok egyedi tulajdonsá­gokkal bírnak, így egy gyors pillantás a DOM-ra elárulja, hogy a böngésző milyen szolgáltatásokat támogat.

Négy egyszerű módszer létezik arra, hogy felderítsük, hogy egy adott bön­gésző rendelkezik-e egy bizonyos képességgel. Ezek a legegyszerűbbtől a leg­összetettebb felé haladva a következők:

l. Megvizsgáljuk, hogy egy globális objektum (például a window vagy a navigator) rendelkezik-e egy adott tulajdonsággal. A helymeghatározó

2. fejezet A HTML5-képességek észlelése l 35

Page 33: HTML5 - Az új Szabvány

API támogatásának vizsgálatára pár oldallal később, a fejezet "Helymeg­határozás" című részében láthatunk példát.

2. Létrehozunk egy elemet, majd megvizsgáljuk, hogy rendelkezik-e egy adott tulajdonsággaL A rajzvászon támogatásának vizsgálatát bemutató

példa úgy egy oldallal később szerepel. 3. Létrehozunk egy elemet, megvizsgáljuk, hogy rendelkezik-e egy adott

tagfüggvénnyel, majd meghívjuk ezt a tagfüggvényt, és megvizsgáljuk a függvénytől visszakapott értéket. A támogatott videoformátumok kide­rítésére a "Videoformátumok" című részben láthatunk példát.

4. Létrehozunk egy elemet, egy adott tulajdonságát egy bizonyos értékre ál­lítjuk, majd megvizsgáljuk, hogy a tulajdonság megtartotta-e az értékér. A támogatott <input>-úpusok kiderítésére a "Bevitelielem-típusok" című

rész mutat egy példát.

Modernizr: egy HTML5-észlelő könyvtár

A Modernizr (http://www.modernizr.com) egy nyílt forrású, MIT felhaszná­lási engedéllyel terjesztett JavaScript-könyvtár, amely számos HTML5- és CSS3-szolgáltatás támogatásának észlelésére képes. E könyv írásának idején a legújabb változata az 1.1-es számot viselte, de mindig a legfrissebb változatot célszerű használni. Ehhez az alábbi <script> elemet kell feltüntetnünk az oldal elején:

<! DOCTYPE html>

<html>

<head>

<me ta char set= •utf-8 ">

<title>Dive into HTMLS</title>

<script src="modernizr .min. js"X/script> </head>

<body>

</body>

</html>

AModernizr önműködően indul el, tehát nincs modernizr _init() függ­vény, amelyet meg kellene hívnunk. Amikor a könyvtár betöltődött, létrehoz egy Modernizr nevű globális obejktumot, amely minden általa észlelhető szolgáltatás számára tartalmaz egy-egy logikai tulajdonságot. Ha a böngé-

36 l A HTML5-képességek észlelése 2. fejezet

Page 34: HTML5 - Az új Szabvány

szőnk például ismeri a Canvas API-t (lásd a 4. fejezetben), a Modernizr.

canvas tulajdonság értéke true lesz. Ha viszont a böngésző nem támogatja ezt a programozási felületet, az említett tulajdonság a false értéket kapja:

if (Modernizr. canvas) { l l Rajzoljunk alakzatokat!

l else { l l nincs elérhető beépített rajzvászon-támogatás : ( l

A rajzvászon

A HTML5 a <canvas>, vagyis "

rajzvászon" elemet (http://bit.ly/9]Hz0j) így határozza meg:

"egy a felbontástól függő bitképes rajzvászon, amelyet grafiko­

nok, játékgrafikák, illetve más képi elemek futás közbeni megjelenítésére hasz­nálhatunk". A rajzvászon egy téglalap alakú terület az oldalon, amire JavaScript­kódok segítségével bármit rajzolhatunk. A HTML5 különféle függvényeket ("

Canvas API") határoz meg alakzatok rajzolásához, útvonalak meghatározásá­hoz, színátmenetek létrehozásához és transzformációk alkalmazásához.

A rajzvászon-API támogatásának felderítése a 2. észlelési módszerrel (lásd az

"Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngé­

szőnk támogatja a Canvas API-t, az általa létrehozott, a <canvas> elemet jelképező DOM-objektum rendelkezni fog egy getContext ( ) nevű tag­függvénnyel (lásd a 4. fejezet "Egyszerű alakzatok" című részét). Amennyiben a böngészőnk nem támogatja a rajzvászon-API-t, a <canvas> elem számára létrehozott DOM-objektum csak általános tulajdonságokkal fog bírni, ame­lyek között nem találunk olyanokat, amelyek kifejezetten a rajzvászonhoz kapcsolódnak. A rajzvászon támogatását ezzel a függvénnyel vizsgálhatjuk:

function supports _ canvas ( ) { return! !docurnent.createElernent('canvas') .getContext;

l

Ez a függvény először egy <canvas> nevű áldemet hoz létre:

return 1 1docurnent.createElement('canvas') .getContext;

Ez az elem soha nem kapcsolódik az oldalhoz, tehát soha senki nem fogja látni. Csupán ott lebeg a memóriában tétlenül és céltalanul, mint egy kenu a lustán hömpölygő folyón.

2. fejezet A HTML5-képességek észlelése l 37

Page 35: HTML5 - Az új Szabvány

Amint létrehozzuk a <canvas> álelemet, megvizsgáljuk, hogy létezik-e a getContext ( ) tagfüggvény. Ez a tagfüggvény csak akkor lesz jelen, ha a böngésző támogatja a Canvas API-t:

return 1 !document.createElement('canvas') .getContext;

Végül, a kettős tagadás trükkjének segítségével az eredményt logikai alakba (true vagy false) kényszerítjük:

return 1 !document.createElement('canvas') .getContext;

Ez a függvény a rajzvászon-API lehetőségeinek nagy részét képes észlelni, beleértve az alakzatrajzolás képességét (lásd az "Egyszerű alakzatok" című részt a 4. fejezetben), az útvonalakat ("Útvonalak", 4. fejezet), a színátmene­teket ("Színátmenetek", 4. fejezet) és a mintázatokat. A külső fejlesztéső explorercanvas könyvtárat ( lásd a "Mi a helyzet az Internet Explorerrel?"

dmű részt a 4. fejezetben), amely a Canvas API-t a Microsoft Internet Explo­rerben valósítja meg, nem tudja észlelni.

Ahelyett, hogy magunk írnánk meg a fenti függvényt, használhatjuk a Modernizr könyvtárat is (amelyet az előző részben mutattunk be) a rajz­vászon-API támogatásának észlelésére:

if (Modernizr.canvas) { l l Rajzoljunk alakzatokat!

} else { l l nincs elérhető beépített rajzvászon-támogatás : ( }

A rajzvászonra írt szövegek API -jának észlelésére külön vizsgálatot kell végez­nünk, amelyet az alábbiakban mutatok be.

Rajzvászonra írt szöveg

Még ha a böngészőnk támogatja is a rajzvászon-API-t, nem biztos, hogy a rajzvászonra Írt szövegek API-ját ( Canvas text API) is ismeri. A Canvas API idővel egyre bővült, és szövegíró függvényeket adtak hozzá, a rajzvászont támogató böngészők közül azonban némelyiket már az előtt piacra dobták, hogy a szöveg-API elkészült volna.

38 l A HTML5-képességek észlelése 2. fejezet

Page 36: HTML5 - Az új Szabvány

A Canvas text API felderítése szintén a 2. észlelési módszerrel (lásd az "Észlelési módszerek

" című részt a fejezet elején) történik. Ha a böngészőnk

támogatja a Canvas API-t, az általa létrehozott, a <canvas> elemet jelké­pező DOM-objektum rendelkezni fog a getContext ( ) tagfüggvénnyel (lásd a 4. fejezet "Egyszerű alakzatok" című részét). Amennyiben a böngé­szőnk nem támogatja a rajzvászon-API-t, a <canvas> elem számára létreho­zott DOM-objektum csak általános tulajdonságokkal fog bírni, amelyek között nem találunk olyanokat, amelyek kifejezetten a rajzvászonhoz kapcso­lódnak. A rajzvászonra írható szövegek támogatását ezzel a függvénnyel vizs­gálhatj uk:

function supports _ canvas _text () {

}

if (! supports _ canvas ()) { return false; }

var dummy_canvas = document. createElement (' canvas');

var context =dummy_ canvas. getContext ('2 d' ) ;

return typeof context. fillText == 'function';

A függvény először a rajzvászon támogatását vizsgálja az előző részben meg­ismert supports canvas ( ) függvény segítségéve!:

if (!supports_canvas()) { return false;}

Ha a böngésző nem támogatja a Canvas API-t, természetesen nem fogja tá­mogatni a Canvas text API-t sem!

Következő lépésként létrehozunk egy <canvas> álelemet, és lekérdezzük a rajzolókörnyezetét (context). Ez biztosan működik, mert a supports _

canvas ( ) függvény már kiderítette, hogy a getContext (l tagfüggvény minden rajzvászon-objektum esetében létezik:

var dummy_ canvas = document. createElement {' canvas');

var context = dUJIIIIY_ canvas. getContext (' 2d') ;

Végül, megvizsgáljuk, hogy a rajzolókörnyezet rendelkezik-e fillText ( )

nevű függvénnyeL Ha igen, akkor a Canvas text API elérhető:

return typeof con text. fillText = 'function' ;

Ezt a függvényt sem kell magunknak megírnunk, hanem használhatjuk he­lyette a Modernizr könyvtárat is (lásd a "Modernizr: egy HTML5-észlelő

2. fejezet A HTML5-képességek észlelése l 39

Page 37: HTML5 - Az új Szabvány

könyvtár" című részt a fejezet elején) a rajzvászonra írt szövegek API-támo­gatásának észlelésére:

if (Modernizr.canvastext) l l Írjunk szöveget! l else ( l l nincs elérhetőbeépített szövegtámogatás a rajzvászonhoz : (

l

Videó

A HTML5 egy új, <v ideo> nevű elemet határoz meg a weboldalakba ágyaz­ható videók részére. A videók beágyazása korábban nem volt lehetséges olyan külső fejlesztésű bővítmények (plug-in) nélkül, mint az Apple QuickTime vagy az Adobe Flash.

A <video> elemet úgy tervezték, hogy mindenféle észlelő parancskód nélkül használható legyen. Több vicleofájlt is megadhatunk, és a HTML5 videotámogatásával rendelkező böngészők aszerint választhatnak közülük, hogy mely vicleoformá tumokat ismerik.*

A HTML5-vicleót nem támogató böngészők teljesen figyelmen kívül hagyják a <video> elemet, de ezt az előnyünkre fordíthatjuk, és ilyenkor utasíthatjuk a böngészőt, hogy egy külső bővítmény segítségével játssza le a videót. Kroc Camen tervezett egy Vicleo for Everybody! nevű megoldást {http:!lcamendesign.com!code!video_for_everbody), amely a HTML5-videóra támaszkodik, amennyiben az rendelkezésre áll, a régebbi böngészőkben vi­szont képes helyette a QuickTime-ra vagy a Flash-re szorítkozni. Ez a megol­dás egyáltalán nem használ JavaScriptet, és lényegében minden böngészőben működik, beleértve a mobileszközök böngészőit is.

Ha többet szeretnénk annál, hogy a videó csak felbukkan az oldalon, és a böngésző lejátssza, JavaScript-kódot kell használnunk. A vicleotámogatás fel- ·

derítése a 2. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngészőnk támogatja a HTML5-videókat, az általa létrehozott, a <v ideo> elemet jelképező DOM-objektum rendelkezni

• A különböző videoformárumokkal kapcsolarban lásd: "A gentie inrroducrion ro vicleo encoding, part l: conrainer formars" (http:lldiveintomark.orglarchivesl20081121181give-part-1-container­

Jormats) és "par r 2: lossy vicleo codecs" {http:lldiveintomark.orglarchivesl2008112118lgive­part-2-lossy-video-codecs).

40 l A HTML5-képességek észlelése 2. fejezet

Page 38: HTML5 - Az új Szabvány

fog egy canPlayType ( ) nevű tagfüggvénnyeL Amennyiben a böngésző nem támogatja a HTML5-videót, a <video> elem számára létrehozott DOM-objektum csak az összes elemnél rendelkezésre álló általános tulajdon­ságokkal fog bírni. A vicleotámogatást ezzel a függvénnyel vizsgálhatjuk:

function supports _ victea () { return ! ! ctocurnent. createElement (' victeo' ) . canPlayType;

}

Ezt a függvényt sem kell magunknak megírnunk: a HTML5-videók támoga­tásának észlelésére is használhatjuk a Modernizr könyvtárat (lásd a "Mo­dernizr: egy HTML5-észlelő könyvtár" című részt a fejezet elején):

if (Modernizr.video) { l l Játsszunk le egy victeát!

} else { l l nincs elérhető beépített victeatámogatás : ( l l próbáljuk meg helyette esetleg a QuickTime-ot vagy a Flash-t

}

A böngészőben lejátszható videoformátumok észlelésére külön vizsgálatot kell végeznünk; ennek bemutatása következik most.

Videoformátu mok

A videoformátumok olyanok, mint az írott nyelvek. Egy angol nyelv ű újság tartalmazhatja ugyanazokat a híreket, mint egy spanyol, de ha csak ango­lul tudunk, csak az egyiknek vehetjük hasznát. Ahhoz, hogy le tudjon játszani egy videót, a böngészőnknek értenie kell a "nyelvet", amelyen a vi­deót "írták".

A videók nyelvét "kodeknek" hívják- ez az az algoritmus, amelyet a videó bitfolyammá alakítására használtak. A világon kodekek tucatjai léteznek -melyiket használjuk? A HTML5-videó sajnálatos valósága az, hogy a böngé­szők nem tudnak megegyezni egyeden kodekben, de szerencsére úgy tűnik, sikerült leszűkíteniük a kört kettőre. Az egyik kodekért fizetni kell (mert szabadalmaztatott), viszont működik aSafariban és az iPhone készülékeken (sőt az Adobe Flash-ben is, ha egy olyan megoldást alkalmazunk, mint a Vicleo for Everybody!). A másik kodek ingyenes, és az olyan nyílt forrású böngészők is ismerik, mint a Chrome vagy a Mozilla Firefox.

2. fejezet A HTML5-képességek észlelése l 41

Page 39: HTML5 - Az új Szabvány

A videoformátumok támogatásának felderítése a 3. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a bön­gészőnk támogatja a HTML5-videókat, az általa létrehozott, a <video>

elemet jelképező DOM-objektum rendelkezni fog a canPlayType () nevű tagfüggvénnyeL Ez a tagfüggvény árulja el, hogy a böngésző támogat-e egy adott videoformátumot.

Az említett függvény itt a Mac-ek és iPhone-ok által támogatott, szabada­lommal sújtott formátumot vizsgálja:

function supports _h 2 64_ baseline _v ideo () if ( ! supports _vide o{) ) { return false; ) var v= document. createElement ( "v ideo") ; return v. canPlayType ( 'video/mp4; codecs= "avcl. 42E01E, mp4a. 40.2 "');

)

A függvény először a HTML5-videók támogatását vizsgálja az előző részben bemutatott supports _vide o() függvény segítségéve!:

if (!supports_video()) { returnfalse;)

Ha a böngésző nem támogatja a HTMLS-videókat, természetesen nem fog támogatni egyetlen vicleoformátumot sem!

Következő lépésként a függvény létrehoz egy <video> nevű áldemet (de nem kapcsolja azt az oldalhoz, tehát nem lesz látható), és meghívja a canPlayType () tagfüggvényt. Ez a tagfüggvény biztosan létezik, mert a supports _vide o() függvény éppen az imént vizsgálta ezt:

var v= document.createElement ("v ideo"); return v. canPlayType ( 'video/mp4; codecs="avcl. 42E01E, mp4a.40. 2"');

A "videoformátumok" valójában különféle dolgok kombinációi. A böngésző­től konkrétan azt kell megkérdeznünk, hogy le tudja-e játszani a MPEG-4 tárolóha csomagolt H.264 Baseline kódolású video- és AAC LC kódolású hangsávo kat.*

A canPlayType () függvény nem true vagy false értéket ad vissza, hanem a vicleoformátum ok összetettségét szem előtt tartva egy karakterlánco t:

* Azr, hogy ez ponrosa n mir jelenr, az 5. fejezerben magyarázom el, de érdemes teher elolvasni az

"A genrle inrroducrion ro vicleo encoding" (http://diveintomark.orgltaglgive) cím ü írásr is.

42 l A HTML5-képességek észlelése 2. fejezet

Page 40: HTML5 - Az új Szabvány

"probably"

A böngésző meglehetősen biztos benne, hogy le tudja játszani az adott formátumot ( "valószínűleg" ).

"maybe"

A böngésző úgy véli, hogy talán le tudja játszani az adott formátumot

("talán").

" " (üres karakterlánc)

A böngésző biztos benne, hogy nem tudja lejátszani az adott formátumot. Az alábbi második függvény a Mozilla Firefox és más nyílt forrású bön­gészők által támogatott nyílt vicleoformátumot vizsgálja. Az eljárás pon­tosan ugyanaz, az egyeden különbséget a canPlayType ( ) függvénynek átadon karakterlánc jelenti. Itt technikailag azt kérdezzük a böngészőtől, hogy le tudja-e játszani az Ogg tároló ba csomagolt Theora kódolás ú video­és Yorbis kódolású hangsávokat.

function supports _ ogg_ theora _v ideo ()

if (! supports _v ideo () ) { return false; } var v = document. createElement ( "v ideo") ;

return v. canPlayType ( 'video/ogg; codecs="theora, vorbis'"};

}

Végül jöjjön a WebM (http://www.webmproject.org), az a nemrég nyílt forrá­súvá vált (és szabadalmakkal nem sújtott) videokodek, amelyet beépítenek majd az olyan fontosabb böngészők következő változatába, mint a Chrome, a Firefox és az Opera. A nyílt WebM-videók támogatását ugyanazzal a mód­

szerrel észlelhetjük:

function supports _ webm _v ideo (}

if ( ! supports _v ideo () ) { return false; } var v= document. createElement ("v ideo");

return v. canPlayType ('video/wel::m; codecs="vp8, vorbis"');

}

Ezt a függvényt sem kell magunknak megírnunk: a különböző HTML5-videoformátumok támogatásának észlelésére is használhatjuk a Modernizr könyvtárat (megjegyzendő, hogy a Modernizr még nem képes észlelni a nyílt WebM vicleoformátum támogatását):

2. fejezet A HTML5-képességek észlelése l 43

Page 41: HTML5 - Az új Szabvány

if (Modernizr. v ideo) (

l l Játsszunk le egy videó t! De milyet?

if (Modernizr.video.ogg) (

l l megpróbáljuk az Ogg tároléba csomagolt

l l Ogg Theora + Verbis formátumot

l else if (Modernizr.video.h264) ( l l megpróbáljuk az MP4 tároléba csomagolt

l l H. 264 videó+ MC hang formátumot

l l

Helyi tárolás

A HTML5-tároló (http:lldev. w 3. orglhtm/5/webstorage/) arra ad módot a web­helyeknek, hogy információkat tároljanak a felhasználó számítógépén, ame­lyeket később kinyerhetnek. A HTML5-tároló működési elve hasonló a sütiké­hez (cookie), de nagyobb mennyiségű információhoz tervezték. A sütik mérete korlátozott, és a böngésző minden alkalommal elküldi őket a webkiszolgáló­nak, amikor új oldalt kér (ami további időbe telik, és értékes sávszélességet emészt fel). A HTML5-tároló a felhasználó számítágépén marad, és a web­helyek JavaScript-kód segítségével érhetik el, miután az oldal betöltődött.

Kérdezzük meg Leírókód professzort!

Kérdés: A helyi tárolás valóban része a HTML5-nek? Miért kapott helyet külön szabványleírásban?

Válasz: Az első kérdésre a rövid válasz: igen, a helyi tárolás a HTML5 része. Kicsir bővebben kifejtve: a helyi tárolás régebben a HTML5 fő szabványleírásának része volt, de végül külön leírásban kapott helyet, men a HTMLS-munkacsoport egyes tagjai panaszkodtak, hogy a HTMLS túl nagy. Ha ez úgy hangzik, mimha a kalóriák számár csökkenrendő több szelerre vágnánk egy tortát ... , nos, nem tévedünk. Üdv a szabvá­nyok bizarr világában!

A HTML5-tároló támogatásának felderítése az l. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngészőnk

44 l A HTML5-képességek észlelése 2. fejezet

Page 42: HTML5 - Az új Szabvány

támogatja a helyi tárolást, a globális window objektum rendelkezni fog egy localStarage nevű tulajdonsággaL Amennyiben a böngésző nem támogatja a helyi tárolást, a localStarage tulajdonság undefined (nem meghatáro­zott) lesz. A HTML5-tároló támogatását ezzel a függvénnyel vizsgálhatjuk

function supports _local_ storage () { return (' localStorage' in window) && window [' localStorage' J ! =null;

}

Ezt a függvényt sem kell magunknak megírnunk: a HTML5-féle helyi táro­lás támogatásának észlelésére is használhatjuk a Modernizr könyvtárat (lásd a "Modernizr: egy HTML5-észlelő könyvtár

" című részt a fejezet elején):

if (Modernizr .localstorage) ( l l A window .localStorage elérhető! j else { l l nincs elérhető beépített támogatás a helyi tároláshoz : ( l l próbáljuk meg esetleg aGears-t vagy egy másik külső megoldást

j

Megjegyzendő, hogy a JavaScript megkülönbözteti a kis- és nagybetűket. AMo­dernizr jellemzőjét localstarage-nek hívják (csupa kisbetűvel), a DOM­tulajdonság neve azonban window.localStorage (nagy S-sel).

Kérdezzük meg Leírókód professzort!

Kérdés: Mennyire biztonságos a HTML5-tárolóadatbázisom? Bárki el­olvashatja? Válasz: Bárki, aki fizikailag hozzáfér a számítógépünkhöz, valószínűleg beletekinthet a HTML5-tárolóadatbázisba (sőt meg is változtathatja azt). A böngészőn belül minden webhely olvashatja és módosíthatja a saját értékeit, de a más webhelyek által tárolt értékekhez nem férhet hozzá. Ezt a korlátozást hívják az " azonos eredet elvének" (http://bit.lyi9YyPpj).

Webmunkások

A webmunkások (Web Worker API, http://bit.ly/9jheoj) szabványos módot adnak a böngészőknek arra, hogy JavaScript-kódokat futtassanak a háttérben.

2. fejezet A HTML5-képességek észlelése l 45

Page 43: HTML5 - Az új Szabvány

A webmunkások segítségével több "szálat" indíthatunk, amelyek többé-ke­vésbé mind egyszerre futnak. (Gondoljunk arra, hogyan futtat a számítógép párhuzamosan több alkalmazást, és nagyjából megértettük a lényeget.) Ezek a "háttérszálak" bonyolult matematikai számításokat végezhetnek, hálózati kérelmeket adhatnak ki, vagy műveleteket végezhetnek a helyi tárolón, mi­közben a fő weboldal arra reagál, ahogy a felhasználó görget, kattint vagy szöveget gépel be.

A webmunkások támogatásának felderítése az l. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngé­szőnk támogatja a Web Warker API-t, a globális window objektum rendel­kezni fog egy Warker nevű tulajdonsággaL Amennyiben a böngésző nem támogatja a webmunkások programozási felületét, a Warker tulajdonság undefined (nem meghatározott) lesz. A webmunkások támogatását ezzel a függvénnyel vizsgálhatjuk:

function supports _web_ workers ( ) { return ! 1 window. Worker;

Ezt a függvényt sem kell magunknak megírnunk: a webmunkások támoga­tásának észlelésére is használhatjuk a Modernizr könyvtárat (lásd a "Mo­dernizr: egy HTML5-észlelő könyvtár" című részt a fejezet elején):

if (Modernizr. webworkers) {

l l A window. Wo r ker elérhető! J else {

l l nincs elérhetőbeépített támogatás a webmunkások számára : ( l l próbáljuk meg esetleg aGears-t vagy egy másik külső megoldást

)

Megjegyzendő, hogy a JavaScript megkülönbözteti a kis- és nagybetűket. A Modernizr jellemzőjét webworkers-nek hívják (csupa kisbetűvel), a DOM­tulajdonság neve azonban window. Warker (a "Worker" szóban nagy W-vel).

Kapcsolat nélküli webalkalmazások

Statikus weboldalakat olvasni kapcsolat nélküli módban könnyű: csatlako­zunk az Internetre, letöltünk egy weboldalt, megszakítjuk az internetkap­csolatot, bezárkózunk egy szobába, és addig olvasgatjuk az oldalt, amíg csak

46 l A HTML5-képességek észlelése 2. fejezet

Page 44: HTML5 - Az új Szabvány

akarjuk. (Bezárkózni persze nem feltétlenül kell.) De mi a helyzet az olyan webalkalmazások kapcsolat nélküli használatával, mint a Gmail vagy a Google Docs? A HTML5-nek köszönhetően bárki (nem csak a Google!) készíthet kapcsolat nélkül is működő webalkalmazásokat.

A kapcsolat nélküli (ofHine) webalkalmazások természetesen kezdetben online webalkalmazáském működnek. Amikor először látogatunk el egy kap­csolat nélkül is működő webhely re, a webkiszolgáló elárulja a böngésző nknek, hogy mely fájlokra van szüksége ahhoz, hogy a webhely kapcsolat nélkül is működjön. Ezek a fájlok bármilyen típusú állományok lehetnek: HTML, JavaScript, képek, sőt akár videók is (lásd a "Videó" című részt a fejezet első felében). Ha a böngésző egyszer minden szükséges fájlt letöltött, az adott webhelyre akkor is ellátogathatunk, ha éppen nem kapcsolódunk az Inter­netre. A böngészőnk észre fogja venni, hogy kapcsolat nélkül dolgozunk, és a korábban letöltött fájlokat fogja betölteni. Amikor aztán ismét csatlakozunk a Világhálóhoz, minden végrehajtott változtatást feltölthetünk a távoli web­kiszolgálóra.

A kapcsolat nélküli munka támogatásának felderítése az l. észlelési mód­szerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngészőnk támogatja a kapcsolat nélküli webalkalmazásokat, a globális window objektum rendelkezni fog egy applicationCache nevű tulajdon­sággaL Amennyiben a böngésző nem támogatja a kapcsolat nélküli webalkal­mazásoka t, az applicationCache tulajdonság undefined (nem meg­határozott) lesz. A kapcsolat nélküli webalkalmazások támogatását ezzel a függvénnyel vizsgálhatjuk:

function supports_offline () { return! !window.applicationCache;

)

Ezt a függvényt sem kell magunknak megírnunk: a kapcsolat nélküli web­alkalmazások támogatásának észlelésére is használhatjuk a Modernizr könyv­tárat (lásd a "Modernizr: egy HTML5-észlelő könyvtár" című részt a fejezet elején):

if (Modernizr.applicationcache) { l l A window. applicationCache elérhető! ) else { l l nincs elérhető beépített támogatás a kapcsolat nélküli munkához : ( l l próbáljuk meg esetleg aGears-t vagy egy másik külső megoldást )

2. fejezet A HTML5-képességek észlelése l 47

Page 45: HTML5 - Az új Szabvány

Megjegyzendő, hogy a JavaScript megkülönbözteti a kis- és nagybetűket. A Modernizr jellemzőjét applicationcache-nek hívják (csupa kisbetűvel), a DOM-tulajdonság neve azonban window. applicationCache (nagy C-vel a "Cache" szó elején).

Helymeghatározás

A helymeghatározás (geolokáció) annak a művészete, hogy kiderítsük, hol tartózkodunk a Földön, és (ha kívánjuk) megoszthassuk ezt az információt azokkal, akikben megbízunk. A tartózkodási helyünket sokféleképpen ki le­het deríteni - az IP-címünkből; a drót nélküli hálózati kapcsolatunkból; ab­ból, hogy a mobiltelefonunk melyik adótoronnyal áll éppen kapcsolatban; vagy egy GPS-eszköz segítségéve!, amely a Föld körül keringő műholdaktól kapott információk alapján állapítja meg a szélességi és hosszúsági fokot.

Kérdezzük meg Leírókód professzort!

Kérdés: A helymeghatározás része a HTML5-nek? Miért beszélünk róla?

Válasz: A helymeghatározás támogatásának beépítése a böngészökbe éppen most zajlik, akárcsak más HTML5-képességeké. Szigorúan véve a helymeghatározást a HTML5-munkacsoporttól független Geolocation Working Group (http:!lwww.w3.org/2008/geolocation) szabványosítja. Én ennek ellenére szót ejtek a helymeghatározásról ebben a könyvben, merr része a Web jelenleg is zajló evolúciójának.

A helymeghatározás támogatásának felderítése az l. észlelési módszerrel (lásd az "Észlelési módszerek" cím ű részt a fejezet elején) történik. Ha a böngészőnk támogatja a Geolocation API-t, a globális navigator objektum rendelkezni fog egy geolocation nevű tulajdonsággaL Arnennyiben a böngésző nem támogatja a helymeghatározás programozási felületét, a geolocation tulaj­donság undefined (nem meghatározott) lesz. A helymeghatározás támoga­tását ezzel a függvénnyel vizsgálhatjuk

function supports _geolocation ( ) { return ! ! navigator .geolocation;

48 l A HTML5-képességek észlelése 2. fejezet

Page 46: HTML5 - Az új Szabvány

Ezt a függvényt sem kell magunknak megírnunk: a Geolocation API támo­gatásának észlelésére is használhatjuk a Modernizr könyvtárat (lásd a "Mo­dernizr: egy HTML5-észlelő könyvtár" című részt a fejezet elején):

if (Modernizr.geolocation) { l l Derítsük ki, hol vagyunk!

) else { l l nincs elérhető beépített támogatás a helymeghatározáshoz : (

l l próbáljuk meg esetleg aGears-t vagy egy másik külső megoldást

)

Akkor sincs minden veszve, ha a böngészőnk nem támogatja beépítve a hely­meghatározó API-t. A Gears (http:lltools.google.comlgearsl) egy nyílt forrású böngészőbővítmény a Google-tól, amely Windows, Mac, Linux, Windows Mobile és Android rendszeren is működik, és számos szolgáltatást kínál azoknak a régebbi böngészőknek, amelyek nem támogatnak minden csillogó­villogó újdonságot, amelyről ebben a fejezetben szót ejtettünk. AGears kíná­latának része egy helymeghatározó API is- igaz, nem a navigator.geo­

location API, de ugyanazt a célt szolgálja.

Léteznek konkrét eszközökre Írt helymeghatározó API-k is, az olyan mo­biltelefon-rendszerek számára, mint a BlackBerry, a Nokia, a Palm vagy az OMTP BONDI.

A 6. fejezetben kimerítő részletességgel fogjuk tárgyalni ezeknek a külön­

féle API-knak a használatár.

Bevitelielem-típusok

Ismerjük a webes űrlapokat, igaz? Létrehozunk egy <form> elemet, hozzá­

adunk néhány <input type= "text"> elemet, esetleg egy <input type=

"password"> mezőt, és egy <input type="submit"> gombbal tesszük teljessé a művünket.

Nos, ez szánalmasan kevés. A HTMLS a beviteli elemeknek több mint egy tucat új típusát határozza meg, amelyeket felhasználhatunk az űrlap­

jainkon:

<input type= "search''>

A keresőmezőket lásd: http:llbit.fyl9mQt5C.

2. fejezet A HTML5-képességek észlelése l 49

Page 47: HTML5 - Az új Szabvány

<input type= "number">

A léptetőmezőket lásd: http://bit.lylaPZHjD. <input type= "range">

A csúszkákat lásd: http://bit.fyldmLiRr. <input type= "color">

A színválasztókat lásd: http://bit.fylbwRcMO. <input type= "tel">

A telefonszámokat lásd: http://bit.fylamkWLq. <input type= "url">

A webcímeket lásd: http://bit. fylcjKb3a. <input type= "email">

Az e-mail címeket lásd: http://bit.fylaaDrgS. <input type= "date">

A dátumválasztó naptárakat lásd: http:!lbit.fylc8hL58. <input type= "month ">

A hónapválasztókat lásd: http://bit.fylcDgHRI <input type= "week">

A hétválasztókat lásd: http:llbit.fylbR3r58. <input type= "time">

Az időbélyegeket lásd: http:llbit.fy!bjMCMn. <input type= "da tetime ">

A precíz, abszolút dátum/időbélyegeket lásd: http://bit.fylc46zVW. <input type= "datetime-local ">

A helyi dátumokat és időpontokat lásd: http:llbit.fylaziNkE.

A HTML5 bevitelielem-típusainak felderítése a 4. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Először létreho­zunk egy <input> áldemet a memóriában:

var i= document. createElement ("input");

Minden <input> elemnek a "t ext" az alapértelmezett típusa. Ez létfontos­ságú, ezért jól jegyezzük meg.

A következő lépés, hogy az <input> áldern type jellemzőjét arra a be­vitelielem-típusra állítjuk, amelynek a létezését ki szeretnénk deríteni:

i. setAttribute ("type", "color'');

50 l A HTML5-képességek észlelése 2. fejezet

Page 48: HTML5 - Az új Szabvány

Ha a böngészőnk támogatja az adott bevitelielem-típust, a type tulajdonság megőrzi az általunk beállított értéket, ha azonban nem, a böngésző figyelmen kívül hagyja azt, és a type tulajdonság értéke továbbra is "text" lesz:

return i. type ! == "text";

Ahelyett, hogy magunk írnánk meg 13 különböző függvényt, a HTML5-ben meghatározott összes új bevitelielem-típus észlelésére használhatjuk a Mo­dernizr könyvtárat is (lásd a "Modernizr: egy HTML5-észlelő könyvtár"

című részt a fejezet elején). A Modernizr egyetlen <input> elemet hasznosít újra mind a 13 bevitelielem-típus támogatásának észlelésére, majd felépít egy Modernizr.inputtypes nevű hasítótáblát, amely 13 kulcsot tartalmaz (a HTML5 type jellemzőit), valamint 13logikai értéket (true, ha a beviteli elem támogatott, és false, ha nem):

if (!Modernizr.inputtypes.date) ( l l nincs elérhető beépített támogatás az <input type= "date ">-hez : (

l l esetleg írjuk meg magunk

llaDojo

l l vagy a j Query segítségével

)

Helyőrző szöveg

Az új típusú beviteli elemek mellett a HTML5 több apró újítást is tartalmaz a meglevő űrlapokhoz. Az egyik ilyen új szolgáltatás, hogy helyőrző szöveget tehetünk egy beviteli mezőbe. A helyőrző szöveg addig lesz látható a beviteli mezőben, amíg a mező üres, és nincs rajta a fókusz. Amint azonban a beviteli mezőre kattintunk (vagy a tabulátorbillentyűvel állítjuk rá a fókuszt), a hely­őrző szöveg eltűnik. Ha nehezen tudjuk magunk elé képzelni a dolgot, a 9.

fejezet elején, a "Helyőrző szöveg" című részben találunk hozzá képernyőfel­vételeket.

A helyőrző szövegek támogatásának felderítése a 2. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a bön­gészőnk támogatja a helyőrző szövegeket a beviteli mezőkben, az általa létre­hozott, az <input> elemet jelképező DOM-objektum rendelkezni fog egy placeholder (helyőrző) nevű tulajdonsággal (még akkor is, ha a HTML­kódban nem szerepeltetünkplaceholder jellemzőt). Amennyiben a böngésző

2. fejezet A HTML5-képességek észlelése l 51

Page 49: HTML5 - Az új Szabvány

nem támogatja a helyőrző szövegeket, az <input> elem számára létrehozott DOM-objektumnak nem lesz placeholder tulajdonsága. A helyőrzők tá­mogatását az alábbi módon vizsgálhatjuk

function supports _input _placeholder () { var i= document. createElement ('input'); return 'placeholder' in i;

)

Ezt a függvényt sem kell magunknak megírnunk: a helyőrző szövegek támo­gatásának észlelésére is használhatjuk a Modernizr könyvtárat (lásd a "Mo­dernizr: egy HTML5-észlelő könyvtár" című részt a fejezet elején):

if (Modernizr.input.placeholder) { l l A helyőrzö sz övegnek már láthatónak kell lennie! ) else { l l a helyőrzö szövegek nem támogatottak : ( l l parancskódot alkalmazó megoldásra kell szorí tkoznunk

)

Automatikus űrlapfókusz

Sok webhely JavaScript-kódot használ arra, hogy a fókuszt automatikusan a webes űrlapok első beviteli mezőjére állítsa. A Google.com nyitóoldala pél­dául automatikusan a keresőmezőre állítja a fókuszt, hogy a keresett kifeje­zést azonnal beírhassuk, anélkül, hogy előbb a mezőbe kellene kattintanunk Ez a legtöbb ember számára kényelmes, de a gyakorlott felhasználóknak vagy a különleges igényekkel bíró felhasználóknak idegesítő lehet: ha lenyomjuk a szóköz billentyűt, arra számítva, hogy ezzel görgetjük az oldalt, csalódni fo­gunk, mert a fókusz már egy űrlapmezőben található, ezért az oldal nem fog

lejjebb gördülni. (Helyette egy szóközt írunk a beviteli mezőbe.) Ha egy má­sik beviteli mezőre állítjuk a fókuszt, miközben az oldal még töltődik, a web­hely amofókusz-kezelő parancskódja "segít", és visszateszi a fókuszt az eredeti beviteli mezőbe, amint az oldal teljesen betöltődött, így megszakítja a mun­kánkat, és rossz helyre fogunk gépelni.

Mivel az automatikus fókuszállítás JavaScript-kód segítségével történik, nehéz lehet minden szélsőséges esetet kezelni, és nem sok lehetősége marad azoknak, akik nem akarják, hogy a weboldal "ellopja" a fókuszt.

A probléma megoldására a HTML5 egy autofocus nevű jellemzőt vezet be a webes űrlapok minden vezérlője számára. Az autofocus jellemző pon-

52 l A HTML5-képességek észlelése 2. fejezet

Page 50: HTML5 - Az új Szabvány

tosan azt teszi, amire a neve utal: a fókuszt egy adott beviteli mezőre állítja. Mivel azonban ez csak leírókód, és nem parancskód, a viselkedése minden webhelyen azonos. Ezen kívül a böngészőgyártók (illetve a bővítmények ké­szítői) módot adhatnak a felhasználóknak az automatikus fókuszálás kikap­csolására.

Az autofókusz támogatásának felderítése a 2. észlelési módszerrel (lásd az

"Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngészőnk támogatja a webes űrlapok vezérlőinek automatikus fókuszállítását, az általa létrehozott, az <input> elemet jelképező DOM-objektum rendelkezni fog egy autofocus nevű tulajdonsággal (még akkor is, ha a HTML-kódban nem szerepeltetünk autofocus jellemzőt). Amennyiben a böngésző nem támogatja a webes űrlapvezérlők autofókusz szolgáltatását, az <input> elem számára létrehozott DOM-objektumnak nem lesz autofocus tulajdonsága. Az automatikus fókuszállítás támogatását az alábbi függvénnyel vizsgál­hatjuk:

function supports input_autofocus () { var i = document. createElement ('input' ) ; return 'autofocus' in i;

Ezt a függvényt sem kell magunknak megírnunk: az űrlapmezők aurafókusz­támogatásának észlelésére is használhatjuk a Modernizr könyvtárat (lásd a

"Modernizr: egy HTML5-észlelő könyvtár" című részt a fejezet elején):

if (Moderni.zr. input. autofocus) { l l Az automatikus fókusz működik! ) else { l l nincs autofókusz-támogatás : ( l l parancskódot alkalmazó megoldásra kell szorítkoznunk

)

Mikroadatok

A mikroadatok (http://bit.lylckt9Rj) szabványos módot adnak arra, hogy to­vábbi, jelentéssei bíró elemekkel bővítsük a weboldalainkat. Mikroadatok segítségével például bejelenthetjük, hogy egy bizonyos fénykép egy adott Creative Commons felhasználási engedély hatálya alá tartozik. Ahogy a 10. feje­zetben látni fogjuk, mikroadatokat használva "Névjegy" oldalt is létrehozhatunk,

2. fejezet A HTML5-képességek észlelése l 53

Page 51: HTML5 - Az új Szabvány

a böngészők, böngészőbővítmények és keresőprogramok pedig a HTML5-ös mikroadatkódot egy vCard-dá alakíthatják, ami az elektronikus névjegykár­tyák szabványos formátuma. Ezenkívül saját mikroadat-szótárakat is megha­tározhatunk

A HTML5-mikroadatok szabványa HTML-kódot (elsősorban a kereső­matorok számára) és DOM-függvényeket (főként a böngészők számára) is tartalmaz. Mikroadatkódot nyugodtan beilleszthetünk a weboldalainkba, kárt nem okozunk vele - csupán néhány jól elhelyezett jellemzőről van szó, és azok a keresők, amelyek nem ismerik a mikroadat-jellemzőket, egyszerűen figyelmen kívül hagyják őket. Ha viszont a DOM-on keresztül kell elérnünk vagy módosítanunk mikroadarokat, ellenőriznünk kell, hogy a böngésző tá­mogatja-e a mikroadatok DOM API-ját.

A HTML5-mikroadatok API-támogatásának felderítése az l. észlelési módszerrel (lásd az "Észlelési módszerek" című részt a fejezet elején) történik. Ha a böngészőnk támogatja a HTML5 MicrodataAPI-t, a globális document

objektum rendelkezni fog egy get Items ( ) nev ű függvénnyeL Amennyiben a böngésző nem támogatja a mikroadatokat, agetitems () függvény nem meghatározott lesz. A támogatást az alábbi módon vizsgálhatjuk:

function supports _ microdata _api ( ) { return! !document.getitems; )

A Modernizr könyvtár egyelőre nem képes a Microdata API észlelésére, ezért mindenképpen egy a fentihez hasonló függvényt kell használnunk.

További olvasmányok

Szabványok és egyéb leírások: • A <canvas> elem (http:llbit.lyi9]Hz0j) • A <v ideo> elem (http://bit.ly/a3kpiq) • <input>-típusok (http://bit.ly/akweH4) • Az <input placeholder> jellemző (http:llbit.lylcaGLBN) • Az <input autofocus> jellemző (http:llbit.lyldbJFj4) • HTML5-tároló (http:lldev.w3.orglhtml5/webstoragel) • Webmunkások (http://bit.ly/9jheoj) • Kapcsolat nélküli webalkalmazások (http://bit.lyldBZgzX)

54 l A HTML5-képességek észlelése 2. fejezet

Page 52: HTML5 - Az új Szabvány

• A Geolocation helymeghatározó API (http:llwww.w3.org/TR!geolocation­APII)

J avaScript-könyvtárak:

• A Moclernizr HTML5-észlelő könyvtár (http://www.modernizr.com/) • A geo.js helymeghatározó API-burkoló (http:llcode.google.comlplgeo-location­

javascript)

Egyéb cikkek és oktatóanyagok

• Vicleo for Everybocly! (http:llcamendesign.comlcode/video_for_everybody) • "A gentie introcluction to vicleo encocling" (http:lldiveintomark.orgltagl

giv e) • "Vicleo type parameters" (http://wiki.whatwgorglwiki/Video_type_parameters) • Jelen kötet Függeléke

Page 53: HTML5 - Az új Szabvány

3. fejezet

Mit jelent mindez?

Ugorjunk fejest!

Ebben a fejezetben fogunk egy HTML-oldalt, amellyel az égvilágon semmi gond nincs, és javítunk rajta. Egyes részei rövidebbek, mások hosszabbak lesznek - de az egész sokkal olvashatóbbá fog válni. Lenyűgöző lesz!

A kérdéses oldal ezen a címen található: http:lldiveintohtml5.orglexamples/ blog-original.html. Olvassuk át tüzetesen. Éljük át. Szeressük. Nyissuk meg egy új böngészőlapon, és vissza se jöjjünk, amíg legalább egyszer ki nem ad­tuk a "Forrás megtekintése" parancsot.

A dokumentumtípus

Az oldal forrása így kezdődik:

<! DOCTYPE html

PUBLIC •- / /W3C/ /DTD XHTML l. O Strict/ /EN •

"http://www.w3.org/TR/xhtmll/DTD/xhtmll-strict.dtd">

Ezt hívják dokumentumtípusnak (doctype). A dokumentumtípusnak hosszú -fekete mágiától sem mentes-története van. Az Internet Explorer 5 for Mac fejlesztése közben a Microsoft meglepő problémával találta magát szemben. A böngésző készülő változata annyit fejlődött a szabványok támogatása terén, hogy a régebbi oldalakat többé nem tudta megfelelően megjeleníteni. Ponto­sabban, az oldalak (a szabványok szerint) helyesen jelentek meg, a felhaszná­lók viszont éppen hogy azt várták, hogy a böngésző helytelenül képezze le azokat. A weboldalakat ugyanis az akkori piacvezető böngészők-elsősorban a Netscape 4 és az Internet Explorer 4 - trükkjeihez igazodva Írták. Az lES/ Mac viszont annyira fejlett volt, hogy tulajdonképpen tönkretette a Webet.

3. fejezet Mitjelent mindez? l 57

Page 54: HTML5 - Az új Szabvány

A Microsoft újszerű megoldással állt elő. Az lES/Mac egy oldal leképezése előtt megvizsgálta a "dokumenrumtípust

", ami jellemzően a HTML-forrás

első sorában szerepel (még a <h tm l> elem előtt). A régebbi oldalak (amelyek a régi böngészők leképezési trükkjeire támaszkodtak) általában egyáltalán nem határozták meg a dokumentum típusát- ezeket az oldalakat az lES/Mac úgy jelenítette meg, minr a régebbi b öngészők. Ahhoz, hogy az új szabvány­támogatás "életbe lépjen

", a weboldalak szerzőinek kifejezetten meg kellett

adniuk a megfelelő dokumenrumtípust a <html> elem előtt. Az ötlet futótűzként terjedt, és hamarosan minden fonrosabb b öngésző

két leképezési móddal rendelkezett: a "trükköző móddal"

(quirks mode) és a "szabványkövető móddal

" (standards mode). A dolgok azonban természe­

tesen - hiszen a Webről van szó - hamarosan kicsúsztak az érintettek kezé­ből. Közvetlenül a Mozilla böngésző 1.1-es változatának megjelenése előtt a Mozilla fejlesztői észrevették, hogy a böngésző olyan oldalakat is szabvány­követő módban jelenít meg, amelyek valójában egy bizonyos trükkre támaszkod­nak. A Mozilla leképezőmotorját nem sokkal korábban javították ki, hogy kiküszöböljék ezt a trükköt, és oldalak ezrei váltak egyszerre működésképte­lenné. Így született meg- és ez nem vicc- a "majdnem szabványkövető mód

"

(almost standards mode). "Activating Browser Modes with Doctype

" (http:llhsivonen.iki.fi/doctypel)

című korszakalkotó művében Henri Sivonen így foglalja össze a különböző leképezési módokat:

Trükköző mód

A trükköző módban a böngészők megsértik a mai webformátum-szab­ványok elöírásait, hogy elkerüljék azoknak az oldalaknak a működés­képtelenné válását, amelyeket az 1990-es évek végén uralkodó gyakor­latot követve írtak.

Szabványkövető mód

A szabványkövető módban a böngészők a jólformált dokumentumokat igyekeznek a szabványokban leírtaknak megfelelően megjeleníteni, ameny­nyire ezt az adott böngésző megvalósítása megengedi. A HTMLS ezt a módot "nem trükköző módnak

" (no quirks mode) hívja.

Majdnem szabványkövető mód

A Firefox, a Safari, a Chrome, a (7.5-ös vagy újabb) Opera és az lES ren­delkezik az úgynevezett "majdnem szabványkövető móddal" is, amely

58 l Mitjelent mindez? 3. fejezet

Page 55: HTML5 - Az új Szabvány

a táblázatcellák függőleges méretezését nem szigorúan a CSS2-szabvány

szerint, hanem hagyományos módon valósítja meg. A HTML5 ezt

a módot "korlátozott trükköző módnak"

(limited quirks mode) hívja.

,, ,, Henri cikkének a többi részét is érdemes elolvasni, mert én itt

jelentősen leegyszerűsítettem. Például egyes régebbi dokumentumtípusok

még az IE5/MAC-ben sem kapcsolták be a szabványok támogatását. Ezen­

kívül a trükkök száma idővel nőtt, akárcsak azoké a dokumentumtípu­

soké, amelyek trükköző módra kényszerítették a böngészőket. Amikor

legutóbb megpróbáltam megszámolni, 5 dokumentumtípust találtam,

amely "majdnem szabványkövető" módot váltott ki, és 73-at, amely trük­

közőt. Biztosan kihagytam persze néhányat, és akkor még nem is beszél­

tem arról, hogy mit csinál az Internet Explorer 8, hogy váltani tudjon

a négy- igen, négy! - különböző leképezési módja között. Van róla egy

folyamatábra a http:llhsivonen.iki.fi!doctypelie8-mode.png címen. Pusztít­

suk el. Vessük máglyára.

Hol is tartottunk? Ja, persze, a dokumentumtípusnál:

<' DOCTYPE html

PUBLIC "-/ /W3C/ /DTD XHTML l. 0 Strict/ /EN"

"http: l /www. w 3 .org/TR/xhtmll/DTD/xhtmll-strict.dtd ">

Ez történetesen egyike annak a 15 dokumenrumtípusnak, amely szabványkö­

vető módot vált ki minden modern böngészőben. Nincs vele semmi gond.

Ha tetszik, tartsuk meg. Vagy változtassuk a HTML5 dokumentumtÍpusra,

ami rövidebb és barátságosabb, és szintén szabványkövető módban kezeli

minden mai böngésző.

A HTML5 dokumentumtípus így fest:

<! DOCTYPE html>

Ennyi az egész. Mindössze 15 karakter. Annyira egyszerű, hogy saját kezűleg

is begépelhetjük, és nem fogjuk elrontani.

3. fejezet Mitjelent mindez? l 59

Page 56: HTML5 - Az új Szabvány

Leírókód professzor azt mondja

A dokumentumtípusnak a HTML-fájl legelső sorában kell szerepelnie.

Ha bármi más van előtte -akár egyetlen üres sor -, egyes böngészők úgy fogják kezelni az oldalt, mintha egyáltalán nem határozta volna

meg a dokumentumtípust. Dokumentumtípus nélkül pedig a böngésző

trükköző módban jeleníti meg az oldalt. Ezt a hibát nagyon nehéz ész­revenni, mert a fölös térközök általában nem számítanak a HTML-ben, így a szemünk hajlamos átsiklani felette - ebben az esetben viszont

nagyon fontos!

A gyökérelem

A HTML-oldalak egymásba ágyazott elemek sorából állnak, tehát egy oldal szerkezete olyan, mint egy fa. Egyes elemek "testvérek", mint két ág, amely

ugyanannak a fának a törzséből ered. Olyan elemek is vannak, amelyek más

elemek "gyermekei", mint amikor egy vékonyabb ág hajt ki egy vastagabbóL

(Ez a másik irányban is érvényes: azokat az elemeket, amelyek más elemeket tartalmaznak, a közvetlen gyermekelemeik "szülőcsomópontjának", illetve az

"unokáik" "őseinek" hívjuk.) A gyermektelen elemek a "levélcsomópontok".

A legkülső elem, amely az oldalon található összes többi elem őse, a "gyökér­

elem". A HTML-oldalak gyökéreleme mindig a <html>.

A mintaoldalunkon (http:l!diveintohtm/5. orglexampleslblog-original. h tm/) a gyökérelem így fest:

<html xmlns= "http: l /www. w 3 .org/1999/xhtml •

lang="en •

xml:lang=•en">

Ezzel a kóddal nincs semmi gond. Megint csak azt mondhatom, ha tetszik, tartsuk meg, hiszen érvényes HTML5-kód. Egyes részei ugyanakkor már nem

szükségesek a HTML5-ben-ha ezeket eltávolítjuk, nyerhetünk néhány báj tot.

Az első dolog, amiről szót kell ejtenünk, az xmlns jellemző. Ez még az XHTML l. O öröksége. Azt mondja a böngészőnek, hogy az oldalon ralálható

elemek az XHTML névtér (http://www.w3.org/1999/xhtml) részei. A HTML5-ben azonban az elemek mindig ebben a névtérben találhatók,

60 l Mitjelent mindez? 3. fejezet

Page 57: HTML5 - Az új Szabvány

ezért ezt nem kell kifejezetten bejelentenünk. A HTML5-oldalaink pontosan ugyanúgy fognak működni minden modern böngészőben, akár jelen van ez a jellemző, akár nincs.

Ha az xmlns jellemzőt elhagyjuk, ezt a gyökérelemet kapjuk:

<html lang= "en" xml: lang= "en">

Mindkét jellemző- a lang és az xml: lang- amelyet itt látunk, a HTML­oldal nyelvét határozza meg. (Az en az "English

", vagyis "angol

" rövidítése.*)

Miért kell két jellemző ugyanarra a célra? Ez megint csak az XHTML öröksége, a HTML5-ben viszont csak a lang jellemzőnek van hatása. Az xml: lang

jellemzőt is megtarthatjuk, ha akarjuk, de ha így teszünk, ügyelnünk kell rá, hogy ugyanaz legyen az értéke, mint a lang jellemzőnek

Az XHTML-re, illetve onnan való átállás megkönnyítése érdekében a szer­zök megadhatnak egy névtér és előtag nélküli jellemzőt az "xml:lang" környezeti névvel a HTML-dokumentumok HTML-elemeire, de ilyen jellemzőt csak akkor szabad megadni, ha egy névtér nélküli lang jel­lemző szintén szerepel, és mindkét jellemzőnek ugyanaz az értéke, ha a kis- és nagybetűket nem megkülönböztetve, ASCII-karakterekként hasonlítjuk össze őket. A névtér és előtag nélküli, az "xml:lang" környe­zeti névvel szereplő jellemzőnek nincs hatása a nyelvi feldolgozásra.

Készen állunk hát, hogy ejtsük a második jellemzőt? Semmi baj, csak enged­jük el. Egyik kéz, másik kéz ... mehet! Így ez a gyökérelem marad:

<html lang= "en">

Erről nincs is több mondanivalóm.

A <head> elem

A gyökérelem első gyermeke általában a <head> elem. A <head> elem metaadatokat tartalmaz - információkat az oldalról, nem pedig az oldal

• Nem angolul írunk? Keressük meg az álralunk használc nyelv kódjár a http:llwww.w3.org/ lnternationallquestionslqa-choosing-langrtage-tags címen.

3. fejezet Mitjelent mindez? J 61

Page 58: HTML5 - Az új Szabvány

szövegtörzséről. (Az oldal törzse- nem meglepő módon- a <body> elemben található.) Maga a <head> elem elég unalmas, és a HTML5-ben sem esett át semmilyen érdekes változáson. Ami izgalmas, azt a <head> elemen belül

találjuk Ehhez ismét a mintaoldalunkhoz fordulunk:

<head>

<me ta http-equi v� "Content-Type" content� "text/html; charset�utf-8" />

<ti tle>My Weblog</ ti tle>

<link rel� "stylesheet" type� "text/ess" href� "style-original. ess" />

<link rel� "al terna te" type� "application/atom+xml"

ti tle� "My Weblog feed"

href�"/feed/" />

<link rel� "search" type� "application/opensearchdescription+xml"

ti tle� "My Weblog search"

href�"opensearch.xml" />

<link rel� "shortcut icon" href� "l favicon. i co" />

</head>

Először is lássuk a <meta> elemet!

Karakterkódolás

Amikor azt látjuk, hogy "szöveg", valószínűleg azokra a "karakterekre és je­

lekre" gondolunk, amelyeket "a számítógép képernyőjén látunk". A számítógé­

pek azonban nem foglalkoznak karakterekkel és jelekkel, csak bitekkel és báj­tokkal. Minden szöveg, amir a számítógép képernyőjén látunk, valójában egy

adott karakterkódolással tárolódik. Sokféle különböző karakterkódolás létezik: vannak, amelyeket bizonyos nyelvekhez igazítottak, például az oroszhoz, a kí­naihoz vagy az angolhoz, míg másokat többféle nyelvhez is használhatunk.

Nagy vonalakban: a karakterkódolás bizrosírja a megfelelterést a képernyőn

látott szöveg és a számítógép memóriájában, illetve lemezén tárolt dolog között. A valóságban ez persze bonyolultabb. Sok karaktert több kódtáblában is

megralálunk, de az egyes kódolások más-más bájtsorozatot használharnak ahhoz, hogy ezeker a karaktereket a memóriában vagy a lemezen tárolják. A karakterkódolásra tehát a szöveg egyfajta visszafejtő kulcsaként gondolha­

runk. Amikor valaki egy bájtsorozatot ad át nekünk, és azt állírja róla, hogy

"szöveg", tudnunk kell, hogy milyen karakterkódolást használt, hogy a báj­

rokat visszafordírhassuk karakterekre, és megjeleníthessük (vagy feldolgoz­hassuk stb.) azokat.

62 l Mitjelent mindez? 3. fejezet

Page 59: HTML5 - Az új Szabvány

Hogyan állapítja meg a böngésző egy webkiszolgálótól kapott bájtfolyam karakterkódolását? Örülök a kérdésnek. Ha ismerjük a HTTP-fejléceket, ta­lán már láttunk ilyen fejlécet:

Content-Type: text/html; char set; "utf-8"

Ez röviden annyit tesz, hogy a webkiszolgáló úgy véli, hogy egy HTML­dokumentumot küld nekünk, és hogy a dokumentum az UTF-8 karakterkó­dolást használja. Sajnos a Világháló szövevényében nagyon kevés weboldal szerzője tartja ténylegesen az irányítása alatt a HTTP-kiszolgálót. Gondol­junk például a Bloggerre (http://www.blogger.com}: a tartalmat önálló szerzők szolgáltatják, de a kiszolgálókat a Google üzemelteti. A HTML 4 ezért mó­dot adott rá, hogy magában a HTML-dokumentumban megadhassuk a ka­rakterkódolást. Valószínűleg ilyesmit is láttunk már:

<meta http-equiv; "Content-Type" content; "text/html; charset;utf-8 ">

Ez röviden azt jelenti, hogy a a weboldal szerzője úgy véli, hogy egy HTML­dokumentumot készített, és ehhez az UTF-8 karakterkódolást használta.

Mindkét említett módszer működik a HTML5-ben is, a HTTP-fejlécben megadott karakterkódolás viszont előnyt élvez, és - ha szerepel az oldalon -felülbírálja a <meta> elemet. HTTP-fejlécet azonban nem mindenki állíthat be, ezért a <meta> címke még mindig létezik- sőt, a HTML5-ben valójá­ban kicsit egyszerűsödött is. Most így néz ki:

<me ta char set; "utf-8" />

Ez minden böngészőben működik. De hogyan született meg ez a rövid forma? Íme a legjobb magyarázat, amit találtam (http:lllists.w3.org/Archives/Publicl public-html/2007]ul/0550.html}:

A <me ta char set=""> jellemzőkombináció mellett az az érv szól, hogy a felhasználói prograrnak (a böngészők) már megvalósították, mert a felhasznáJók hajlamosak lehagyni az idézőjeleket. Például:

<META HTTP-EQUIV;Content-Type CONTENT;text/html; charset;IS0-8859-1>

Ha nem hisszük el, hogy a böngészők már alkalmazzák ezt a megoldást, ta­lálunk néhány <meta charset>-tesztesetet is (http://simon.html5.orgltestl htmllparsinglencoding).

3. fejezet Mitjelent mindez? l 63

Page 60: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: Én soha nem használok furcsa karaktereket. Akkor is be kell jelen­tenem az általam használt karakterkódolást? Válasz: Igen! Mindig, minden HTML-oldalunkon célszerű megadni egy karakterkódolást, mert ennek elmulasztása biztonsági rést üthet az oldalon (http://code.google. comlpldoctypelwiki!ArticleUtj7).

Összefoglalva: a karakterkódolás bonyolult, és a helyzeten nem könnyített az a sok-sok rosszul megírt szoftver sem, amit az évtizedek során a "másolás és beillesztés

" módszerrel dolgozó fejlesztök használtak. Mindig, minden HTML­

dokumentumban adjuk meg a karakterkódolást, különben pórul járunk. Mind­egy, hogy a Content-Type HTTP-fejléc, a <meta http-equiv> vagy a rövidebb <meta char set> címke segítségéve!, de mindenképpen tegyük meg. A Web előre is köszöni.

Viszonyleíró elemek

A szokványos hivatkozások (<a href>) egyszerűen egy másik oldalra mu­tatnak. A viszonyleíró elemek magyarázzák meg, hogy miért mutatunk egy másik oldalra. Lényegében befejezik a mondatot: "Azért mutatok erre a má­sik oldalra, mert ... "

• ... az egy stíluslap, amely azokat a CSS-szabályokat tartalmazza, amelye­ket a böngészőnek erre az oldalra alkalmaznia kell.

• ... az egy hírfolyam, amely ugyanazt tartalmazza, mint ez az oldal, de szabványos előfizethető formátumban.

• ... az ennek az oldalnak egy másik nyelvre fordított változata. • ... az ugyanazt tartalmazza, mint ez az oldal, de PDF formátumban. • ... az a következő fejezete egy elektronikus könyvnek, amelynek ez is egy

oldala.

És így tovább. A HTML5 a viszonyleíró elemeket két csoportba sorolja (http:/1 bit.ly!d2cbiR):

64 l Mitjelent mindez? 3. fejezet

Page 61: HTML5 - Az új Szabvány

A viszonyleíró elemekkel kétféle hivatkozás hozható létre. A külső erő­

forrásra mutató hivatkozások olyan erőforrásokra mutatnak, amelyek az adott dokukentumot egészítik ki, míg ahiperhivatkozások más do­kumentumokra mutató kapcsok. [ ... ] A külső erőforrásra mutató hivatkozások pontos viselkedése a konkrét kapcsolattól függ, amelyet az adott hivatkozástípusra meghatároztak.

Az iménti példák közül csak az első (rel= "stylesheet ") külső erőforrásra mutató hivatkozás, a többi más dokumentumokhoz kapcsolódó hiperhivat­kozás. Ez utóbbi hivatkozásokat tetszés szerint követhetjük, vagy nem követ­hetjük, de az aktuális oldal megtekintéséhez nincs szükség rájuk.

A viszonyokat a leggyakrabban az oldal <he ad> részében szereplő <link>

elemek adják meg. Egyes viszonyok az <a> elemekben is megadhatók, de ez még a megengedett esetekben is ritka. A HTML5 az <area> elemekben is megenged bizonyos viszonyleíró elemeket- amit még ritkábban szoktak kihasz­nálni. (A HTML 4 nem engedélyezte a rel jellemzőket az <area> elemek­ben.) A viszonyleíró elemek teljes táblázata megtekinthető a http://bit.ly/a3nsqi címen. Itt ellenőrizhetjük, hogy hol használhatjuk az egyes rel-értékeket.

Kérdezzük meg Leírókód professzort!

Kérdés: Egyéni viszonyleíró elemeket is létre lehet hozni? Válasz: Új viszonyleíró elemekre - úgy tűnik - vég nélkül születnek ötletek. Megakadályozandó, hogy a felhasználók a saját fejük után men­jenek, a WHAT munkacsoport jegyzéket tart fenn az elfogadásra be­nyújtott új rel-értékekről (http://wiki.whatwg.orglwiki/RelExtensions), és meghatározta az engedélyezési eljárás pontos menetét.

rel= stylesheet

Nézzük meg az első viszonyleíró elemet a mintaoldalunkon:

<link rel; "stylesheet" href; "style-original. ess" type; "text/ess" />

Ez a leggyakrabban használt viszonyleíró elem a világon (szó szerint). A <link rel= "stylesheet ">önálló fájlban tárolt CSS-szabályokra mutat. A HTML5-ben ezen egy olyan apró finomírást végezhetünk, hogy elhagyjuk

3. fejezet Mitjelent mindez? l 65

Page 62: HTML5 - Az új Szabvány

a type jellemzőt. A Weben csak egy stíluslapnyelv létezik, a CSS, ezért

a type jellemzőnek ez az alapértelmezett értéke:

<link rel= "stylesheet" href= "style-original. ess" l>

Ez minden böngészőben működik. (Egy nap persze valaki feltalálhat egy új stíluslapnyelvet, de ha ez bekövetkezik, csak annyit kell majd tennünk, hogy visszatesszük a type jellemzőt.)

rel= alternate

Folytassuk a mintaoldalunkat:

<link rel= "al terna te"

type="application/atorn+xrnl"

ti tle= "My Weblog feed"

href= "l feed/ " l>

Ez a viszonyleíró elem ugyancsak meglehetősen gyakori. A <link rel=

"alternate ">a type jellemzőben az RSS vagy Atom médiatípussal kom­binálva az úgynevezett "automatikus hírfolyam-felderítést" teszi lehetövé, va­

gyis a segítségével az olyan hírfolyamolvasók, mint a Google Reader, észlel­

hetik, ha egy webhely hírfolyamot nyújt a legfrissebb cikkeibőL A legtöbb

böngésző azzal is támogatja az automatikus hírfolyam-felderítést, hogy egy különleges ikont jelenít meg az URL mellett. (A rel= "stylesheet" típus­

tól eltérően itt számít a type jellemző, ezért ne hagyjuk el!) A rel="alternate" viszonyleíró elemet mindig furcsa módon keverve

használták, még a HTML 4-ben is. A HTML5-ben egyértelműbbé tették és kibővítették a meghatározását, hogy pontosabban írja le a meglevő webes tartalmakat. Ahogy az imént említettem, a rel="alternate" és a type=

application/atom+xml használata azt jelzi, hogy az adott oldahoz Atom­hírfolyam tartozik. A rel="alternate" viszonyleíró elemet azonban más type jellemzőkkel is párosíthatjuk, hogy jelezzük: a tartalom más formá­tumban, például PDF-ként is elérhető.

A HTML5 annak a régi vitának is véget vet, hogy pontosan hogyan kell

hivatkozni a dokumentumok más nyelvre lefordított változataira. A HTML 4 azt mondja, hogy a lang jellemzőt kell használni a rel="alternate"

viszonyleíró elemmel párban, hogy megadjuk a hivatkozott dokumentum

nyelvét, de ez tévedés. A HTML 4 hibajegyzéke négy egyértelmű hibát sorol fel a HTML 4 szabványleírásából (számos "nyomdahiba" mellett), és ezek

66 l Mitjelent mindez? 3. fejezet

Page 63: HTML5 - Az új Szabvány

egyike éppen az, hogy miként kell egy a rel= "alte rnate" elemmel hivat­

kozott dokumentum nyelvét meghatározni. (A helyes megoldás - ahogy

a HTML 4 hibajegyzékében és most már a HTML5-ben is áll- a h reflang

jellemző használata.) Sajnos ezeket a hibajavításokat soha nem építették be

a HTML 4 szabványba - mivel a W3C HTML-munkacsoportjából már

senki nem dolgozott többé a HTML-en.

Egyéb viszonyleíró elemek a HTML5-ben

rel = "archives"

(http://bit.lylclzlyG) "Azt jelzi, hogy a hivatkozott dokumentum jegyze­

tek, dokumentumok vagy más történeti érdekességű anyagok gyűjtemé­

nyét írja le. Egywebnapló (blog) nyitóoldala például a rel= "archives"

segítségével hivatkozhat a korábbi naplóbejegyzések tárgymutatójára."

rel = "author"

Ez az elem az oldal szerzőjére vonatkozó információkra mutar. Az infor­

máció lehet például egy ma i l to: cím, bár nem muszáj annak lennie

- a hivatkozás mutathat egyszerűen egy kapcsolati űrlapra vagy egy a

szerzőt bemutató oldalra ("about the author") is.

rel = "external"

(http://bit.ly/dBV009) "Azt jelzi, hogy a hivatkozás egy olyan dokumen­

tumhoz vezet, amely nem része annak a webhely nek, amelyen az aktuális

dokumentum található." Azt hiszem, ezt a viszonyleíró elemet a Word­

Press tette először népszerűvé, ahol a hozzászólók által beszúrt hivatko­

zásokra alkalmazzák

rel = "start", rel= "p rev " és rel= "next "

(http:llwww.w3.org/TR!html40Jitypes.html#type-links) Ezekkel olyan ol­

dalak között határozunk meg kapcsolatokat, amelyek egy sorozat részét

(például egy könyv fejezeteit vagy akár egy webnapló bejegyzéseit) képezik.

Az egyetlen, amelyet valaha is helyesen használtak, a rel= "next";

rel= "p rev" helyett viszont már rel= "previ ous "-t szaktak írni,

rel= "start" helyett a helytelen rel= "begi n" vagy rel= "first"

alakot használják, rel= "last" helyett pedig a rel= "end "-et. Ja, és

a saját ujjukból szopott rel= " up" hivatkozással mutatnak a "szülő­

oldalakra".

3. fejezet Mit jelent mindez? J 67

Page 64: HTML5 - Az új Szabvány

A HTML5 ugyanakkor tartalmazza a rel="first" alakot, amelyet a leggyakrabban használtak arra, hogy azt mondják, hogy "egy sorozat első oldala

" (a visszamenőleges megfelelőség kedvéért a rel= "start"

is megmaradt), a HTML 4-hez hasonlóan a re l= "p rev" és re l=

"next" viszonyleíró elemeket (ezenkívül a visszamenőleges megfelelő­ség kedvéért támogatja a rel= "previo us "-t), valamint a sorozat utolsó tagjára mutató rel= "las t "-ot (a re l= "first" párját) és a rel="up" viszonyt is.

A re l= "u p" leginkább a "morzsaútvonalra"

( breadcrumb navi­gation) hasonlít, amelyen valószínűleg a nyitóoldalunk az első oldal, az aktuális oldal pedig az útvonal utolsó eleme. A rel= "up" a morzsa­útvonal utolsó előtti elemeként szereplő oldalra mutat.

rel= "icon"

(http://bit.ly/diA]UP) Ez a második legnépszerűbb viszonyleíró elem (http:/1

code.google. com/webstats/2005-12/linkrels. h tm l) a r e l=" st y le sh e et"

után. Általában a shortcut-tal együtt szerepel, valahogy így:

<link rel= "shortcut icon" href= "/favicon. i co">

Minden jelentősebb böngésző támogatja, hogy így társírsunk egy apró ikont az oldalhoz, ami általában a böngésző címsávjában az URL mellett jelenik meg, vagy az oldalhoz tartozó böngészőfülön, vagy mindkét helyen.

Szintén újdonság a HTML5-ben, hogy a sizes jellemzőt az icon

elemmel együtt használva a hivatkozott ikon méretét is jelezhetjük (http://bit.ly/diA]UP).

rel= "license"

(http:llbit.lyl9n9Xjv) Ezt a viszonyleíró elemet a mikroformátumok kö­zössége találta ki. Azt jelzi, hogy "a hivatkozott dokumentum adja meg, hogy milyen szerzői és felhasználási feltételek hatálya alá tartozik az aktuális dokumentum.

"

rel = "nofollow"

(http://bit.lylcGjSPi) "Azt jelzi, hogy az eredeti szerző vagy az oldal üze­meltetője nem vállal felelősséget a hivatkozott dokumentumért, vagy hogy a hivatkozás elsősorban azért került a dokumentumba, mert a két oldalhoz társítható személyek üzleti kapcsolatban állnak egymással.

"

Ezt az elemet a Google találta ki, és a mikroformátumok közössége szab­ványosította. Az elgondolás az volt, hogy ha a "nofollow

" ( "nem köve-

68 l Mitjelent mindez? 3. fejezet

Page 65: HTML5 - Az új Szabvány

tendő") hivatkozások nem számítanak a keresők oldalrangsorában (Page­

Rank), akkor a levélszemetelők feladják, hogy kéretlen leveleket küldöz­

gessenek a blogokra. Ez hiú ábrándnak bizonyult, de a rel= "nofollow"

megmaradt, és sok népszerű webnaplórendszer alapértelmezés szerím

a rel= "nofollow" viszonyt rendeli a hozzászólók által beszúrt hivat­

kozásokhoz.

rel = "noreferrer"

(http:llbit.lylcQMS]g) "Azt jelzi, hogy a hivatkozás követésekor nem sza­

bad információt kiszivárogtatni a hivatkozóról (referrer)". Ezt jelenleg

egyetlen forgalomban levő böngésző sem támogatja, de nemrég bekerült

a WebKit-be, így végül meg fog jelenni a Safariban, a Google Chrame­

ban és más WebKit alapú böngészőkben. A rel= "noreferrer "-hez

a http:llwearehugh. comlpublic/2009104/rel-noreferrer. h tm! címen találha­

tunk egy tesztesetet.

rel = "pingback"

(http:l!bit.lylc!AGXB) Egy "

pingback" kiszolgáló címét adja meg. Ahogy

a Pingback leírásában (http://hixie. chlspecslpingbacklpingback-1. O) szere­

pel, a "

pingback rendszer arra szolgál, hogy egy webnapló automatikus

értesítést kaphasson, amikor más webhelyek rá mutató hivatkozást tesz­

nek közzé. [ ... ], vagyis fordított hivatkozást tesz lehetövé, a hivatkozási

láncon felfelé haladva, és nem egyszerűen mélyebbre ásva." A webnapló­

rendszerek-elsősorban a WordPress-a pingback ("visszhangértesítés")

megvalósításával értesítik a szerzőket a rájuk mutató új hivatkozásokról,

amikor új webnapló-bejegyzést hoznak létre.

rel = "prefetch"

(http:!lbit.ly/9oOnMS) "Azt jelzi, hogy a megadott erőforrás előzetes le­

kérése és gyorstárazása jótékony hatású lehet, mivel igen valószínű, hogy

a felhasználónak szüksége lesz rá." A keresőprogramok néha hozzáadják

a <link rel="prefetch" h ref ="<emphasis>Az első

helyre rangsorolt oldal URL-je</emphasis>"> kódot

a találari oldalhoz, ha úgy érzik, hogy az első helyre rangsorolt oldal

lényegesen népszerűbb a többiné!. Próbáljuk ki például a Firefoxban,

hogy a Google-ben végrehajtunk egy keresést a CNN kifejezésre: ha

megnézzük a találari oldal forrását, megtalálhatjuk benne a prefetch

kulcsszót. Jelenleg a Mozilla Firefax az egyetlen böngésző, amelyik tá­

mogatja a rel="prefetch" viszonyleíró elemet.

3. fejezet Mit jelent mindez? l 69

Page 66: HTML5 - Az új Szabvány

rel= "search"

(http:!lbit.ly!aApkaP) "Azt jelzi, hogy a hivatkozott dokumentum ren­

delkezik kifejezetten a dokumentumban és a hozzá kapcsolódó erő­

forrásokban való keresésre szolgáló felülettel." Ha azt szeretnénk, hogy

a rel= "search" valóban hasznos legyen, a hivatkozásnak egy Open­

Search-dokumentumra kell mutatnia, amely leírja, hogy a böngészők

hogyan építhetnek fel egy olyan URL-t, amellyel egy adott kulcsszó

előfordulásait megkereshetik az aktuális webhelyen. Az OpenSearch­

dokumentumokat (illetve a rel= "search" hivatkozásokat, amelyek

ilyen leíró OpenSearch-dokumentumokra mutatnak) a Microsoft Inter­

net Explorer a 7-es, a Mozilla Firefox pedig a 2-es változat óta támo­

gatja.

rel= "sidebar"

(http:!!bit.lylazTA9D) "Azt jelzi, hogy a hivatkozott dokumentumot­

amennyiben lekérik- (lehetőség szerint) egy másodiagos böngészőkör­

nyezetben, és nem az aktuális böngészőkörnyezetben kell megjelení­

teni." Mit jelent mindez? Az Operában és a Mozilla Firefaxban azt, hogy

"amikor erre a hivatkozásra kattintok, kérdezd meg a felhasználót, hogy

létre kíván-e hozni egy könyvjelzőt, amely a Boomarks (Könyvjelzők)

menüből kiválasztva egy oldalsávban nyitja meg a hivatkozott doku­

mentumot." (Az Opera valójában "panelnek" hívja az "oldalsávot".) Az

Internet Explorer, a Safari és a Chromc figyelmen kívül hagyja a rel =

"sidebar "-t, és a hivatkozást normál hivatkozásként kezeli. A rel=

"s idebar "-hoz a http://wearehugh. comlpublic/2009/04/rel-sidebar. html

címen találhatunk egy tesztesetet.

rel= "tag"

(http:!lbit.lyl9bYlfo) "Azt jelzi, hogy a címke, amelyet a hivatkozott do­

kumentum jelképez, alkalmazható az aktuális dokumentumra." A "cím­

kék" (kategória-kulcsszavak) megjelölését a rel jellemzővel a Technorati

találta ki, hogy segítsen a webnapló-bejegyzések csoportosításában, ezért

a régebbi webnaplók és oktatóanyagok "Technorati-címkék" néven hi­

vatkoztak rájuk. (Igen, jól értettük: egy üzleti vállalkozás rábeszélte az

egész világot, hogy használjanak metaadatokat, hogy megkönnyítsék

a cég dolgát. Szép teljesítmény!) Az utasításformát később a mikroformá­

tumok közössége szabványosította; itt kapta az egyszerű rel= "t ag"

nevet. A legtöbb webnaplórendszer, amely megengedi, hogy az egyes

70 l Mitjelent mindez? 3. fejezet

Page 67: HTML5 - Az új Szabvány

bejegyzéseket kategóriákba soroljuk, illetve kulcsszavakat vagy címkéket

rendeljünk hozzájuk, re l= "tag" hivatkozásokkal látja el a bejegyzése­

ket. A böngészők ezekkel nem csinálnak semmi különöset, hiszen csupán

arra valók, hogy a keresőknek jelezzék, hogy miről szól az adott oldal.

Új jelentéstükröző elemek a HTML5-ben

A HTML5-nek nem csak az a célja, hogy a meglevő kódokat lerövidíthessük

( bár jelentősen segít ebben), hanem több új jelentéstükröző (szemantikus)

elemet is meghatároz. A HTML5 szabvány a következő elemeket írja le:

<section>

A s ection (szakasz) elem egy dokumentum vagy alkalmazás egy ál­

talános értelemben vett szakaszát jelképezi. Ebben az összefüggésben

a szakasz egy adott téma köré csoportosított tartalom, amelynek jellem­

zően van egy címsora. Szakaszok például a fejezetek, a füles párbeszéd­

ablakok különféle lapjai, vagy egy szakdolgozat számozott részei. Egy

webhely nyitóoldalát különböző szakaszokra- bevezetés, hírek, kapcso­

lati információk- lehet osztani.

<na v>

A nav elem egy oldal egy olyan szakaszát jelképezi, amely más olda­

lakra vagy az adott oldal más részeire hivatkozik, tehát egy navigációs

hivatkozásokkal ellátott szakaszt. Egy oldalon nem minden hivatkozás­

csoportnak kell nav elemen belül szerepelnie, hanem csak azoknak

a szakaszoknak, amelyek fontosabb navigációs blokkokból állnak. A láb­

lécben például a webhely különböző oldalaira murató hivatkozások- szol­

gáltatási feltételek, nyitóoldal, szerzői jogok stb. - rövid listáját szakták

elhelyezni, de ilyenkor a footer (lábléc) elem önmagában elég, nincs

szükség nav elemre.

<art i ele>

Az a rticle (cikk) elem egy önálló, független közzétételre vagy újra­

hasznosításra (például hírsugárzásra) alkalmas egységet jelképez egy do­

kumentumon, oldalon, alkalmazáson vagy webhelyen belül. Ez az egység

lehet fórum- vagy webnaplóbejegyzés, újságcikk, felhasználói hozzászó­

lás, interaktív vezérlő, illetve bármilyen más önálló tartalomegység.

3. fejezet Mit jelent mindez? J 71

Page 68: HTML5 - Az új Szabvány

<a side>

Az aside ("mellesleg") elem egy oldal egy olyan szakaszát jelképezi, amely a körülötte levő tartalomhoz csupán érintőlegesen kapcsolódik, de attól függetlennek tekinthető. Az ilyen szakaszokat nyomtatásban általában külön dobozba (oldalsávba) rakják. Az aside elemet olyan tipográfiai hatásokhoz használhatjuk, mint a behúzott idézetek vagy az oldalsávok, illetve reklámokat, na v elemcsoportokat, valamint az oldal fő tartalmához szorosan nem kötődö más tartalmakat helyezhetünk el bennük.

<hgroup>

A hgroup (címsorcsoport) elem egy szakasz címsorait jelképezi. Ezzel az elemmel csoportosíthatjuk a hl-h6 elemeket, amikor a címsoroknak több szintje van, például alcímeket vagy mottókat is használunk.

<header>

A header (címsor/fejléc) elem bevezető elemek vagy navigációs segé­dek egy csoportját jelképezi. Általában egy szakaszcímsort (egy hl-h6

vagy egy hgroup elemet) helyeznek el benne, de ez nem kötelező. A header elem egy szakasz tartalomjegyzékének, egy keresőűrlapnak vagy egy kapcsolódó emblémának a beburkolására is használható.

<footer>

A footer (lábléc) elem a legközelebbi szakaszképző szülőtartalom vagy gyökérelem láblécét jelképezi. A láblécben jellemzően olyan információk szerepeinek a vonatkozó szakaszról, mint a szakasz szerzője, a kapcso­lódó dokumentumokra mutató hivatkozások, a szerzői jogi információk és hasonlók. A lábléceknek nem feltétlenül kell egy szakasz végén szere­pelniük bár általában ott szokták elhelyezni őket. Ha a footer elem teljes szakaszokat tartalmaz, függeléket, tárgymutatót, hosszú kolofont, részletes felhasználási engedélyt vagy más hasonló tartalmat jelöl.

<time>

A time (idő) elem vagy egy (24 órás időbeosztású) időpontot, vagy egy konkrét dátumot jelöl a Gergely-naptárban (nem kötelezően kiegészítve egy időponttal és egy időzóna-eltéréssel).

<mark>

A mark (megjelölés/kiemelés) elem egy olyan szövegrészt jelképez egy dokumentumon belül, amelyet hivatkozás céljából megjelöltek vagy ki­emeltek.

72 l Mitjelent mindez? 3. fejezet

Page 69: HTML5 - Az új Szabvány

Tudom, hogy az Olvasó már alig várja, hogy használatba vegye ezeket az új

elemeket - különben nem olvasná ezt a fejezetet. Először azonban még ten­nünk kell egy kis kitérőt.

Hosszú kitérő arról, hogy miként

kezelik a böngészők az ismeretlen elemeket

Minden böngészőnek van egy "mesterlistája" azokról a HTML-elemekről,

amelyeket támogat. A Mozilla Firefox listáját például az nsElementTable.cpp

fájl tárolja (http:llmxr.mozilla.orglseamonkeylsourcelparserlhtmfparserlsrclmElement Tabfe.cpp). Az ebben a listában nem szereplő elemek "ismeretlen elemeknek" mi­

nősülnek. Az ismereden elemekkel kapcsolatban két alapvető kérdés merül fel:

Hogyan formázandó az elem? Alapértelmezés szerint a <p> elemek felett és alatt térköz található, a <blockquote> elemek balról behúzottak, a <hl> elemek pedig

nagyobb betűvel jelennek meg. Hogyan kell kinéznie az elem DOM-jának?

A Mozilla nsElementTable.cpp fájlja arról is tartalmaz információt, hogy

az egyes elemek milyen más elemeket tartalmazharnak. Ha azt írjuk

például, hogy <p><p>, akkor a második bekezdéselem közvetetten be­

zárja az elsőt, így a két elem testvér lesz, nem pedig szülő és gyermek. Ha viszont azt írjuk, hogy <p><span>, akkor a span nem zárja be

a bekezdést, mert a Firefox tudja, hogy a <p> tömbelem (blokkelem), amely tartalmazhat belső <span> elemet. A <span> tehát a <p>

gyermeke lesz a DOM-ban.

A különböző böngészők más-más választ adnak ezekre a kérdésekre. ( Tudom, megdöbbentő.) A fontosabb böngészők közül a Microsoft Internet Explorer

válaszaival van a legtöbb gond.

Az első kérdésre adott válasznak viszonylag egyszerűnek kellene lennie: az ismereden elemek ne kapjanak semmilyen különleges formázás t, csak örököl­jék azokat a CSS-tulajdonságokat, amelyek a megjelenésük helyén érvényben

vannak az oldalon, és minden formázást az oldal szerzője határozzon meg

CSS segítségéveL Sajnos az Internet Explorer (a 9-es változat előtt) egyáltalán

3. fejezet Mit jelent mindez? l 73

Page 70: HTML5 - Az új Szabvány

nem engedi meg az ismereden elemek formázását. Tegyük fel például, hogy a következő leírókódunk van:

<st y le type= "text/ ess">

article { display: black; border: lpx solid red l </style>

<article>

<hl>Welcome to Initech</hl>

<p>This is you r <span>first da y</ span>. </p>

</article>

Az Internet Explorer (az IE8-cal bezárólag) nem tesz vörös keretet a cikk köré. E könyv írásának idején az Internet Explorer 9 még csak bétaváltozat­ban létezett, de a Microsoft bejelentette (és a fejlesztök megerősítették), hogy az Internet Explorer 9-ben már nem lesz jelen ez a probléma.

A másik gondot a DOM okozza, amelyet a böngészők akkor építenek fel, amikor ismereden elemekkel találkoznak. Ebben a tekintetben is az Internet Explorer a fekete bárány. Ha az IE nem ismeri fel egyértelműen az elem nevét, akkor az elemet üres, gyermektelen csomópontként szúrja be a DOM-ba. Így minden elem, amelyről azt feltételeznénk, hogy az ismereden elemnek köz­veden gyermeke lesz, ehelyett testvérként kerül a DOM-ba.

Lássuk a különbséget egy ASCII-ábrán! Ez a DOM következne a HTMLS­ből:

article

+--hl (az article gyermeke)

l l l +--szövegcsomópont "Welcome to Initech"

l +--p (az article gyermeke, a hl testvére}

l +--szövegcsomópont "This is your "

l +--span

l l l +--szövegcsomópont "first da y"

l +--szövegcsomópont ". "

74 l Mitjelent mindez? 3. fejezet

Page 71: HTML5 - Az új Szabvány

Az Internet Explorer azonban valójában ezt a DOM-ot hozza létre:

article (nincsenek gyermekek)

hl (az article testvére)

l +--szövegcsomópont "Welcome to Initech •

p (a hl testvére)

l +--szövegcsomópont "This is your •

l +--span

l l l +--szövegcsomópont "first da y • l +--szövegcsomópont "."

Van azonban egy csodálatos kerülő megoldás erre a problémára. Ha JavaScript segítségével létrehozunk egy <article> álelemet, mielőtt ezt az elemet használnánk az oldalon, az Internet Explorer varázsütésre felismeri, és hagyja, hogy CSS-sel formázzuk Az áldemet egyáltalán nem szükséges beszúrni a DOM-ba. Elég (oldalanként) egyszer létrehozni az elemet, hogy megtanít­suk az IE-nek, hogy formáznia kell az ismeretlent. Például:

<html>

<head>

<st y le>

art i ele { display: block; border: lpx solid red } </st y le>

<script>document.createElement("article");</script> </head>

<body>

<article>

<hl>Welcome to Initech</hl>

<p>This is you r <span>first da y</ span>. </p>

</article>

</body>

</html>

Ez a megoldás az Internet Explorer valamennyi változatában működik, egé­szen az IE 6-ig visszamenőleg! A módszert kiterjeszthetjük, és egyszerre min­den új HTML5-elemből létrehozhatunk álpéldányokat - amelyek soha nem kerülnek be a DOM-ba, így nem is fogjuk látni őket-, és rögtön használatba is vehetjük őket, anélkül, hogy túlságosan aggódnunk kellene a HTML5-öt nem ismerő böngészők miatt.

3. fejezet Mit jelent mindez? l 75

Page 72: HTML5 - Az új Szabvány

Remy Sharp éppen ezt tette a találóan "HTML5 enabling script"-nek el­nevezett parancskódjával (http:llremysharp.com/2009/0I/07/html5-enabling­script). A parancskód számos átdolgozáson esett át, de az alapödet ez:

<1--[if lt IE 9]>

<script>

var e: ("abb r, article, a side, audio, canvas, datalist, details, "+

"figure,footer,header,hgroup,mark,menu,meter,nav,output, " +

"progress,section,time,video") .split(' ,');

for (var i: O; i< e.length; i++) { document.createElement(e[i]);

) </script>

<! [endif]-->

Az<!-- [if lt IE 9]> és <! [endif] --> részek feltételes megjegyzések, amelyeket az Internet Explorer úgy értelmez, mint egy if ("ha") utasítást:

"ha az aktuális böngésző az Internet Explorer 9-esnél régebbi változata, hajtsd végre ezt a kódblokkot". Minden más böngésző HTML-megjegyzésként ke­zeli a teljes blokkot. Az eredmény: az Internet Explorer (a 8-as változattal bezárólag) végrehajtja a fenti parancskódot, a többi böngésző azonban telje­sen figyelmen kívül hagyja, így az oldal gyorsabban töltődik be azokban a böngészőkben, amelyekben nincs szükség erre a trükkre.

Maga a JavaScript-kód viszonylag egyszerű. Az e változóból egy olyan ka­rakterláncokból álló tömb lesz, mint az "abbr ",az "article ",az "a side",

és így tovább. Ezt követően egy ciklussal végigjárjuk ezt a tömböt, és a document. createElement ( ) meghívásával létrehozzuk a nevesített ele­meket. Mivel azonban a visszakapott értéket figyelmen kívül hagyjuk, az elemek nem szúródnak be a DOM-ba. Mindazonáltal, ez elég ahhoz, hogy az Internet Explorer úgy kezelje ezeket az elemeket, ahogy szeretnénk, ami­kor az oldal későbbi részében ténylegesen használatba vesszük öket.

A "később" lényeges: ennek a parancskódnak az oldal elején kell szerepel­nie - lehetőleg a <head> elemben -, nem pedig a végén. Így az Internet Explorer még az előtt végrehajtja a parancskódo t, hogy feldolgozná a címké­ket és a jellemzőket. Ha a parancskódot az oldal végére tesszük, túl késő lesz: az Internet Explorer ekkorra már félreértelmezi a leírókódot, és hibás DOM-ot hoz létre - emiatt a parancskód miatt pedig nem fog visszamenni, és kijaví­tani a hibát.

Remy Sharp "összesűrítette" ezt a parancskódot, és elhelyezte a Google Project Hosting (http:llcode.google.comlplhtml5shivl) oldalán. (Ha esetleg

76 l Mit jelent mindez? 3. fejezet

Page 73: HTML5 - Az új Szabvány

érdekelne minket, maga a parancskód nyílt forrású, és MIT-engedéllyel ren­delkezik, így tetszőleges projektben felhasználhatjuk.) Ha szeretnénk, még

"forró hivatkozással" is kapcsolódhatunk a parancskódhoz, tehát közvetlen ül mutathatunk a fenti címen elhelyezett változatra - valahogy így:

<he ad>

<me ta charset= •utf-8" />

<title>My Weblog</title>

<!--[if ltiE9]>

<script src="http: //html5shiv .googlecode. com/svn/trunk/html5. js"></

script>

<! [endif]-->

</head>

Ezzel készen is állunk a HTML5 új jelentéstükröző elemeinek használatára.

Címsarok

Térjünk vissza a mintaoldalunkhoz- egészen pontosan a címsorokhoz:

<d i v id= "header">

<hl>My Weblog</hl>

<p class= "tagline ">A lot of effort wen t in to ma king this effortless. </p>

</div>

<d i v class= "en try">

<h2>Travel day</h2>

</div>

<div class= •en try">

<h 2> I'm going to Prague 1 </h2>

Ezzel a résszel nincs semmi gond. Ha tetszik, megtarthatjuk, mert érvényes HTML5-kód. A HTML5 azonban további elemeket is biztosít a címsorok és szakaszok számára.

Először is, szabaduljunk meg a <d i v id= "header"> rész től. Ez nagyon gyakori címke, de semmit nem jelent. Adivelemnek nincs meghatározott jelentése, ahogy az id jellemzőnek sem. (A böngészőknek nem szabad sem­milyen jelentésre következtetniük az id jellemző értékéből.) Ha az említett

3. fejezet Mitjelent mindez? l 77

Page 74: HTML5 - Az új Szabvány

címkét mondjuk <div id="shazbot">-ra változtatnánk, ugyanannyi je­lentéssel bírna - semennyiveL

A HTML5 azonban erre a célra meghatároz egy <header> elemet. A HTML5 szabványleírása több, a valós életből vett példát is bemutat a <header>

elem használatára. A mintaoldalunkon így festene:

<header>

<hl>My Weblog</hl>

<p class� "tagline ">A lot of effort wen t in to ma king this effortless. </p>

</header>

Ez jó, mert bárkinek, akit érdekel, elárulja, hogy egy címsorról van szó. De mi a helyzet a roottóval (tagline)? Ilyet is gyakran szoktak használni, de eddig nem volt rá szabványos leírókód, mert nem könnyű jelölni. A mottó olyan, mint egy alcím, de az elsődleges címhez "kapcsolódik"- vagyis olyan alcím, amely nem hoz létre saját szakaszt.

Az oldal szerkezetét olyan címsorelemek hozzák létre, mint a <hl> és a <h2>. Együtt egy olyan vázlatot alakítanak ki, amely segít magunk elé képzelni az oldalt, illetve megkönnyíti a mozgást az oldalon belül. A képer­nyőolvasó prograrnak a dokumentumvázlatra támaszkodva segítik a vak felhasználókat, hogy eligazadjanak az oldalon. A dokumentumvázlat képi megjelenítésére internetes eszközöket (http:llgsnedders.html5.orgloutlinerl) és böngészőbővítményeket (http:llchrispederick. comlworklweb-developerl) is hasz­nálhatunk.

A HTML 4-ben kizárólag <hl>-<h6> elemekkel lehetett dokumentum­vázlatot létrehozni. A mintaoldalunk vázlata így fest:

MyWeblog (hl)

l

+--Travel day (h2)

l

+--I'm going to Prague! (h 2)

Ez mind szép, de azt jelenti, hogy nincs mód az "A lot of effort went into making this effortless" ("Egy csomó problémát oldottunk meg, hogy a meg­oldás problémamentes legyen") mottó felcímkézésére. Ha <h2> címsorként próbáljuk megjelölni, egy fanromcsomópont jelenik meg a dokumentum­vázlatban:

78 l Mitjelent mindez? 3. fejezet

Page 75: HTML5 - Az új Szabvány

My Weblog (hl)

l +--A lot of effort wen t into making this effortless. (h2)

l +--Travel day (h2)

l +--I'm going to Prague' (h2)

Ez azonban nem a dokumentum tényleges szerkezete, hiszen a mottó csupán egy alcím; szakaszt nem jelképez.

És mi lenne, ha a mottót <h 2> címsorként jelölnénk meg, az egyes cikkek címei viszont <h3> címkét kapnának? Nem, ez még rosszabb:

My Weblog (hl)

l +--A lot of effort went in to making this effortless. (h2)

l +--Travel day (h3)

l +--I'm going to Prague! (h3)

A fantomcsomópont továbbra is ott van a dokumentumvázlatban, ráadásul

"ellopja" a gyökércsomóponthoz tartozó gyermekeket. Pontosan ebben rejlik

a probléma: a HTML 4 nem ad módot arra, hogy anélkül adjunk meg egy alcímet, hogy hozzáadnánk a dokumentumvázlathoz. Nem számít, hogyan keverjük a kártyákat, az "A lot of effort wem into making this effortless" mottó mindenképpen fel fog bukkanni a vázlatban - ezért használtunk egy olyan jelentéssei nem bíró kódot, mint a <p class= "tagline">.

A HTML5 azonban kínál erre egy megoldást: a <hgroup> elem haszná­latár. A <hgroup> elem két vagy több kapcsolódó címsorelem burkolójaként működik- de mit jelent az, hogy

"kapcsolódó"? Nos, azt jelenti, hogy a kap­

csolódó elemek együtt egyeden csomópontot hoznak létre a dokumentum­vázlatban.

Vegyük ezt a leírókódot:

<header>

<hgroup> <hl>My Weblog</hl>

<h2>A lot of effort wen t in to ma king this effortless. </h2> </hgroup>

</header>

3. fejezet Mitjelent mindez? l 79

Page 76: HTML5 - Az új Szabvány

<di v class= "en try">

<h2>Travel day</h2>

</div>

<d i v class= "en try">

<h2> I'm going to Prague! </h2>

</div>

A fenti kód ezt a dokumentumvázlatot hozza létre:

My Weblog (a hgroup hl eleme)

l +--Travel day (h2)

l +--I'm going to Prague! (h2)

A saját oldalainkat a HTML5 Outliner segítségével megvizsgálva győződ­hetünk meg arról, hogy helyesen használjuk-e a címsorelemeket.

Cikkek

A mintaoldalunkat folytatva, lássuk, mit tehetünk ezzel a kóddal:

<di v class= "en try">

<p class= "post-date ">October 22, 2009</p>

<h 2>

<a href="# •

rel= "bookmark •

ti tle= "link to this post"> Travel day

<la> </h2>

</div>

Ez ismét csak érvényes HTML5-kód, de a HTML5-ben van egy konkrétabb elem is arra, hogy egy oldalon megjelöljünk egy cikket - a találó nevű <article> ("cikk") elem:

<article>

<p class= "post-date ">October 22, 2009</p>

80 l Mitjelent mindez? 3. fejezet

Page 77: HTML5 - Az új Szabvány

<h 2>

<a href="# •

rel= "bookmark •

title= "link to this post">

Travel day

</a>

</h2>

</article>

Na persze ez nem ilyen egyszerű. Még egy módosítást végre kell hajtanunk. Először megmutatom, aztán elmagyarázom:

<article>

<header>

<p class= "post-date ">October 22, 2009</p>

<hl>

<a href= "#"

rel="bookrnark"

title= "link to this post">

Travel day

</a>

</hl>

</header>

</article>

Észrevettük? A <h2> elemet <hl>-re változtattam, és egy <header> elembe burkoltam. A <header> elemet már láttuk működés közben. A célja az, hogy beburkolja a cikk fejlécét alkotó összes elemet (vagyis ebben az esetben a cikk közzétételének dátumát és a cikk címét). De ... de ... de <hl> elemből nem csak egy lehet egy dokumentumban? Nem fogja ez tönkretenni a doku­mentumvázlatot? Nem, de ahhoz, hogy megérthessük, miért nem, vissza kell lépnünk egy kicsit.

A HTML 4-ben kizárólag <hl>-<h6> elemekkeliehetett dokumentum­vázlatot létrehozni. Ha a vázlatban csak egyetlen gyökércsomópontot akar­tunk, a leírókódban egyetlen <hl> elemre kellett szorítkoznunk. A HTML5 szabvány azonban egy olyan algoritmust határoz meg a dokumentumvázla­tok előállítására, amely a HTML5 új jelentéstükröző elemeire támaszkodik. A HTML5 algoritmusa azt mondja, hogy az <article> elemek új szakaszt hoznak létre, vagyis új csomópontot a dokumentumvázlatban- a HTML5-ben viszont minden szakasznak saját <hl> eleme lehet.

3. fejezet Mitjelent mindez? l 81

Page 78: HTML5 - Az új Szabvány

Ez drasztikus és előnyös változás a HTML 4-hez képest. Hogy miért elő­nyös? Nos, sok weboldalt valójában sablonok alapján állítanak elő. A tartalom egy részét az egyik forrásból nyerik ki és szúrják be az oldalba, a másik része pedig egy másik forrásból származik, és az oldal egy másik részén helyezik el. Sok oktatóanyagat ugyanígy építenek fel: "Itt egy HTML-részlet- csak má­solj uk le, és illesszük be az oldalunkba.". Ez kis mennyiségű tartalomnál meg­felel, de mi a helyzet, ha a heilleszrendő kód egy reljes szakaszt felölel? Ebben az esetben az oktatóanyag valami ilyesmit fog mondani: ",tt egy HTML­részlet - csak másoljuk le, illesszük be egy szövegszerkesztőbe, és igazítsuk a címsorelemeket úgy, hogy megfeleljenek a céloldal címsorelemei beágyazási szintjének.".

Hadd fogalmazzam meg másként. A HTML 4-ben nincs általános cím­sorelem, csak hat szigorúan számozott címsor (<hl>-<h6>), amelyeket pon­tosan a számozásnak megfelelő sorrendben kell egymásba ágyazni. Ez elég kényelmetlen, különösen ha az oldalunkat "összeszereljük", nem pedig "meg­írjuk". Ezt a problémát oldja meg a HTML5 az új szakaszaló elemekkel és a meglevő címsorelemekre vonatkozó új szabályokkaL Ha az új szakaszaló elemeket használjuk, ezt a kódot ajánihatom fel:

<article>

<header>

<hl>A syndicated post</hl>

</header>

<p> Lorern ips um blah blah ... </p>

</article>

Ezt a kódot lemásolhatjuk, és az oldalunkon bárhová beilleszthetjük módosí­tás nélkül. Az, hogy tartalmaz egy <hl> elemet, nem jelent gondot, mert az egészet egy <article> elem zárja magába. Az <article> elem egy önálló csomópontot határoz meg a dokumenrumvázlarban, a <hl> elem ennek a csomópontnak a címét adja meg, az oldal összes többi szakaszaló eleme pedig azon a beágyazási szinten marad, mint korábban.

82 l Mit jelent mindez? 3. fejezet

Page 79: HTML5 - Az új Szabvány

Leírókód professzor azt mondja

Mint mindenre, ami a Weben található, a fentiekre is igaz, hogy a va­

lóság kissé bonyolultabb annál, mint ahogy én lefestem. Az új "kifeje­

zett" szakaszoló elemek (mint az <article> elembe burkolt <hl>)

kiszámíthatatlan kölcsönhatásba kerülhetnek a régi, "beleértett" szaka­szoló elemekkel (az önmagukban álló <hl>-<h6> elemekkel). Az éle­

tünk egyszerűbb lesz, ha csak az egyiket vagy a másikat használjuk, de nem mindkettőt. Ha mindkettőt használnunk kell egy oldalon belül, mindenképpen ellenőrizzük az eredményt a HTML5 Outlinerben, és győződjünk meg róla, hogy értelmes dokumentumvázlatot kapunk.

Dátumokés időpontok

Izgalmas, nem? Persze nem annyira izgalmas, mint meztelenül lesikJani a Mount Everestről, miközben visszafelé énekeljük az amerikai himnuszt, de egy jelentéstükröző leírókódtól nem rossz. De folytassuk a minraoldalunk elemzését. A következő sor, amire fel szeretném hívni a figyelmet, ez:

<div class= "entry ">

<p class="post-date">October 22, 2009</p> <h2>Travel day</h2>

</div>

Már megint a régi nóta, igaz? Egy szokványos információközlés - egy cikk közzétételi dátumának jelzése -, amelyhez nem áll rendelkezésre megfelelő jelentéstükröző elem, ezért a szerzőknek egyéni class jellemzőkkel ellátott általános leírókódokra kell szorítkozniuk. Itt is igaz persze, hogy ez érvényes

HTML5-kód, tehát nem kötelező megváltoztatnunk. A HTML5 azonban konkrét megoldást is kínál az ilyen esetekre: a <time> elemet:

<time date time= "2009-10-22" pubdate>October 22, 2009</time>

A <time> elemek három részből állnak: • A számítógép által olvasható időbélyegből

• Az ember által értelmezhető szöveges tartalomból • Az elhagyható pubdate jelzőből

3. fejezet Mitjelent mindez? l 83

Page 80: HTML5 - Az új Szabvány

Ebben a példában a datetime jellemző csak egy dátumot határoz meg, időpontot nem. A formátum: négy számjegyű év, két számjegyű hónap és két számjegyű nap, kötőjelekkel elválasztva:

<time datetime="2009-10-22" pubdate>October 22, 2009</time>

Ha időpontot is meg akarunk adni, írjuk a T betűt a dátum után, majd az időpontot 24 órás formában, végül pedig egy időzóna-eltérést:

<time da tet ime� "2009-10-22T13: 59:47-04:00" pubdate>

October 22, 200 9 l: 59pm EDT

</time>

A dátum- és időformátum elég rugalmas. A HTMLS szabványleírása több példát is tartalmaz az érvényes dátum- és idő-karakterláncokra.

Figyeljük meg, hogy megváltoztattam a szövegtartalmat-a <time> és </time> címkék közötti részt-, hogy illeszkedjen a számítógép által olvas­ható időbélyeghez. Ez nem kötelező; a szövegtartalom tetszőleges lehet, amíg a datetime jellemzőben egy számítógép által olvasható dátum- és időbélye­get adunk meg. Ez tehát érvényes HTMLS-kód:

<time da tet ime� "2009-10-22 ">múlt csütörtök</ time>

És ez is:

<time datetime� "2009-10-22 "></time>

A kirakósjáték utolsó darabja itt a pubdate jellemző. Ez egy logikai jel­lemző, ezért csak annyit kell tennünk, hogy beírjuk, ha szükségünk van rá, valahogy így:

<time datetime� "2009-10-22 "pubdate>October 22, 2009</time>

Ha nem szeretjük a "csupasz" jellemzőket, írhatjuk az alábbit is, ami egyen­értékű a fenti kóddal:

<time date time� "2009-10-22 "pubdate="pubdate">October 22, 2009</time>

Mi a jelentése pubdate jellemzőnek? Nos, két dolgot jelenthet. Ha a <time>

elem egy <article> elemben található, akkor azt jelenti, hogy ez az időbé­lyeg a cikk közzétételi dátuma (publication date). Ha viszont a <time> elem nem egy <art ic le> elem belsejében található, akkor a jelentése az, hogy az időbélyeg a teljes dokumentum közzétételének dátumát adja meg.

84 l Mit jelent mindez? 3. fejezet

Page 81: HTML5 - Az új Szabvány

Íme a teljes cikk átdolgozott, a HT ML5 előnyeit teljes mértékben kihasználó változata:

<article>

<header>

<time datetirne= "2009-10-22 " pubdate>

October 22, 200 9

</time>

<hl>

<a href= •J "

rel="bookrnark"

title= "link to this post">

Travel da y

</a>

</hl>

</header>

<p> Lorern ip sum dolo r si t ame t ... </p>

</article>

Navigáció

Minden webhelynek a navigációs sáv az egyik legfontosabb része. A CNN.

com webhely minden oldalának tetején "fülek" találhatók, amelyek a külön­böző híresokrokra- "T ech" (Tudomány), "Health" (Egészség), "Spons" (Sport) stb. - hivatkoznak. A Google kereső találari oldalai hasonló sávot jelenítenek meg az oldal tetején, ami lehetövé teszi, hogy a keresést a Google különféle szolgáltatásaival- "Images" (Képek), "Video" ( Videók), "Maps" (Térkép) stb. - hajtsuk végre. A mintaoldalunk fejlécében is van egy navigációs sáv, amely hivatkozásokat tartalmaz a képzeletbeli webhelyünk különböző - "home"

(nyitóoldal), "blog" (webnapló), "gallery" (képgaléria) és "abour" (névjegy) -szakaszaira.

A navigációs sáv leírókódja erederileg így nézett ki:

<di v id= "na v">

<ul>

<li><a href= "#">home</ a></ li>

<li><a href="l'>blog</a></li>

<li><a href= •t '>gallery</ a></ li>

<li><a href="l">about</a></li>

</ul>

</div>

3. fejezet Mitjelent mindez? l 85

Page 82: HTML5 - Az új Szabvány

Ez megint csak érvényes kód a HTMLS-ben, csak éppen egy négy elemből álló listát jelöl, és semmi sem utal arra, hogy ez a lista a webhely navigációs rendszerének része. A látványból persze kitalálhatjuk, mivel a lista az oldal fejlécében szerepel, és a hivatkozások szövege is elárulja, de szemantikailag semmi nem különbözteti meg ezt a hivatkozáslistát a többi, nem navigációs hivatkozástóL

De kinek számít, hogy egy webhely navigációs rendszerének jelentéstük­

röző leírása legyen? Nos, például a fogyatékkal élőknek (http://diveinto­accessibility.org). Miért? Vegyük a következő forgatókönyvet: mozgáskorláto­zottak vagyunk, így csak nehezen vagy egyáltalán nem tudjuk használni az egeret. Ennek ellensúlyozására egy böngészőbővítményt használunk, amely lehetövé teszi, hogy a kívánt fő navigációs hivatkozásra ugorjunk (vagy éppen átugorjuk azt). Vagy nézzünk egy másik esetet: a látásunk korlátozott, ezért egy úgynevezett "képernyőolvasó" programot használunk, amely hangosan felolvassa és összefoglalja a weboldalak szövegét. Az oldal címe után minden oldalon a fő navigációs hivatkozások jelentik a következő fontos információ­kat. Ha az adott webhelyen belüli mozgást szeretnénk felgyorsítani, arra uta­sítjuk a képernyőolvasót, hogy ugorjon a navigációs sávra, és olvassa fel azt.

Ha viszont az oldal tartalma érdekel minket, azt mondjuk a képernyőolvasó­nak, hogy ugorja át a navigációs sávot, és az oldal szövegét kezdje felolvasni. Mindkét esetben fontos azonban, hogy képesek legyünk programozott mó­

don meghatározni a navigációs hivatkozásokat. Tehát nincs ugyan semmi baj azzal, ha a <div id="nav"> kóddal jelöl­

jük meg a webhely navigációs elemeit, de nem is különösebben hasznos, mert azokat, akiknek tényleg szükségük van rá, nemigen segíti. A HTML5-ben viszont már lehetőségünk van jelentéstükröző módon megadni a navigációs szakaszokat- a <na v> elemmel.

<na v> <ul>

<li><a href= "#">home</ a></ li> <li><a href= "# ">blog</ a></ li>

<li><a href= "# ">gallery</ a></ l i> <li><a href= "# ">about</a></li>

</ul> </nav>

86 l Mitjelent mindez? 3. fejezet

Page 83: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: Az ugróhivatkozások (skip link) összeegyeztethetők a <nav> elem­

mel? Szükség van egydita/án a HTML5-ben is ugróhivatkozdsokra?

Válasz: Az ugróhivatkozások lehetövé teszik a képernyőolvasóknak, hogy átugorják a navigációs szakaszokat, ami hasznos azoknak a fogya­

tékkal élő felhasználóknak, akik valamilyen külső programmal olvas­tatják fel a weboldalakat, és egér nélkül mozognak a webhelyeken belül. Arról, hogy hogyan és mikor használhatunk ugróhivatkozásokat, a http:/1

www.webaim.org/techniqueslskipnav címen olvashatunk részletesebben.

Amint frissítik a képernyőolvasókat, hogy felismerjék a <n av> elemet,

az ugróhivatkozások feleslegessé válnak, mivel a képernyőolvasó progra­

mok képesek lesznek kívánságra automatikusan átugrani a <n av> kód­

dal megjelölt navigációs szakaszokat. Mindazonáltal időbe telik, mire a Weben minden fogyatékkal élő felhasználó HTML5-képes képernyő­olvasóra vált, ezért továbbra is célszerű ugróhivatkozásokat biztosítani a <n av> szakaszok átlépéséhez.

Láblécek

Végre-valahára elérkeztünk a mintaoldalunk végéhez. Az utolsó, amiről be­szélni szeretnék, az oldal utolsó eleme: a lábléc. A lábléc eredeti kódja így

nézett ki:

<di v id= • faoter ">

<p>&U67;</p>

<p>&#l69; 2001&#8211; 9 <a href= "#">Mark Pilgrim</ a></ p>

</div>

Ez ismét csak érvényes HTML5-kód, de a HTML5-ben van egy megfelelőbb

elem is erre a célra-a <footer> ("lábléc") elem:

<footer>

<p>&#167;</p>

<p>&#169; 2001&#8211; 9 <a href= "#''>Mark Pilgrim</a></p>

</footer>

Mit helyénvaló egy <footer> elembe tenni? Valószínűleg minden olyasmit, amit most egy <d i v id= "footer "> elemben helyezünk el. Na jó, ez a válasz

3. fejezet Mitjelent mindez? J 87

Page 84: HTML5 - Az új Szabvány

egy önnön farkába harapó kígyó volt, de tényleg ennyi az egész. A HTMLS szabványleírása ezt mondja: "A lábléc jellemzően olyan információkat tartal­maz a szakaszról, amelyhez tartozik, mint a szakasz szerzője, hivatkozások kapcsolódó dokumentumokra, szerzői jogi információk és hasonlók.". Ilyen a mintaoldalunk lábléce is: egy rövid copyright-szöveg szerepel benne, vala­mint egy hivatkozás a szerzőről szóló oldalra. Ha körülnézünk néhány nép­szerű webhelyen, más elemeket is láthatunk, amelyek alkalmasak arra, hogy egy láblécben helyezzük el őket:

• A CNN oldalának lábléce a szerzői jogi információkat tartalmazza, va­lamint hivatkozásokat az oldal más nyelvre fordított változataira, a szol­gáltatási feltételekre, az adatvédelmi nyilatkozatra, illetve az "about us"

("rólunk"), "contact us" ("elérhetőségeink") és "help" ("súgó") oldalakra. A lábléc mindegyiknek tökéletes hely.

• A Google nyitóoldala híresen spártai, de az alján találunk néhány hi­vatkozást- "Advertising Programs" (Hirdetési programok), "Business Solutions" (Üzleti megoldások), "About Google" (Rólunk)-, valamint a szerzői jogi információkat és egy hivatkozást a Google adatvédelmi irányelveire. Ezek mind olyan dolgok, amiket be lehet csomagolni egy <footer> elembe.

• Az én webnaplám (http://diveintomark.org) lábléce az egyéb webhelye­imre mutató hivatkozásokar, valamint a szerzői jogi információkat tar­talmazza- ezek egyértelműen egy <footer> elembe valók. (Megjegy­zendő, hogy magukat a hivatkozásokat nem szabad egy <nav> elembe burkolni, mert nem a webhely navigációs hivatkozásairól van szó, csupán más webhelyeken folyó projektekre mutató hivatkozásokról.)

Manapság a kövér láblécek (http:llui-patterns.comlpattern/FatFooter) nagy slá­gernek számítanak. Vessünk egy pillantást a W3C webhelyén (http://www. w3.org) található láblécre: ez a lábléc három oszlopból- "Navigation" (Navi­gáció), "Contact W3C" (A W3C elérhetőségei) és "W3C Updates" (Frissíté­sek) - áll. A leírókódja pedig többé-kevésbé így fest:

<div id= "w 3 c faoter ">

<di v class= "w 3 c footer-nav ">

<h3>Navigation</h3>

<ul>

<li><a href= • l ">Home< la></ li>

<li><a href="/standards/">Standards</a></li>

88 l Mit jelent mindez? 3. fejezet

Page 85: HTML5 - Az új Szabvány

<li><ahref="/participate/">Participate</a></li>

<li><ahref="/Consortium/membership">Membership</a></li>

<li><a href= "/Consortium/ ">About W3C</a></li>

</ul>

</div>

<div class= "w 3 c footer-nav ">

<h3>Contact W3C</h3>

<ul>

<li><ahref="/Consortium/contact">Contact</a></li>

<li><a href= "/Help/ ">Help and FAQ</ a></ li>

<li><ahref="/Consortium/sup">Donate</a></li>

<li><a href= "/Consortium/ siteindex ">Site Map</ a></ li>

</ul>

</div>

<di v class= "w 3 c footer-nav ">

<h3>W3C Updates</h3>

<ul>

<li><a href= "http: l /twitter. com/W3C ">Twitter</a></li>

<li><ahref="http://identi.ca/w3c">Identi.ca</a></li>

</ul>

</div>

<p class= "copyright ">Copyright© 200 9 W3C</p>

</div>

Ahhoz, hogy ezt jelentéstükröző HTML5-kóddá alakítsuk, én a következő módosításokat hajtanám végre:

• Alakítsuk a külső <div id= "w 3 c footer "> derner <footer>

elemmé.

• Alakítsuk a <div class="w3c _ footer-nav"> első két példányát <nav> elemekké, a harmadik példányt pedig egy <section> elemmé.

• Alakítsuk a <h3> címsorokat <hl> címsorokká, mivel mindegyik egy

szakaszaló elembe fog kerülni. A <n av> elem egy szakaszt hoz létre a do­kumentumvázlatban, akárcsak az <article> elem (lásd a "Cikkek"

című részt egy kicsir korábban).

A végső leírókód valahogy így nézne ki:

<footer>

<na v>

<hl>Navig ation</hl>

<ul>

<li><a href= "l ">Home</ a>< /li>

<li><a href= "/standards/ ">Standards</ a></ li>

<li><ahref="/participate/">Participate</a></li>

<li><a href= • /Consortium/membership ">Membership</a></li>

<li><a href= "/Consortium/ ">About W3C</a></ li>

</ul>

3. fejezet Mitjelent mindez? l 89

Page 86: HTML5 - Az új Szabvány

</nav>

<na v>

<hl>Contact W3C </hl> <ul>

<li><ahref="/Consortium/contact">Contact</a></li>

<li><a href= "/Help/ ">Help and FAQ</ a></ li>

<li><ahref="/Consortium/sup">Donate</a></li>

<li><a href= • /Consortium/ siteindex ">Site Map</ a></ li>

</ul>

</nav>

<section>

<hl>W3C Updates </hl>

<ul>

<li><ahref="http://twitter.com/W3C">Twitter</a></li>

<li><ahref="http://identi.ca/w3c">Identi.ca</a></li>

</ul>

</section>

<p class= "copyright ">Copyright© 200 9 W3C</p>

</footer>

További olvasmányok

A fejezetben szereplő mintaoldalak:

• Az eredeti (HTML 4) (http://diveintohtml5.orglexamples/blog-original.html) • A módosított (HTML5) (http://diveintohtml5.orglexampleslblog-html5.

html)

A karakterkódolásról:

• Joel Spolsky: "The Absolute Minimum Every Software Developer Abso­lutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" (h ttp:llwwwjoelonsoftware. com/ articiesi Unicode. html)

• Tim Bray: "On the Goodness ofUnicode" (http:l!www.tbray.org/ongoingl When/200x/2003/04/06/Unicode), "On Character Strings" (http://www.tbray.org/ ongoing!When/200x/2003!04113/Strings) és "Characters vs.Bytes" (http:/1 www.tbray.org/ongoing/When/200x/2003/04126/UTF)

A HTML5 engedélyezéséről az Internet Explorerben: • Sjoerd Visscher: "How to style unknown elements in IE " (http:llxopus.

com/devblog/2008/style-unknown-elements.html) • John Resig: HTML5 shiv (http:!lejohn.org!bloglhtml5-shivl)

90 l Mitjelent mindez? 3. fejezet

Page 87: HTML5 - Az új Szabvány

• Remy Sharp: HTMLS enabling script (http:llremysharp.com/2009/01/07/ html5-enabling-scriptl)

A szabványkövető módról és a dokumentumtípus-kiszimatolásról:

• Henri Sivonen: "Activating Browser Modes with Doctype" (http://hsivonen. iki.Ji!doctypel)- ez az egyetlen cikk, amelyet muszáj elolvasnunk a témáról.

Sok más cikket Írtak róla, de azok elavultak, hiányosak vagy tévedéseket tartalmaznak.

A HTML5-öt ismerő ellenőrző rendszer:

• Validator.nu (X)HTMLS Validator (http://html5.validator.nu)

Page 88: HTML5 - Az új Szabvány

4. fejezet

A rajzvászon ördöge (ne fessük a falra!)

Ugorjunk fejest!

A HTMLS így határozza meg a <canvas> ("rajzvászon") elemet (http:!lbit. ly/9]Hz0j): "felbontástól függeden bitképes rajzvászon, amelyet grafikonok, já­tékgrafikák és más képi elemek menet közbeni megjelenítésére használhatunk

".

A rajzvászon egy téglalap alakú terület az oldalon, amelyre JavaScript-kód segítsé­gével tetszőleges dolgot rajzolharunk Az alábbi táblázat megmutatja, hogy e könyv írásának idején mely böngészők kínálnak alapszintű támogatást a rajzvászonhoz:

.Chmm.«

7.0+ 3.0+ 3.0+ 3.0+ 10.0+ 1.0+ 1.0+

'Az Internet Explorerben a támogatáshoz a külső explorercanvas könyvtár szükséges

Hogyan néz ki egy rajzvászon? Tulajdonképpen sehogy. A <canvas> elem­nek nincs tartalma, és nincs saját szegélye. A leírókódja így fest:

<canvas wid th= "300" height= "225"></ canvas>

A 4.1. ábra pontozott körvonallal mutatja a rajzvásznat, hogy lássuk, mivel is van dolgunk.

Egy oldalon több <canvas> elem is lehet. Mindegyik rajzvászon megje­lenik a DOM-ban, és mindegyiknek saját állapota van. Ha az egyes rajzvász­nakhoz id jellemzőket rendelünk, ugyanúgy érhetjük el őket, mint bármely más elemet.

Bővítsük ki hát a fenti kódot, hogy id jellemző is legyen benne:

< canvas id= "a" width= "300 • height= "225 "></canvas>

Most már egyszerűen megtalálhatjuk ezt a <canvas> elemet a DOM-ban:

var a_ canvas = document. getElementByid ( "a") ;

4. fejezet A rajzvászon ördöge ... l 93

Page 89: HTML5 - Az új Szabvány

4. l. ábra Rajzvászon szegéllyel

Egyszerű alakzatok

IP Arefox Sa fari 7.0+ 3.0+ 3.0+

Chrome ra 3.0+ 10.0+

!Phone Androld 1.0+ 1.0+

• Az Internet Explorerben a támogatáshoz a külső explorercanvas könyvtár szükséges

Kezdetben minden rajzvászon üres. Ez nagyon unalmas, úgyhogy rajzoljunk

valamir! Az onclick eseménykezelő segítségével meghívhatunk egy függ­vényt, amely egy négyszöget rajzol (egy interaktív példát a http:lldiveintohtm/5. orglcanvas.html címen láthatunk):

function draw_ b () {

)

var b_ canvas = docurnent. getElementByid ( "b") ;

var b_context = b_canvas. getContext ( "2d ");

b_context.fil1Rect(50, 25,150, 100);

A függvény első sorában nincs semmi különleges: csak megkeresi a <canvas> elemet a DOM-ban. A második sorban kezd érdekessé válni a dolog. Minden rajzvászonnak van egy rajzkörnyezete (context), és itt történnek az izgalmas dolgok. Miurán megtaláltuk (akár a document.getElementByid(), akár egy kedvünkre való másik tagfüggvény segítségéve!) a kívánt <canvas> ele­met, meghívhatjuk a getContext O tagfüggvényét. Ennek a tagfüggvény­nek kötelező a "2 d" karakterláncot átadnunk:

94 l A rajzvászon ördöge ... 4. fejezet

Page 90: HTML5 - Az új Szabvány

function draw_b() {

l

var b_canvas = document. getElementByld ("b");

var h_context =b_canvas .getContext("2d"); b_context.fillRect(SO, 25, 150, 100);

Kérdezzük meg Leírókód professzort!

Kérdés: Létezik háromdimenziós rajzvászon is? Válasz: Még nem. Egyes gyártók kísérleteznek saját háromdimenziós rajzvászon-API-val, de még egyik sem vált szabvánnyá. A HTML5

leírása csak annyit jegyez meg, hogy "e szabvány valamelyik jövőbeli változata valószínűleg meg fog határozni egy háromdimenziós környe­zetet is".

Van tehát egy <canvas> elemünk, és rendelkezünk a rajzkörnyezetéveL A rajzkörnyezet határozza meg az összes rajzolófüggvényt és rajztulajdonsá­got. A négyszögek rajzolásához tulajdonságok és tagfüggvények egész cso­portja áll rendelkezésre:

• A fil1St y le (kitöltési stílus) tulajdonság értéke egy CSS-kóddal meg­határozott szín, mintázat vagy színátmenet lehet. (A színátmenetekről hamarosan bővebben is szó lesz.) Az alapértelmezett fillStyle az egy­színű fekete, de ezt tetszés szerint módosíthatjuk. Minden rajzkörnye­

zet emlékszik a saját tulajdonságaira, amíg az oldal nyitva van, hacsak nem teszünk valamit, hogy visszaállítsuk azokat az alapértelmezett ér­tékeikre.

• A fillr ect(x, y, szélesség, magasság) egy négyszöget rajzol az érvényben levő kitöltési stílussaL

• A strokeStyle (körvonalstílus) tulajdonság olyan, mint a fillStyle:

az értéke egy CSS-szín, -mimázat vagy -színátmenet lehet. • A strokeRect(x, y, szélesség, magasság) egy négyszöget

rajzol az érvényben levő körvonalstílussal. A strokeRect nem tölti ki a négyszöget, csak az oldalait rajzolja meg.

• A clearRect(x, y, szélesség, magasság) törli a megadott négyszög képpontjait.

4. fejezet A rajzvászon ördöge ... \ 95

Page 91: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: "Aiaphelyzetbe" lehet állítani egy rajzvásznat?

Válasz: Igen. Ha egy <canv as> elemnek módosítjuk a szélességét vagy a magasságát, a tartalma törlődik, és a rajzkörnyezetének minden tulaj­

donsága visszaáll az alapértelmezett értékére. Sőt nem is kell módosítani

a szélességet- elég, ha "beállítj uk" az aktuális értékére, valahogy így:

var b_canvas = document .getElementByid ("b");

b_ canvas . width =b_ canvas . width;

Térjünk vissza az előző példában szereplő kódhoz:

var b_canvas = document. getElementByid ("b");

var b_ context =b_ canvas. getContext ( "2 d •) ;

b_context.fillRect(SO, 25, 150, 100);

A fill Re ct() tagfüggvény meghívása egy négyszöget rajzol a rajzvászonra, és az érvényben levő kitöltési stílussal- vagyis fekete színnel, ha nem módo­sítottuk az alapértelmezést- tölti ki azt. A négyszöget a bal felső sarka (50,

25), a szélessége (150) és a magassága (100) határozza meg. Hogy jobban el tudjuk képzelni, hogyan is működik ez az egész, nézzük meg a rajzvászon koordinátarendszerét.

Rajzvászon-koordináták

A rajzvászon egy kétdimenziós rács. A (O, O) koordináta a rajzvászon bal felső

sarkát jelöli. Az x-tengelyen az értékek a rajzvászon jobb széle felé nőnek, míg az y-tengelyen a rajzvászon alsó széle felé.

A 4.2. ábrán látható koordináta-diagramot egy <canvas> elem segítsé­gével rajzoltam, és a következőkből áll:

• Piszkosfehér függőleges vonalakból • Piszkosfehér vízszintes vonalakból • Két fekete vízszintes vonalból

• Két apró fekete átlós vonalból, amelyek egy nyilat formáznak • Két fekete függőleges vonalból

96 l A rajzvászon ördöge ... 4. fejezet

Page 92: HTML5 - Az új Szabvány

• Két apró fekete átlós vonalból, amelyek egy újabb nyilat formáznak • Az "x

" betűből • Az "y" betűből • A "(O, O)" szövegből a bal felső sarok közelében • Az "(500, 375)" szövegből a jobb alsó sarok közelében • Egy pontból a bal felső és egy másik pontból a jobb alsó sarokban

(0,0)

x --------------7

y

(500 ,375}

4.2. ábra Rajzvászonkoordináta-diagram

A következőkben megvizsgáljuk, hogyan érhetjük el a képen látható hatást. Először is, meg kell határoznunk magát a <canvas> elemet. A <canvas>

elem adja meg a négyszög szélességét (wid th) és magasságát (height), vala­mint az azonosítóját (id), hogy később megtalálhassuk:

< canvas id; "c • width; "500" height; "375 "></canvas>

Ez után egy parancskódra van szükségünk, amely megkeresi a <canvas>

elemet a DOM-ban, és kiolvassa a rajzkörnyezetét:

4. fejezet A rajzvászon ördöge .. . J 97

Page 93: HTML5 - Az új Szabvány

var c_canvas = document .getElementByid ( •c ");

var context =c_ canvas. getContext ("2 d") ;

Most már nekiállhatunk megrajzolni a vonalakat.

útvonalak

7.0+ 3.0+ 3.0+ 3.0+ 10.0+ 1.0+ 1.0+

• Az Internet Explorerben a támogatáshoz a külsö explorercanvas könyvtár szükséges

Képzeljük el, hogy tollal rajzolunk egy képet. Nem akarunk csak úgy fejest ugrani a rajzolásba, mert ha esetleg hibázunk, nem tudjuk majd kijavítani. Ehelyett először ceruzával felvázoljuk a vonalakat, és ha elégedettek vagyunk

velük, kihúzzuk a vázlatot tollal. Minden rajzvászonhoz tartozik egy útvonal (path). Az útvonal meghatá­

rozása olyan, mint ceruzával rajzolni. Azt rajzol unk, amit akarunk, de az nem lesz a végső alkotás része, amíg tollal ki nem húzzuk.

Ha egyenes vonalakat szeretnénk ceruzával rajzolni, az alábbi két mód­

szert alkalmazhatjuk:

• moveTo (x, y) -A ceruzát a megadott kezdőpontba mozgatja. • lineTo (x, y) -A megadott végpontig húz vonalat.

Minél többször hívjuk meg a moveTo () és lineTo () függvényeket, annál

hosszabb lesz az útvonal. Ezek "ceruza-tagfüggvények" - annyiszor hívjuk meg őket, ahányszor csak akarjuk, de a rajzvásznon semmit sem fogunk látni, amíg meg nem hívjuk valamelyik "tolltagfüggvényt".

Kezdjük a piszkosfehér rács megrajzolásával:

for (varx=O.S; x< 500; x+=lO)

context.moveTo(x, 0); context.lineTo(x, 375);

} for (vary=O.S; y< 375; y+=lO)

context.moveTo(O, y);

context.lineTo(SOO, y); }

98 l A rajzvászon ördöge ... 4. fejezet

Page 94: HTML5 - Az új Szabvány

A fentiek mind "ceruza-tagfüggvények", tehát ténylegesen még semmit nem

rajzoltunk a rajzvászonra. Ahhoz, hogy a rajz maradandó legyen, egy "toll­tagfüggvényre" van szükségünk:

context. strokeStyle; "!Ieee"; context.stroke();

A stroke() egyike a "tolltagfüggvényeknek": fogja amoveTo () és lineTo () hívásokkal meghatározott bonyolult útvonalat, és ténylegesen felrajzolja a rajzvászonra. A vonalak színét a strokeStyle szabályozza. Az eredményt

a 4.3. ábra mutatja.

4.3. ábra Rajzvászonra rajzolt rács

4. fejezet A rajzvászon ördöge . . . J 99

Page 95: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: Miért indul az x és az y 0.5-töl? Miért nem O-tól?

Válasz: Minden képpontot úgy kell elképzeln ünk, mint egy nagy négy­

zetet. A négyzet sarkait az egész számú koordináták (O, l, 2 ... ) jelképe­

zik. Ha egész számú koordináták között rajzolunk egy egy egység széles

vonalat, az a képpontnégyzet mindkét szemben levő oldalát le fogja

fedni, így az eredményként kapott vonal két képpont szélességű lesz.

Ha olyan vonalat szecetnénk rajzolni, amelyik csak egy képpont széles,

a koordinátákat a vonaira merőlegesen el kell tolnunk 0,5-tel.

Most rajzoljuk meg a vízszintes nyilat. Az azonos útvonalon levő vonalak és

görbék rajzolása ugyanazzal a színnel (vagy színátmenettel - igen, mindjárt

odaérünk) történik, mi viszont más színnel - piszkosfehér helyett feketével

- szeretnénk megrajzolni a nyílhegyet, ezért új útvonalat kell kezdenünk:

context.beginPath(); context. moveTo (O, 4 O) ;

context.lineTo(240, 40);

context.moveTo(260, 40);

context.lineTo(500, 40);

context.moveTo (495, 35);

context.lineTo(500, 40);

context.lineTo (495, 45);

A függőleges nyíl ehhez igen hasonló, mivel azonban a színe megegyezik

a vízszintes nyíl színével, nem kell másik útvonalat kezdenünk. A két nyíl­

hegy ugyanannak az útvonalnak lesz a része:

context.moveTo(60, 0);

context .lineTo (60, 153) ;

context.moveTo(60, 173);

context.lineTo(60, 375);

context.moveTo(65, 370);

context.lineTo(60, 375);

context.lineTo(55, 370);

Azt mondtam, hogy a nyilak feketék lesznek, de a strokeStyle még min­

dig piszkosfehér. (A fil1St y le és strokeStyle tulajdonságok nem állnak

vissza az alapértelmezett értékre, amikor új útvonalat kezdünk.) Ezzel nincs

semmi gond, mert most csak "ceruzavonalakat" húztunk Mielőtt azonban

100 l A rajzvászon ördöge ... 4. fejezet

Page 96: HTML5 - Az új Szabvány

ténylegesen, "tollal" megrajzolnánk az ábrát, a strokeStyle-t feketére kell állítanunk, különben a két nyíl is piszkosfehér lesz, és nemigen fogjuk látni őket. A következő sarok állítják feketére a színt, és rajzolják ki a vonalakat a rajzvásznon:

context. strokeStyle = "#OOO •;

context.stroke();

Az eredményt a 4.4. ábra mutatja.

4.4. ábra Felcím kézetlen tengelyek egy rajzvásznon

Szöveg

7.0+ 3.0+ 3.0+ 3.0+ 10.0+ 1.0+ 1.0+

• Az Internet Explorerben a támogatáshoz a külső explorercanvas könyvtár szükséges

b A Mozilla Firefax 3.0-ban a támogatáshoz egy kiegészítő (.,shim") szükséges

4. fejezet A rajzvászon ördöge ... l 101

Page 97: HTML5 - Az új Szabvány

A rajzvásznakra nem csak vonalakat, hanem szöveget is rajzolhatunk A képet

körülvevő weboldalon levő szöveggel ellentétben azonban itt nincs dobozmo­dell. Ez azt jelenti, hogy az ismerős CSS-eljárások egyike sem használható:

nincsenek úsztatott elemek, nincsenek külső és belső margók, és nincs szóha­táron automatikus sortörés. (Ezt talán nem is bánjuk.) Csak néhány betűjel­

lemzőt állíthatunk be, majd kiválaszthatunk egy pontot a rajzvásznon, és

onnan indítva kiírhatjuk a szöveget. A rajzkörnyezetben a következő betűjellemzőket használhatjuk (lásd az

"Egyszerű alakzatok" című részt a fejezet elején):

• A font értéke bármi lehet, amit egy font CSS-szabályba tennénk: betűstí­

lus, betűváltozat, betűvastagság, betűméret, vonalmagasság és betűcsalád.

• A textAlign a szöveg igazírását szabályozza. A text-align CSS­szabályhoz hasonlóan működik (de nem azonos azzal). Lehetséges érté­kei: start, end, left, right és center.

• A textBaseline a szövegnek a kezdőponthoz viszonyított helyzetét

adja meg. Lehetséges értékei: top, hanging, middle, alphabetic,

ideographic és bot tom.

A textBas e l i ne (szöveg-alapvonal) használata bonyolult, mert maguk a szö­

vegek is azok. (Na jó, nem mindegyik, de egy rajzvászonra bármilyen Unicode­

karaktert rajzolhatunk, és az Unicode már nem olyan egyszerű.) A HTML5

szabványleírása így magyarázza el a különböző szöveg-alapvonalakat:*

Az em-négyzet felső vonala (top) egy betűtípus karakterjeleinek (gliféi­

nek) nagyjából a tetején húzódik; a függő alapvonal (hanging) ott,

ahová az olyan gliféket horgonyozzák, mint a 3If karakter; a középvonal (middle) félúton található az em-négyzet teteje és alja között; az alfabe­

tikus alapvonal (alphabetic) az olyan karakterek horgonyvonalát jelzi, mint az Á, az y-, az f és az O ; az ideografikus alapvonal (ideographic) az

olyan karakterek horgonyvonalát, mint a �b. és a li ; míg az em-négyzet alsó vonala nagyjából a betűtípusok gliféinek alját jelzi. A befoglaló do­

boz alja és teteje távol is eshet ezektől az alapvonalaktól, mivel egyes ka­

rakterjelek messze túlnyúlnak az em-négyzeten (lásd a 4.5. ábrát).

• http://bit.ly/aHCdDO

102 l A rajzvászon ördöge ... 4. fejezet

Page 98: HTML5 - Az új Szabvány

kfeografikus

em-néQvzet a

A befog la ló doboz alja

4.5. ábra Szöveg-alapvonalak

Az olyan egyszerű ábécék esetében, mint az angol, nyugodtan maradhatunk

a textBaseline tulajdonság top, middle vagy bottom értékénéL Rajzoljunk is egy kis szöveget! A rajzvászon belsejébe rajzolt szöveg magá­

nak a <canvas> elemnek a betűméretét és betűstílusát örökli, de ezt felül­

bírálhatjuk, ha módosítjuk a font tulajdonság értékét a rajzkörnyezetben:

context. font= "bold 12px sans-serif" ; context.fillText( "x", 248, 43);

context.fillText( "y", 58, 165);

A tényleges szöveget a fill Text ( ) tagfüggvény rajzolja ki:

con text. font= "bold 12px sans-serif"; context.fillText( "x", 248, 43);

context.fillText("y", 58, 165);

Kérdezzük meg Leírókód professzort!

Kérdés: Megadhatok viszonyított betűrnéretet is, amikor rajzvászonra raj­zo/ok szöveget? Válasz: Igen. Mint egy oldal minden más HTML-elemének, magának

a <canvas> elemnek is van egy számított betűmérete, amely az oldal CSS-szabályain alapul. Ha a context. font tulajdonságot egy olyan relatív betűmérettel adjuk meg, mint az l. Sem vagy a 150%, a böngé­

sző ezt a <canvas> elem számított betűméretével fogja összeszorozni.

4. fejezet A rajzvászon ördöge . .. l 103

Page 99: HTML5 - Az új Szabvány

Tegyük fel, hogy a bal felső sarokba kerülő szöveg esetében azt szeretnénk, hogy a szöveg teteje y=S-nél húzódjon. Viszont lusták vagyunk, és nem akar­juk megmérni a szöveg magasságát, és kiszámítani az alapvonalat. Ehelyett beállíthatjuk a textBaseline tulajdonságot a top értékre, és átadhatjuk a szöveget befoglaló doboz bal felső sarkának koordinátáját:

context. textBaseline = "top";

context.fillText( "(O, O)", 8, 5);

Most pedig jöjjön a jobb alsó sarokba kerülő szöveg! Tegyük fel, hogy a szöveg jobb alsó sarkát a (492, 370) koordinátákra szeretnénk helyezni- csupán néhány képpontnyira a rajzvászon jobb alsó sarkától -, de megint csak nem akarjuk megmérni a szöveg magasságát vagy szélességét. Állítsuk a textAlign

tulajdonságot right ( jobbra), a textBaseli ne tulajdonságot pedig bottom

(alul) értékre, majd hívjuk meg a fillText ( ) tagfüggvényt a szöveget befog­laló doboz jobb alsó sarkának koordinátáival:

context. textAlign = "right ";

context. textBaseline = "bot tom";

context. fillText ( " ( 500, 375 ) ", 492, 370);

Az eredményt a 4.6. ábra mutatja.

(0,0)

y

4.6. ábra Felcímkézett tengelyek egy rajzvásznon

104 l A rajzvászon ördöge ...

(500,375)

4. fejezet

Page 100: HTML5 - Az új Szabvány

Hoppá! Elfelejtettük a pontokat a sarkokban! Hamarosan megtudjuk, hogyan rajzolhatunk köröket, de most csalunk egy kicsit, és négyszögekként rajzoljuk meg a pomokat (lásd az "Egyszerű alakzatok" című részt a fejezet elején):

context.fillRect(O, O, 3, 3); context.fillRect(497, 372, 3, 3);

Ennyi az egész! A végeredményt a 4.7. ábrán láthatjuk.

(0,0)

----��---------------- ·----------------------�

y

4.7. ábra Rajzvászonkoordináta-diagram egy rajzvásznon

Sz í nátmenetek

Lineáris színátmenetek 7 .0+ 3.0+

Sug_aras színátmenetek . 3.0+

3.0+ 3.0+

3.0+ 3.0+

(500 ,375)

10.0+ 1.0+

10.0+ 1.0+

• Az Internet Explorerben a támogatáshoz a külsö explorercanvas könyvtár szükséges

Andmid

1.0+

1.0+

A fejezet korábbi részében megtanulruk, hogyan rajzolharunk egyetlen szín­nel kiröltött négyszögeket (lásd az "Egyszerű alakzatok" című részt a fejezet elején), illetve egyszínű vonalakat ("Útvonalak", szintén ebben a fejezetben).

4. fejezet A rajzvászon ördöge ... J 105

Page 101: HTML5 - Az új Szabvány

A lehetőségeink azonban nem korlátozódnak egyszínű alakzatokra és vo­nalakra - színátmenetekkel (gradient) mindenféle dolgot varázsolhatunk. A 4.8. ábrán láthatunk egy példát.

A leírókód ugyanolyan, mint bármely más rajzvászon esetében:

<canvas id= •ct n width= " 300 . height= "225 "></canvas>

Először meg kell keresnünk a <canvas> elemet, és ki kell olvasnunk a rajz­környezetér:

var d_ canvas = document. getElementByid ( "d") ; var context = d_canvas. getContext ( "2d ");

4.8. ábra Balról jobbra haladó lineáris színátmenet

Ha megvan a rajzkörnyezet, nekiláthatunk meghatározni egy színátmenetet. A színátmenet egyenletes átmenetet jelent két vagy több szín között. A rajz­vászon rajzkörnyezete kétféle színátmenetet támogat:

• A createLinearGradient(xO, yO, xl, yl) az (xO, yO) pont­tól az (xl, yl) pontig tartó egyenes mentén fest.

• A createRadialGradient(xO, yO, rO, x l, yl, rl) egy két kör által meghatározott kúp mentén fest. Az első három paraméter adja meg a kezdőkört, amelynek a középpontja (xO, y O), a sugara pedig rO.

Az utolsó három paraméter a zárókört határozza meg, (x l, yl) közép­ponttal és rl sugárral.

Készítsünk lineáris színátmenetet! A színátmenetek tetszőleges méretűek lehet­nek, de ezt most a rajzvászonnal megegyezően 300 képpont szélesre vesszük:

106 l A rajzvászon ördöge ... 4. fejezet

Page 102: HTML5 - Az új Szabvány

var my_gradient = context.createLinearGradient(O, O, 300, 0);

Mivel mindkét y-érték (a második és a negyedik paraméter) O, a színátmenet balról jobbra egyenletes lesz.

Miután létrehoztunk egy színátmenet-objektumot, meghatározhatjuk a színátmenet színeit. A színátmenetek két vagy több színállomásból állnak, amelyek a színátmenet bármely pontján lehetnek. Színállomást úgy adha­tunk a színátmenethez, hogy megadjuk a helyzetét (pozícióját) az átmenet mentén. A színátmenet-pozíciók O és l között tetszőleges értéket vehetnek fel.

Határozzunk meg egy olyan színátmenetet, amely feketéből (black) fe­hérbe (white) tart:

my_gradient. addColorStop (0, "black");

my_gradient.addColorStop (l, "white");

A színátmenet meghatározásával még semmit nem rajzolunk a rajzvászonra, csupán egy objektumot hozunk létre valahol a memóriában. A színátmenet megrajzolásához a fil1St y le értékéül kell adnunk a színátmenetet, és rajzol­nunk kell egy alakzatot (például egy négyszöget) vagy egy vonalat:

context. fillStyle = my_gradient; context.fillRect(O, O, 300, 225);

4.9. ábra Balról jobbra tartó lineáris színátmenet

Tegyük fel, hogy egy olyan színátmenetet szeretnénk, amely felülről lefelé halványodik. Amikor létrehozzuk a színátmenet-objektumot, az x-értékek (az első és a harmadik paraméter) legyenek állandók, míg az y-értékek (a második és a negyedik paraméter) essenek O és a rajzvászon magassága közé:

4. fejezet A rajzvászon ördöge . . . J 107

Page 103: HTML5 - Az új Szabvány

var my _gradient � context. createLinearGradient (O, O, O, 225) ; my_gradient. addColorStop (0, "black");

my _gradient. addColorStop (l, "w hi te") ;

context. fillStyle � my _gradient;

context.fillRect(O, O, 300, 225);

Az eredményt a 4.10. ábra mutatja.

4.1 O. ábra Felülrőllefelé haladó lineáris színátmenet

Átlós színátmeneteket is létrehozhatunk. Lássunk egy példát:

var my_gradient � context. createLinearGradient (0, O, 300, 225); my_gradient.addColorStop(O, "black");

my_gradient. addColorStop (l, "white");

context. fillStyle � my_gradient;

con text. fillRect (0, O, 300, 225);

Az eredményt a 4.11. ábrán láthatjuk.

4.11. ábra Átlós lineáris színátmenet

108 l A rajzvászon ördöge ... 4. fejezet

Page 104: HTML5 - Az új Szabvány

Képek

� Cbrome_Ooera iPhone Android 7.0+ 3.0+ 3.0+ 3.0+ 10.0+ 1.0+ 1.0+

• Az Internet Explorerben a támogatáshoz a külsö explorercanvas könyvtár szükséges

A 4.12. ábrán egy macskáról készült rajzor láthatunk, amelyet az <img> elem

jelenít meg.

4.12. ábra Macska egy <img> elemben

� '· - ''

A 4.13. ábra ugyanezt a macskát mutatja, de egy rajzvászonra rajzolva .

4.13. ábra Macska egy <canvas> elemben

• ....,.._ J:

Több módja is van annak, hogy képeket rajzoljunk egy rajzvászonra:

• A drawimage (kép, dx, d y) fogja a paraméterkém áradott képet, és a rajzvászonra rajzolja. A megadott (dx, dy) koordináták a kép bal

felső sarkát jelölik. Ha a (0, 0) koordinátákat adjuk meg, a kép a rajz­

vászon bal felső sarkába kerül.

4. fejezet A rajzvászon ördöge . .. J 109

Page 105: HTML5 - Az új Szabvány

• A drawimage (kép, dx, d y, d w, dh) fogja a paraméterként át­adott képet, dw szélességűre és dh magasságúra állítja, és a rajzvászonra

rajzolja a megadott (dx, dy) koordinátákon.

• A drawimage (kép, sx, sy, sw, sh, dx, dy, dw, dh) fogja a paraméterként átadon képet, kivágja belőle az (sx, sy, sw, sh)

négyszöget, a kivágott részt d w szélességűre és dh magasságúra állítja, és

a rajzvászonra rajzolja a (dx, dy) koordinátákon.

A HTML5 szabvány leírása így magyarázza el a drawimage () paramétereit

(http://bit.ly/9WTZAp):

A forrásnégyszög az a négyszögletes terület [a forrásképen belül], amely­nek a sarkait az (sx, sy), (sx+sw, sy), (sx+sw, sy+sh) és (sx, sy+sh) pontok adják meg.

A célnégyszög az a négyszögletes terület [a rajzvásznon belül], amelynek a sarkait a (dx, d y), (dx+dw, d y), (dx+dw, dy +dh) és (dx,

dy+dh) pontok adják meg.

A fenti paramétereket a 4.14. ábra szemlélteti.

Ha képet szeretnénk rajzolni egy rajzvászonra, akkor szükségünk van egy képre. A kép lehet egy már létező <img> elem, de létrehozhatunk egy Image

objektumot is JavaScript-kód segítségéveL Mindkét esetben gondoskodnunk kell azonban arról, hogy a kép teljesen betöltődjön, mielőtt a rajzvászonra

rajzolhatnánk. Ha egy meglevő <img> elemet használunk, biztonságosan a rajzvászonra

rajzolhatjuk a window.onload esemény során:

<img id= •ca t • src= "images/ca t .png • alt=" sleeping ca t • width= "177 •

height="ll3">

< canvas id= "e" width= "177 • height= "113 "></canvas>

<script>

window. on load = function () {

var canvas = document. getElementByid ( •e ") ;

var context = canvas. getContext ( "2d ");

var ca t= document. getElementByid ("ca t");

context.drawlmage(cat, O, 0);

}; </script>

110 l A rajzvászon ördöge ... 4. fejezet

Page 106: HTML5 - Az új Szabvány

Forráskép

sy

sx Rajzvászon

dx

4.14. ábra fgy képez le egy képet a drawlmage() egy rajzvászonra

dh

Ha a képet teljes egészében JavaScript-kóddal hozzuk létre, a képet az Image.

on load esemény során rajzolhatjuk biztonságosan a rajzvászonra:

<can vas id= •e" wid th= "l 77 • height= "113 "></can vas>

<script>

var canvas = document.getElementByid ("e");

var context = canvas. getContext ("2 d");

var ca t = new Image() ;

ca t. src = "images/cat .png ";

ca t. onload = function () (

context.drawlmage(cat, O, 0); };

</script>

A drawimage ( ) tagfüggvény elhagyható harmadik és negyedik paramétere

a kép méretét szabályozza. A 4.15. ábra ugyanezt a macskarajzor mutatja, de feleakkora szélességben és magasságban, és különböző koordinátákon több­ször kirajzolva egy rajzvásznon belül.

4. fejezet A rajzvászon ördöge... l lll

Page 107: HTML5 - Az új Szabvány

A "macskamintát"

ez a parancskód állítja elő:

ca t. onload = function ()

for (varx=O, y= O;

x< 500 && y< 375;

x+=50, y+= 37) l context.drawimage(cat, x, y, 88, 56);

) ) ;

4.15. ábra Macskamintal

Ez a sok erőfeszítés felvet egy jogos kérdést: miért akarnánk egyáltalán egy rajzvászonra rajzolni egy képet? Milyen előnyei vannak ennek a bonyolultabb megoldásnak egy <img> elemmel és néhány CSS-szabállyal szemben? Még a "macskamintát

" is elő tudnánk állítani 10 egymást átfedő <img> elemmel.

A válasz röviden annyi, hogy ugyanazért teszünk ilyesmit, amiért szöveget rajzolnánk egy rajzvászonra (lásd a fejezet korábbi, "Szöveg

" című részét).

A rajzvászonkoordináta-diagramunk (lásd a fejezet korábbi, "Rajzvászon-

112 l A rajzvászon ördöge ... 4. fejezet

Page 108: HTML5 - Az új Szabvány

koordináták" című részét) szöveget, vonalakat és alakzatokat is tartalmazott, a rajzvászonra rajzolt szöveg tehát csak egy része volt egy nagyobb alkotásnak. Egy még bonyolultabb diagramon a drawimage ( ) segítségével egyszerűen feltüntethetnénk ikonokat és más képelemeket is.

Mi a helyzet az Internet Explorerrel?

A Microsoft Internet Explorer (a 8-as változattal bezárólag, amely könyvünk írásának idején a legfrissebb kiadás volt) nem támogatja a Canvas API-t, vi­szont a Microsoft saját megoldását, a VML-t igen, amely sok szempontból hasonló dolgokra képes, mint a <canvas> elem. Így született meg az excanvas.js.

Az ExplorerCanvas (http:l!code.google.comlplexplorercanvasl)- excanvas.js -egy nyílt forrású, az Apache License hatálya alá tartozó JavaScript-könytár, amely megvalósítja a Canvas API-t az Internet Explorerben. A használatához az alábbi <script> elemet kell elhelyeznünk az oldalunk elején:

<' DOCTYPE html>

<html>

<he ad>

<me ta char set= "utf-8 ">

<title>Dive Into HTML 5</title>

<!--[if IE]>

<script src= "excanvas. js"></ script>

<! [endif]-->

</head>

<body>

</body>

</html>

A<!-- [if IE)> és <! [endif]--> részek feltételes megjegyzések, amelye­ket az Internet Explorer úgy értelmez, mint egy if ( " ha") utasítást: "ha az aktuális böngésző az Internet Explorer bármelyik változata, hajtsd végre ezt a kódblokkot". Minden más böngésző HTML-megjegyzésként kezeli a teljes blokkot. Az eredmény: az Internet Explorer letölti és végrehajtja az excanvas. js parancsfájlt, a többi böngésző azonban teljesen figyelmen kívül hagyja (nem tölti le, nem hajtja végre stb.), így az oldal gyorsabban töltődik be azok­ban a böngészőkben, amelyek belső támogatást nyújtanak a Canvas API-hoz.

4. fejezet A rajzvászon ördöge ... l 113

Page 109: HTML5 - Az új Szabvány

Ha beemeltük az excanvas.js parancsfájlt az oldal <he ad> részében, mást már nem kell tennünk ahhoz, hogy képessé tegyük az Internet Explorert a rajzvászon kezelésére. Csak hozzá kell adnunk a <canvas> elemeket a le­írókódhoz, vagy dinamikusan létrehozni azokat JavaScript segítségéveL A <canvas> elemek rajzkörnyezetét a fejezet utasításait követve olvashatjuk ki, és máris rajzolhatunk alakzatokat, szöveget és mintázatokat.

Illetve ... nem egészen. Van néhány korlátozás:

• A színátmenetek (lásd a fejezet korábbi, "Színátmenetek" című részét) csak lineárisak lehetnek, mert az excanvas.js nem támogatja a sugaras színátmeneteket.

• A mintázatoknak mindkét irányban ismétlődniük kell. • A kivágható területek nem támogatottak. • A körvonalak méretezése helytelen lesz, ha nem egységesen méretezünk. • Az excanvas.js lassú. Ez persze senkit nem érhet nagy meglepetésként,

hiszen az Internet Explorer JavaScript-feldolgozója eleve lassabb más böngészőkénéL Ha bonyolult alakzatokat kezdünk rajzolni egy olyan JavaScript-könyvtáron keresztül, amely az utasításokat egy teljesen más technológiára fordítja le, a feldolgozás lelassul. A sebességcsökkenést nem fogjuk észrevenni, ha olyan egyszerű műveleteket végzünk, mint néhány vonal rajzolása vagy egy kép transzformáció ja, de azonnal feltűnik majd, ha rajzvászon alapú animációba vagy más őrült dolgokba kezdünk.

Az excanvas.js használatának van még egy hátulütője, amibe akkor szaladtam bele, amikor elkészítettem ennek a fejezetnek a példáit. Az ExplorerCanvas automatikusan előkészíti a saját ál-rajzfelületét, amikor beemeljük az excanvas.js parancsfájlt egy HTML-oldalba, ez azonban nem jelenti azt, hogy az Internet Explorer is rögtön használatba tudja venni. Bizonyos esetekben megtörtén­het, hogy az ál-rajzfelület majdnem használatra kész, de nem teljesen. Ennek az állapotnak az elsődleges jele az, hogy az Internet Explorer panaszkodik,

hogy "az objektum nem támogatja ezt a tulajdonságot vagy tagfüggvényt", amikor csinálni próbálunk valamit egy <canvas> elemmel, például meg­próbáljuk kiolvasni a rajzkörnyezetét.

A legegyszerűbb megoldás erre a problémára az, ha minden rajzvászon­

műveletet elhalasztunk az on load esemény utánra. A betöltés eltarthat egy ideig - például ha az oldalon sok kép vagy videó található, az késlelteti az

114 l A rajzvászon ördöge ... 4. fejezet

Page 110: HTML5 - Az új Szabvány

onload esemény bekövetkezését- de időt ad az ExplorerCanvasnak, hogy felkészüljön a varázslatra.

Egy teljes példa

A Halma egy több évszázados táblajáték, amelynek számos változata létezik. Ebben a példában a Halmának egy egyszemélyes változatát készítettem el,

kilenc "bábuval" egy 9 x 9-es táblán. A játék kezdetén a bábuk egy 3 x 3-as négyzetet formáznak a tábla bal alsó sarkában. A játék célja az, hogy addig mozgassuk a bábukat, amíg a tábla jobb felső sarkában nem alkotnak egy 3

x 3-as négyzetet, méghozzá a lehető legkevesebb lépéssel. A Halmában kétféle lépés megengedett:

• Fogunk egy bábut, és valamelyik üres szomszédos mezőre lépünk vele. Az "üres mező" azt jelenti, hogy a mezőben jelenleg nem tartózkodik bábu. A "szomszédos mező" olyan mező, amely közvetlenül a bábu je­lenlegi helye felett vagy alatt, attól közvetlenül jobbra vagy balra, közvet­

lenül átlósan balra felfelé vagy lefelé, illetve közvetlenül átlósan jobbra felfelé vagy lefelé található. (A tábla egyik oldala nem folytatódik a má­sik oldalon, tehát a bal szélső oszlopban levő bábuk nem mozoghatnak

balra, illetve átlósan balra felfelé vagy lefelé, a jobb szélső oszlopban levő

bábuk pedig nem mozoghatnak jobbra, illetve átlósan jobbra felfelé vagy lefelé.)

• Fogunk egy bábut, és átugrunk vele egy vagy- ha tehetjük- több szom­

szédos bábut. Tehát ha átugrunk egy szomszédos bábut, majd egy mási­kat, amely az új pozícióval szomszédos mezőben áll, az egyetlen lépésnek

számít. Sőt, tetszőleges alkalommal ugorhatunk egymás után, az még mindig ugyanaz a lépés lesz. (Mivel a cél a lehető legkevesebb lépésből megoldani a feladatot, a Halmában akkor játszunk jól, ha egy-egy mezőt

kihagyva hosszú láncot építünk a bábukból, hogy a többi bábu minél többet átugorhasson közülük.)

A játékról a 4.16. ábrán láthatunk egy képernyőfelvételt. Az Interneten (http:/1 diveintohtml5.orglexampleslcanvas-halma.html) is játszhatunk vele, ha meg

szecetnénk vizsgálni a böngészőnk fejlesztőeszközeiveL

4. fejezet A rajzvászon ördöge ... l 115

Page 111: HTML5 - Az új Szabvány

De hogyan működik a játék? Örülök a kérdésnek. Itt nem fogom az egész kódot bemutatni (de ha kíváncsiak vagyunk rá, megtalálhatjuk a http:/1 diveintohtml5.orglexampleslhalmajs címen). Magának a játékot vezérlő kód­nak a nagyját kihagyom, de kiemelnék néhány olyan kódrészt, amely a rajz­vászonra rajzolással kapcsolatos, illetve a <canvas> elemen végrehajtott egérkattintásokat kezeli.

o o o o o o o o o

Lépés: O l

4.16. ábra A Halmajáték kezdőállása

A játékot az oldal betöltése közben készítjük elő, a <canvas> elem méretei­nek beállításával, illetve egy a rajzvászon rajzkörnyezetére mutató hivatkozás elraktározásával:

gCanvasElement. wid th= kPixelWidth;

gCanvasElement. height = kPixelHeight;

gDrawingContext = gCanvasElement. getContext ("2 d") ;

116 l A rajzvászon ördöge ... 4. fejezet

Page 112: HTML5 - Az új Szabvány

Ezt követően valami olyasmit csinálunk, amivel eddig még nem találkoz­tunk: hozzáadunk egy eseménykezelőt a <canvas> elemhez, amellyel a kat­timási eseményeket (click) figyeljük:

gCanvasElement. addEventListener ( "click", halmaOnClick, false) ;

A halmaOnClick() függvény akkor hívódik meg, amikor a felhasználó valahol a rajzvászonra kattint. A függvény argumentuma egy MouseEvent

(egéresemény) objektum, amely megadja, hogy a felhasználó hol kattintott:

function halmaOnClick (e) { var cell= getCursorPosition (e);

l l a többi csak a játék vezérlőlogikája

for (var i=O; i<gNumPieces; i++) { if ( (gPieces [i]. row == cell. row) &&

(gPieces [i] . column== cell. column))

clickOnPiece(i);

return;

J

J clickOnEmptyCell(cell);

A következő lépés, hogy fogjuk a MouseEvent objektumot, és kiszámítjuk, hogy a felhasználó a Halma-tábla melyik mezőjére kattintott. A Halma-tábla elfoglalja az egész rajzvászont, tehát minden kattintás a tábla valamelyik ré­szére történik - csak ki kell derítenünk, hogy melyikre. Ez nem egyszerű, mert az egéreseményeket szinte minden böngészőben másképp valósítot­ták meg:

function getCursorPosition (e)

var x;

var y;

if (e.pageX ll e.pageY)

x= e.pageX;

y= e.pageY;

) else { x= e. clientX + document .body. scrollLeft +

document.documentElement.scrollLeft;

y= e. clientY + document .body. scrollTop +

document.documentElement.scrollTop;

4. fejezet A rajzvászon ördöge ... l 117

Page 113: HTML5 - Az új Szabvány

Itt még a dokumentumhoz (vagyis a teljes HTML-oldalhoz) viszonyított x

és y koordinátáink vannak, de mi a rajzvászonhoz viszonyított koordinátákat szeretnénk. Így juthatunk hozzájuk:

x-= gCanvasElement. offsetLeft;

y-= gCanvasElement. offsetTop;

Az x és y koordinátáink most már a rajzvászonhoz viszonyítottak (lásd a "Rajzvászon-koordináták" című részt a fejezet korábbi részében), vagyis ha most x = O és y = 0, akkor tudjuk, hogy a felhasználó a rajzvászon bal felső sarkában található képpontra kattintott.

Innen már kiszámíthatjuk, hogy a felhasználó melyik Halma-mezőre kat­tintott, majd ennek megfelelően cselekedhetünk:

var cell= new Cell (Ma th. floor (y/kPieceHeight),

Math.floor(x/kPieceWidth));

return cell;

Húha! Az egéreseményekkel nem könnyü bánni! Viszont ugyanezt a logikát (sőt akár pontosan ezt a kódot) alkalmazhatjuk minden rajzvászon alapú alkalmazásban. Jegyezzük meg: egérkattintás->dokumentumhoz viszonyí­tott koordináták->rajzvászonhoz viszonyított koordináták->alkalmazás­függő kód.

Oké, akkor most nézzük a fő rajzolóeljárást. Mivel a grafika nagyon egy­szerű, úgy döntöttem, hogy minden lépés után törlöm és újrarajzolom az egész táblát, de ez nem feltétlenül szükséges. A rajzvászon rajzkörnyezete megőrzi, amit korábban a vászonra rajzoltunk, még akkor is, ha a felhasználó kigördíti a rajzvásznat az ablakból, vagy egy másik böngészőlapra vált, aztán később visszatér a játékhoz. Ha bonyolultabb grafikájú rajzvászon alapú játé­kot (például valamilyen ügyességi játékot) fejlesztünk, növelhetjük a sebessé­gét, ha nyomon követjük a rajzvászon "piszkos" mezőit, és csak azokat rajzol­juk újra - ez azonban túlmutat ennek a könyvnek a keretein. Íme a táblát tisztára törlő kód:

gDrawingContext.clearRect(O, O, kPixelWidth, kPixelHeight);

A táblarajzoló eljárásnak már ismerősnek kell lennie: nagyon hasonlít ahhoz, ahogy a rajzvászonkoordináta-diagramot rajzoltuk meg (lásd a fejezet "Rajz­vászon-koordináták" címü részét):

118 l A rajzvászon ördöge ... 4. fejezet

Page 114: HTML5 - Az új Szabvány

gDrawingContext.beginPath();

l* függőleges vonalak* l for (var x= 0; x<= kPixelWidth; x+= kPieceWidth)

gDrawingContext.moveTo (0.5 +x, 0);

gDrawingContext .lineTo (0. 5+ x, kPixelHeight);

l* vizszintes vonalak* l for (var y= 0; y<= kPixelHeight; y+= kPieceHeight)

gDrawingContext .moveTo (O, O. 5 + y) ;

gDrawingContext .lineTo ( kPixelWidth, O. 5 + y) ;

l* Raj zoljuk ki! *l

gDrawingContext. strokeStyle = "#ccc ";

gDrawingContext.stroke();

Az igazi móka akkor kezdődik, amikor nekilátunk megrajzolni az egyes bá­bukat. A bábukat egy-egy kör jelképezi - ilyesmit sem rajzoltunk még. Továbbá, ha a felhasználó kiválaszt egy bábut, amellyel lépni szeretne, ezt a bábut egy kitöltött körrel szeretnénk jelölni. Az alábbiakban a p argumen­

tum jelképezi a bábut, a bábu jelenlegi helyét a táblán pedig ennek a row (sor) és column (oszlop) tulajdonságai. A (column, row) koordinátákat né­

hány, csak ebben a játékban érvényes állandó segítségével lefordítjuk rajzvá­szonhoz viszonyított (x, y) koordinátákra, majd rajzolunk egy kört, és (ha

a felhasználó kiválasztotta a bábut) kitöltjük azt egy színnel:

function drawPiece (p, selected)

var column= p.column;

var row =p. row;

var x= (column* kPieceWidth) + (kPieceWidthl2);

var y= (row * kPieceHeight) + (kPieceHeightl2);

var ractius = (kPieceWidth/2) - (kPieceWidthllO);

Itt ér véget a játék programlogikája. Most már megvannak a rajzvászonhoz

viszonyított (x, y) koordinátáink, amelyek megadják a kirajzolni kívánt

kör középpontját. A Canvas API-ban nincs circle () tagfüggvény, de arc()

tagfüggvény igen- a kör (circle) pedig nem más, rnint egy önmagába záródó ív (arc), nem igaz? Mértan alapfokon. Az arc() tagfüggvénynek egy (x, y)

középpontot, egy sugarat, egy kezdő- és zárószöget (radiánban), valamint

egy irányjelzőt (false, ha az óramutató járásával egyező, és true, ha az

4. fejezet A rajzvászon ördöge ... l 119

Page 115: HTML5 - Az új Szabvány

óramutató járásával ellentétes) kell átadnunk. A radiánszámításhoz a Java­Scriptbe beépített Ma th modult használhatjuk:

gDrawingContext.beginPath();

gDrawingContext.arc(x, y, radius, O, Math.PI*2, false);

gDrawingContext.closePath();

Várjunk csak! Semmi nem rajzolódik ki! A moveTo () és l i ne To () tagfügg­vényekhez hasonlóan az arc () is "ceruza-tagfüggvény" (lásd a fejezet "Útvo­nalak" című részét): ahhoz, hogy a kört valóban kirajzoljuk, be kell állíta­nunk a körvonalstílust (strokeStyle), és meg kell hívnunk a stroke() tagfüggvényt, hogy "tollal" kihúzzuk a ceruzavonalakat:

gDrawingContext. strokeStyle = "#OOO"; gDrawingContext.stroke();

Mi a helyzet akkor, ha kiválasztott báburól van szó? Nos, ekkor újrahaszno­síthatjuk azt az útvonalat, amelyet a bábu körvonalának megrajzolására hoz­tunk létre, és kirölthetjük egy színnel:

if (selected) { gDrawingContext. fillStyle = "#OOO •;

gDrawingContext.fill();

l

Lényegében ennyi az egész. A program többi része a játékot vezérlő logika: a szabályos és szabálytalan lépések megkülönböztetése, a lépések számának nyomon követése, a játék végének megállapítása. Kilenc körrel, néhány egye­nes vonallal és egy onclick eseménykezelővel megalkottunk egy teljes játé­kot egy <canvas> elemben! Éljen!

További olvasmányok

• Canvas-ranfolyam (https:lldeveloper. mozilla. orglen!Canvas_tutorial) a Mozilla Developer Center webhelyén

• Mihai Sucan: "HTML5 canvas - the basics" (http:!!dev.opera.com/ articles/view!html-5-canvas-the-basics/)

• Canvas Dernos (http:!!www.canvasdemos.com}: bemutatók, eszközök és oktatóanyagok a HTML <canvas> eleméhez

• "The canvas element" (http:llbit.lyi9]Hz0j) a HTML5 szabványterve­zetében

120 l A rajzvászon ördöge ... 4. fejezet

Page 116: HTML5 - Az új Szabvány

5. fejezet

Videó a Weben

Ugorjunk fejest!

Bárki, aki ellátogatott a YouTube.com oldalára az elmúlt négy évben, tudja, hogy a weboldalakba videókat is beágyazhatunk A HTMLS előtt azonban

ennek nem volt szabványokon alapuló módja. Lényegében minden videó,

amit valaha láttunk "a Weben", egy külső bővítmény (plug-in) - esetleg

a QuickTime, a RealPlayer vagy a Flash - segítségével jutott el hozzánk. (A YouTube a Flash-t használja.) Ezek a bővítmények elég jól beépülnek a böngészőbe, ezért nem is nagyon vesszük észre, amikor használjuk őket -legalábbis amíg egy olyan rendszeren nem próbálunk megtekinteni egy videót, amelyik nem támogatja az adott bővítményt.

A HTMLS ezzel szemben szabványos módszert határoz meg a videók weboldalakba ágyazására: a <video> elem használatár. A <video> elem

támogatása még képlékeny - ami udvarias megfogalmazása annak, hogy egyelőre nem működik (legalábbis nem mindenhol). De ne essünk kétségbe! Bőségesen van alternatíva, alapértelmezés és kerülőút. Az 5.1. táblázat megmutatja, hogy könyvünk írásának idején mely böngészők támogatták a <video> elemet .

./ ./ ./ ./ ./ ./

Magának a <video> elemnek a támogatása azonban csak egy kis része a történetnek. Mindazonáltal, mielőtt a HTMLS-videókról beszélhetnénk, többet kell tudnunk a videókról úgy általában. (Ha ezen a téren kielégítőek az ismereteink, nyugodtan ugorjunk az "Ami a Weben működik" című részre.)

5. fejezet Videó a Weben l 121

Page 117: HTML5 - Az új Szabvány

Videatáralók

A videofájlokra általában úgy szoktunk gondolni, hogy "A VI-fájlok" vagy

"MP4-fájlok", a valóságban azonban az "AVI" és az "MP4" csupán tároló­formátumok. Ahogy egy ZIP-fájl is bármilyen típusú fájlt tartalmazhat, a videotároló-formátumok is csak azt határozzák meg, hogy miként kell bennük tárolni adatokat - azt viszont nem, hogy ezek milyen fajta adatok lehetnek. (A dolog persze kicsit bonyolultabb ennél, mivel nem minden video-adatfolyam tehető bármilyen formátumú tárolóba, de ezzel most ne törődjünk.)

A vicleofájlok általában több sávból (track) állnak: egy videosávból (hang nélkül), és egy vagy több audiosávból (képet nem tartalmazó hangsávból). A sávok jellemzően össze vannak kapcsolva: a hangsávok például jelzőket tartalmaznak, amelyek a kép és a hang összehangolását segítik. Az egyes sá­vokhoz metaadatok is rendelhetők, például a kép oldalaránya vagy a hangsáv nyelve. A tárolóknak szintén lehetnek metaadataik, például a videó címe, a videó "borítóképe", (tv-műsorok esetében) az epizód sorszáma, és így tovább.

Rengeteg vicleotároló-formátum létezik. A legnépszerűbbek közé tartoz­nak például az alábbiak: MPEG-4

Az MPEG-4 fájlok kiterjesztése általában .mp4 vagy .m4v. Az MPEG-4 tároló az Apple régebbi QuickTime tárolóformátumán (.mov) alapul. Az Apple webhelyén megtekinthető filmelőzetesek még mindig a régi QuickTime formátumot használják, az iTunes-ról rendelt mozifilme­ket azonban MPEG-4 tárolóha csomagolva kapjuk meg.

Flash Video A Flash-videofájlok kiterjesztése általában .flv. A Flash-videók készí­tésére - nem meglepő módon - az Adobe Flash programot használ­ják. A Flash 9.0.60.184 (más néven: Flash Player 9 Update 3) előtt ez volt az egyetlen tárolóformátum, amelyet a Flash támogatott, a Flash újabb változatai azonban már az MPEG-4 tárolót is ismerik.

O gg Az Ogg-fájlok kiterjesztése általában .ogv. Az Ogg nyílt szabvány, amely támogatja a nyílt forrást, és nem veri bilincsbe semmilyen szabadalom. A Firefox 3.5, a Chrome 4 és az Opera 10.5 beépített támogatást kínál hozzá, tehát az Ogg tárolóformátumhoz, az Ogg­videókhoz ("Theora") és az Ogg-hangfájlokhoz ("Vorbis") ezekben

122 l Videó a Weben 5. fejezet

Page 118: HTML5 - Az új Szabvány

a böngészőkben nincs szükség külön az adott rendszerre Írt bővítmé­nyekre. Az asztali operációs rendszerek közül minden fontosabb Linux-terjesztés beépített támogatást nyújt az Ogg-hoz, de Mac-en és Windowson is használható, ha telepítjük a QuickTime-összetevőket (Mac), illetve DirectShow-szűrőket (Windows). Az Ogg-fájlok min­

den rendszeren lejátszhatók a kitűnő VLC (http:llwww.videolan.org/ vlcl) segítségével is.

WebM A WebM-fájlok kiterjesztése .webm. A WebM egy új tárolóformátum, amely a felépítése szempontjából nagyon hasonlít a Marroska nevű formátumra. A WebM-et a 2010-es Google 1/0-n jelentették be, és kizárólagosan a VP8 videokodekkel, illetve a Yorbis audiokodekkel való használatra tervezték. (Ezekről hamarosan bővebben is szót ej­tünk.) A Chromium, a Google Chrome, a Mozilla Firefox és az Opera következő változatai beépítve, az adott rendszerre Írt bővítmények nél­

kül fogják támogarni. Az Adobe ezenkívül bejelentette, hogy a Flash következő változata is támogatja majd a WebM-videókat.

Audio Video Interleave Az Audio Vicleo Interleave-fájlok kiterjesztése általában .avi. Az AVI tárolóformátumot a Microsoft fejlesztette ki egy boldogabb időben, amikor már az is csodaszámba ment, hogy a számítógép egyáltalán

képes vicleót lejátszani. Az AVI hivatalosan nem támogatja az újabb tárolóformátumok számos szolgáltatását, például hivatalosan semmi­lyen video-metaadatot nem engedélyez, sőt a ma használatban levő

modern video- és audiokodekek többségének használatát sem. Az idők során a különböző cégek - egymással általában össze nem férő módon - megpróbálták kibővíteni, hogy támogassa ezt vagy azt, és az AVI máig az alapértelmezett tárolóformátuma az olyan népszerű kódolóprogramoknak, mint az MEncoder (http://www. mplayerhq. hul DOCS/HTML/enlencoding-guide.html).

Videokodekek

Amikor azt mondjuk, hogy "megnézünk egy videót", valószínűleg egy video­adatfolyam és egy audio-adatfolyam együttesére gondolunk, de nem két

5. fejezet Videó a Weben l 123

Page 119: HTML5 - Az új Szabvány

külön fájlunk van, csak "egy videónk ", ami lehet egy A VI-fájl vagy- mond­juk- egy MP4-fájl. Ahogy az előző részben említettem, ezek csupán tároló­formátumok, mint a ZIP, amelyben többféle fájl is lehet. A tárolóformátum szabja meg, hogy a video- és audio-adatfolyamokat hogyan lehet egyetlen fájlban tárolni.

Amikor "megnézünk egy videót", a videolejátszó egyszerre több dolgot is csinál:

• Értelmezi a tárolóformátumot, hogy kiderítse, milyen video- és hang­sávok állnak rendelkezésre, és azok hogyan tárolódnak a fájlon belül, hogy képes legyen megtalálni a következőként visszafejtendő adatokat.

• Visszafejti a videofolyamot, és megjeleníti a képek sorozatát a képernyőn. • Visszafejti az audiofolyamot, és a hangot a hangszórókra küldi.

A videokodek az az algoritmus, amellyel a vicleofolyamot kódolták - vagyis azt adja meg, hogy miként kell végrehajtani a 2. lépést a fentiek közül. (A "kodek " szó a "kódoló" és "dekódoló" kifejezések kombinációjából szüle­tett.) A videolejátszónk a videokodeknek megfelelőerr visszafejti ("dekódolja") a videofolyamot, majd megjeleníti a képek sorozatát (a "képkockákat", frame) a képernyőn. A legtöbb modern videokodek mindenféle trükkel igyekszik csökkenteni az egymás utáni képkockák megjelenítéséhez szükséges informá­ciómennyiséget, például ahelyett, hogy minden egyes képkockát tároina (mintha képernyő-pillanatfelvételek lennének), csak a képkockák közötti kü­lönbségeket jegyzi meg. A legtöbb videó valójában nem változik túl sokat egyik képkockáról a másikra, ezért ez a megoldás nagyfokú tömörítést tesz lehetövé, ami kisebb fájiméretet eredményez.

Léteznek veszteséges és veszteségmentes videokodekek is. A veszteségmen­tes videók túlságosan nagyok ahhoz, hogy hasznukat vehessük a Weben, ezért a veszteséges kodekekre fogunk összpontosítani. Amikor veszteséges video­kodeket használunk, a kódolás során végérvényesen elveszítünk bizonyos in­formációkat. Ugyanúgy, mint amikor egy audiokazettát másolgatunk, min­den alkalommal, amikor kódoljuk a videofolyamot, új abb és újabb részleteket veszítünk el a forrásvideóbóL Így a minőség egyre romlik, csak ami a hang­kazettáknál "sziszegésként" jelentkezik, az a többször újrakódolt videóknál

"kockásodást" eredményez, különösen a sok mozgást tartalmazó jelenetek­ben. (Ez valójában akkor is megeshet, ha közvetlenül az eredeti forrásból

124 l Videó a Weben 5. fejezet

Page 120: HTML5 - Az új Szabvány

kódolunk, amennyiben gyenge minőségű videokodeket használunk, vagy rossz paramétereket adunk meg a számára.) Másrészt viszont a veszteséges videokodekek döbbenetes mértékű tömörítést tesznek lehetővé, és sok kodek

"csalni" is képes: lejátszás közben különféle módszerekkel elfedi a kockásodást,

hogy az az emberi szemnek kevésbé legyen észrevehető. Videokodekből tengernyi létezik, a számunkra legfontosabb három azon­

ban a H.264, a Theora és a VP8.

H.264

A H.264 kodek (http:!len.wikipedia.orglwiki/H264) többféle néven is isme­retes: "MPEG-4 part 10", "MPEG-4 AVC", "MPEG-4 Advanced Vicleo Coding". A H.264-et az MPEG-csoport fejlesztette ki, és 2003-ban szabvá­nyosította. Célja, hogy egyetlen kodeket biztosítson az alacsony sávszélességű és alacsony CPU-teljesítményű eszközök (például a mobiltelefonok), a nagy sávszélességű és nagy CPU-teljesítményű eszközök (a modern asztali számító­gépek) és a kettő között található minden más eszköz számára. Ennek érde­

kében a H.264 szabványt "profilokra" bontották, amelyek mindegyike más­

más mértékben áldozza fel a minőséget a fájlméret oltárán. A magasabb profilokban több kiegészítő lehetőség érhető el, jobb képminőséget kapunk,

miközben kisebb fájlmérettel dolgozunk, így viszont tovább tart a kódolás, a valós idejű visszafejtéshez pedig nagyobb CPU-teljesítmény szükséges.

Talán így jobban el tudjuk képzelni a profilkínálator: az Apple iPhone-ja

a Baseline (Alap) profilt támogatja, az AppleT V set-top box a Baseline és

Main (Fő) profilokat, az asztali PC-ken futó Adobe Flash pedig a Baseline, Main és High (Magas) profilokat. A YouTube (amelynek a tulajdonosa a Google, a szerző munkaadója) ma már a H.264 segítségével kódolja az Adobe Flash-en keresztül lejátszható csúcsminőségű videókat, ugyanakkor mobileszközökhöz- köztük az Apple i Phone-hoz és a Google Android nevű mobil operációs rendszerét futtató telefonokhoz - is kínál H.264 kódolású videókat. A H.264 ezenkívül egyike a Blu-ray szabvány által megkövetelt videokodekeknek is. Az ilyen kódolású Blu-ray lemezek általában a High profilt használják.

Azok a nem számítógépes eszközök, amelyek képesek H.264-videókat le­

játszani (beleértve az i Phone-okat és az önálló B lu-ray lejátszókat) a dekódolás t

5. fejezet Videó a Weben l 125

Page 121: HTML5 - Az új Szabvány

egy kifejezetten erre a célra szolgáló lapka segítségével végzik, mivel a köz­ponti feldolgozóegységük teljesítménye messze elmarad arról, ami a videók

valós idejű visszafejtéséhez szükséges. Sok asztali rendszerhez készült grafikus kártya ugyancsak hardveres támogatást nyújt a H.264 visszafejréséhez. H.264-kódolóból több, egymással versengő változar létezik, köztük a nyílt forrású x 264 könyvtár. A H.264 szabványt szabadalrnak kötik; felhasználási engedé­lyeit az MPEG LA csoport kezeli. H. 264 kódolású vicleót a legtöbb népszerű tárolóformátumba beágyazharunk (lásd a "Videorárolók" című részt a fejezet elején), többek között az MP4-be (ezt elsősorban az Apple iT unes boltja hasz­nálja) és az MKV-ba (ez elsősorban a lelkes vicleoamatőrök választása).

Theora

A Theora (http:llen.wikipedia.orglwiki/7heora) a VP3 kodekből fejlődött ki, és azóta a Xiph.org Foundation fejleszti. A Theora jogdíjmentes kodek, ame­lyet nem köt semmilyen ismerr szabadalom az eredeti VP3-szabadalmakon kívül, amelyek szintén jogdíjmentesen felhasználhatók. Bár a szabvány 2004 óra "fagyasztott" állaporban van, a Theora projekt (amely egy nyílt forrású referencia-kódolóból és -dekódoló ból áll) csak 200 8 novemberében jelentette meg az 1.0-s változatot, és 2009 szeptemberében az 1.1-esr.

A Theora-videók bármilyen tárolóformátumba beágyazhatók, bár a leg­gyakrabban Ogg tárolókban szakrak előfordulni. Minden fonrosabb Linux­terjeszrés beépítve támogatja a Theorát, a Mozilla Firefax 3.5 pedig ugyan­csak natív támogatást nyújt az Ogg-rárolóban elhelyezett Theora-videókhoz.

"Natív" alatt itt azt értem, hogy "minden platforrnon elérhető platformfüggő bővítmény nélkül". A Theora-videók Windowsan és Mac OS X-en is lejársz­harók, ha telepítettük a Xiph.org nyílt forrású dekódoló szofrverér.

V P 8

A VP8 (http://en.wikipedia.orglwiki/VPB) egy másik videokodek az On2-ról, tehát ugyanarról a vállalatról, amelyik erederileg a VP3-ar is készítette (ebből lett később a Theora). A VP8 a minőségér tekintve hasonló a H.264 Baseline kódoláshoz, de rengeteg teret ad a jövőbeli továbbfejlesztésnek

126 l Videó a Weben 5. fejezet

Page 122: HTML5 - Az új Szabvány

2010-ben a Google megszerezre az On2-t, és közzétette a videokodek le­írását, valamint egy nyílt forrású mintakódolót és -dekódolót. Ezzel párhu­zamosan a Google "megnyitotta" az On2 által a VP8-ra benyújtott összes szabadaimat is, és a felhasználásukat jogdíjmentessé tette. (A szabadalrnak esetében ennél többet nem is várhatunk, mivel a nyílttá válásuk után nem jelentherök be újra vagy vonhatók vissza. Ahhoz, hogy támogassák a nyílt forrású fejlesztést, jogdíjmentessé kell tenni őket, így bárki felhasználhatja a szabadalrnak által lefedett technológiákat anélkül, hogy fizetnie kellene ér­

tük, vagy engedélyhez kellene folyamodnia.) 2010. május 19. óta a VP8 jogdíj­mentes, modern kodek, amelyet nem köt semmilyen ismert szabadalom az On2 (most már a Google) által korábban jogdíjmentessé tett szabadalmakon kívül.

Audiokodekek

Hacsak nem ragaszkodunk az 1927 előtt készült filmekhez, a videóinkban biztosan szerernénk hangsávot is. A videokodekekhez hasonlóan az audio­kodekek is kódoló algoritmusok, csak éppen ezek hang-adarfolyamok kódo­lására szolgálnak. Ahogy a videokodekekből, úgy az audiokodekekből is lé­teznek veszteségesek és veszteségmentesek, és mint a veszteségmentes videók, a veszteségmentes audiofájlok is túl nagyok a webes felhasználáshoz, ezért a veszteséges audiokodekekre fogunk összpontosítani.

A kört valójában még tovább szűkíthetjük, mert a veszteséges audio­kodekeknek különböző csoportjai léteznek. Hangot sok olyan helyen is alkal­maznak, ahol nincs kép (például telefonálásnál), és audiokodekek egész sorát hangolták kifejezetten beszéd kódolására. Ezekkel a kodekekkel nem CD-kről fogunk zenét lelopni, mivel az eredmény úgy hangzana, mintha egy négyéves gyerek énekelne egy hangtölcsérbe, egy Asterisk PBX-ben azonban igenis ezt fogjuk használni, mert a sávszélesség nagy kincs, ezek a kodekek pedig az emberi beszédet annak a mérernek a töredékére képesek összenyomni, amit egy általános célú kodekkel elérhetünk. Mindazonáltal a böngészők és külső bővítmények támogatásának hiányában a beszédre optimalizált audiokodekek soha nem terjedtek el igazán a Weben, ezért inkább az általános célú veszte­séges audiokodekeket fogjuk az előtérbe helyezni.

Ahogy a fejezet "Videokodekek" dm ű részében említettem, amikor "videót nézünk", a számítógépünk több dolgot csinál egyszerre:

5. fejezet Videó a Weben l 127

Page 123: HTML5 - Az új Szabvány

l. Értelmezi a tárolóformátumot. 2. Visszafejti a videofolyamot. 3. Visszafejti az audiofolyamot, és a hangot a hangszórókra küldi.

Az audiokodek a 3. lépés végrehajtásának mikéntjét írja le: azt, hogy mi­ként lehet visszafejteni az audiofolyamot, és digitális hullámformává alakí­tani azt, amit aztán a hangszórók hanggá alakítanak. A videokodekhez ha­sonlóan az audiokodekek is mindenféle trükkel igyekeznek csökkenteni az audiofolyamban tárolt információmennyiséget. Mivel pedig most vesztesé­ges audiokodekekről beszélünk, ez azt jelenti, hogy a hang rögzítésből, kó­dolásból, visszafejtésből és lejátszásból álló életciklusa során információt veszítünk. A különböző audiokodekek más-más információkat dobnak el, de mindnek ugyanaz a célja: becsapni a fülünket, hogy ne vegyük észre a hiányzó hangokat.

A hang esetében egy olyan fogalmat is meg kell ismernünk, ami a videónál nem létezik: ez a csatorna. A hangot a hangszórókra küldjük, igaz? Nos, hány hangszórónk is van? Ha a számítógépünk előtt ülünk, valószínűleg kettő: egy a bal, egy pedig a jobb oldalunkon. Az én asztali rendszeremen három működik: a bal, a jobb és még egy hangszóró a padlón. Az úgynevezett "surround" (tér­hatású) rendszerek hat vagy még több hangszóróval is rendelkezhetnek, amelye­ket a szoba adott pontjain keU elhelyeznünk Mindegyik hangszóró egy bizo­nyos csatorna hangját kapja meg az eredeti felvételbőL A térhatású hang elmélete szerint a hat hangszóró között ülünk, így szó szerint hat külön hangcsatorna hangja vesz körül minket, és az agyunk úgy rakja össze ezeket, hogy úgy érez­zük, mi is részesei vagyunk az eseményeknek. És hogy tényleg működik-e? Sokmilliárdos ipar épült rá- a befektetők nyilván úgy gondolják, hogy igen.

A legtöbb általános célú audiokodek két hangcsatornát képes kezelni: a rögzítés során bal és jobb csatornára bontja a hangot; kódoláskor mindkettőt ugyanabba az audiofolyamba menti; visszafejtéskor pedig mindkét csatornát dekódolja, és a megfelelő hangszóróra küldi. Egyes audiokodekek kettőnél több csatornát is tudnak kezelni, és nyomon követik, hogy melyik csatorna melyik, így a lejátszó a megfelelő hangokat küldheti az egyes hangszórókra.

Rengeteg audiokodek létezik. Ugyanezt mondtam volna a videokodekekről is? Felejtsük el. Audiokodekből sokkal, de sokkal több van - a Weben azon­ban igazán csak három számít: az MP3, az AAC és a V orbis.

128 l Videó a Weben 5. fejezet

Page 124: HTML5 - Az új Szabvány

MPEG-1 Audio Layer 3

Az MPEG-1 Audio Layer 3 (http:llen.wikipedia.orglwiki/MPEG-l_Audio_ Layer_3) kodeket közönségesen csak "MP3"-ként ismerjük. Ha még nem

hallottunk az MP3-ról, akkor nem tudom, mit is mondjak. A T escóban lehet kapni ilyen hordozható zenelejátszókat, amiket úgy hívnak, hogy "MP3-

lejátszó". A Tescóban. Na mindegy ... Az MP3-fájlok legfeljebb két hangcsatornát tartalmazhatnak, viszont

különféle bitsebességgel (bitrátával) kódolhatók: 64 kbps, 128 kbps, 192

kbps, és így tovább, 32 és 320 kbps (kilobit/másodperc) között. A maga­sabb bitsebesség nagyobb fájlméretet, de jobb hangminőséget jelent, bár a

minőség nem egyenesen arányos a bitsebességgeL (A 128 kbps bitsebességű fájlok kétszer olyan jól szólnak, mint a 64 kbps bitsebességűek, a 256 kbps azonban nincs kétszer olyan jó, mint a 128 kbps.) Ezen felül az MP3 for­

mátum (amelyet 1991-ben szabványosítottak), változó bitsebességű kódolást is lehetövé tesz, ami azt jelenti, hogy a kódolt adatfolyam egyes részei erő­sebben, míg más részei kevésbé tömörítettek. Az egyes hangok közötti

csend például nagyon alacsony bitrátával is kódolható, hogy aztán a bitse­besség egy pillanattal később, amikor több hangszer szólaltat meg egy bo­nyolult akkordot, megugorjon. Az MP3-fájlok ugyanakkor állandó bitse­

bességgel is kódolhatók (ezt hívják- minő meglepetés - állandó bitsebességű kódo/ásnak).

Az MP3-szabvány nem határozza meg pontosan, hogy miként kell kódoini az MP3-fájlokat (a dekódalásuk módját azonban pontosan leírja). A különféle

kódoJók más-más pszichoakusztikus modellt követnek, amelyek jelentősen

eltérő eredményt adnak, de ugyanazok a lejátszók mindet képesek visszafej­teni. A legjobb ingyenes kódoló a nyílt forrású LAME, a legalacsonyabb bit­sebességektől eltekintve pedig valószínűleg általában véve is a legjobb kódoló

(és pont). Az MP3 formátumot szabadalrnak kötik, ami megmagyarázza, miért nem

képes a Linux kiegészítők nélkül MP3-fájlokat lejátszani. Lényegében min­

den hordozható zenelejátszó támogatja az önálló MP3-fájlokat, az MP3-audio­

folyamok pedig bármely videotárolóba beágyazhatók. Az Adobe Flash az önálló MP3-fájlokat és az MP4 videotárolóba ágyazott MP3-audiofolyamokat is képes lejátszani.

5. fejezet Videó a Weben l 129

Page 125: HTML5 - Az új Szabvány

Advanced Audio Coding

Az Advanced Audio Coding kodeket (http://en.wikipedia.orglwiki/Advanced_ Audio_Coding), bizalmas nevén az "AAC"-t, 1997-ben szabványosították, és akkor került reflektorfénybe, amikor az Apple ezt választotta az iTunes Store alapértelmezett formátumának Az iTunes Store-ból "vásárolt" AAC-fájlokat eredetileg levédték az Apple saját, FairPlay nevű DRM-sémájával, ma azonban már sok dal védelem nélküli AAC-fájl formájában érhető el a boltban- ezeket az Apple "iTunes Plus"-nak hívja, mert ez sokkal jobban hangzik, mintha minden mást "iTunes Minus"-nak neveznének. Az AAC formátumot szaba­dalrnak kötik; a felhasználási jogdíjak az Interneten megtekinthetők.

Az AAC-t úgy tervezték, hogy azonos bitsebességnél jobb hangminőséget nyújtson, mint az MP3, és az AAC tetszőleges hitrárával kódolható. (Az MP3 esetében csak adott számú bitráta áll rendelkezésre, a felső határ pedig 320 kbps.) Az AAC akár 48 hangcsatorna kódolására is képes, bár a gyakorlatban ezt senki nem használja ki. Az AAC formátum abban is különbözik az MP3-tól, hogy több profilt határoz meg, a H.264-hez hasonlóan, és azzal azonos célból. A "low complexity" ("alacsony bonyolultság") profilt a korlá­tozott CPU-teljesítménnyel rendelkező eszközökön történő valós idejű leját­szásra szánták, míg a magasabb profilok azonos bitsebesség mellett jobb hangminőséget kínálnak, aminek az ára a lassabb kódolás és visszafejtés.

Minden jelenlegi Apple-termék- beleértve az iPod-okat, az AppleT V-t és a QuickTime-t- támogat bizonyos AAC-profilokat az önálló audiofájlokban, illetve MP4 videotárolóba ágyazott audiofolyamokban. Az Adobe Flash az AAC valamennyi profilját támogatja az MP4-ben, akárcsak a nyílt forrású MPlayer és VLC videólejátszók. Kódolásra az FAAC könyvtár nyújt nyílt forrású lehetőséget; a könyvtárat fordításkor építhetjük be az mencoder-be és az ffmpeg-be.

Varbis

A Yorbist (http://en.wikipedia.orglwiki/Vorbis) gyakran hívják "Ogg Vorbis"­nak, bár ez technikailag helytelen, hiszen az "O gg" csupán egy tárolóformátum (lásd a fejezet "Videotárolók" című részét), a Yorbis audiofolyamok pedig más tárolóformátumokba is beágyazhatók. A Yorbist nem köti semmilyen ismert

130 l Videó a Weben 5. fejezet

Page 126: HTML5 - Az új Szabvány

szabadalom, ezért a fontosabb Linux-terjesztések, illetve a nyílt forrású Rock Box firmware-t ("beégetett szoftvert") futtató hordozható eszközök kivétel nél­kül beépített támogatást nyújtanak hozzá. A Mozilla Firefox 3.5 támogatja az Ogg tárolóha ágyazott Yorbis audiofájlokat, illetve a Yorbis audiosávval rendel­kező Ogg videókat, és az Android mobiltelefonok is képesek lejátszani az önálló Yorbis audiofájlokat. A Yorbis audiofolyamokat általában Ogg vagy WebM tárolóha ágyazzák, de MP4 vagy MKV, sőt némi trükközéssel AYI tárolóha is beágyazhatók. A Yorbis tetszőleges számú hangcsatornát képes kezelni.

Yorbis-kódolóból és -dekódolóból is léteznek nyílt forrású változatok, pél­dául az OggConvert kódoló, az ffmpeg dekódoló, az aoT u Y kódoló és a Hbvorbis dekódoló. A Yorbist Mac OS X-en QuickTime-összetevők, Windowsan pedig DirectShow-szűrők segítségével játszhatjuk le.

Ami a Weben működik

Ha még nem ragadt le a szemünk, akkor jobban bírjuk a többségnéL Amint láthatjuk, a videó- és hangfájlok témaköre meglehetősen összetett - és ez még a rövidített változat volt! Most biztosan azon gondolkodunk, hogyan kapcso­lódik mindez a HTML5-höz. Nos, úgy, hogy a HTML5-nek része a <vide o>

elem, amelyet videók weboldalakba ágyazására használhatunk. A videókban használható videokodekekre és audiokodekekre, illetve a tárolóformátumokra nézve nincsenek korlátozások. Egy <v ideo> elem több videofájlra is mutat­hat, amelyek közül a böngésző az első olyat választja ki, amelyet le tud ját­

szani. Azt viszont nekünk kell tudnunk, hogy mely böngészők mely tárolókat és kodekeket támogatják.

Könyvünk írásának idején a HTML5-videók helyzete így festett:

• A Mozilla Firefox (3.5-ös és későbbi változatai) az Ogg-tárolóba ágyazott Theora-videosávokat és Yorbis-hangsávokat támogatják.

• Az Opera (10.5-ös és újabb kiadásai) az Ogg-tárolóba ágyazott Theora­videosávokat és Yorbis-hangsávokat támogatják.

• A Google Chrome (3.0-s és későbbi kiadásai) az Ogg-tárolóba ágyazott Theora-videosávokat és Vorbis-hangsávokat, valamint az MP4-tárolóba ágyazott H. 264-videosávokat (valamennyi profilt) és AAC-audiosávokat (valamennyi profilt) támogatják.

5. fejezet Videó a Weben l 131

Page 127: HTML5 - Az új Szabvány

• Jelenleg (2010. június 9-én) a Google Chrome "dev channel"-je, a Chro­mium napi kiadásai, a Mozilla Firefox napi kiadásai és az Opera kísérleti

kiadásai mind támogatják a WebM-tárolóba ágyazott V P8-videosávokat és Vorbis-audiosávokat. (A legfrissebb információkért látogassunk el a web­mproject.org oldalra, ahol a WebM-et ismerő böngészők letöltési olda­lára mutató hivatkozásokat is találunk.)

• ASafari Mac-re és Windowsra Írt (3.0-s és későbbi) változatai minden olyas­mit támogarnak, amit a QuickTime támogat. Elméletileg megkérhetjük a felhasználóinkat, hogy telepítsenek külső QuickTime-bővítményeket, a gyakorlatban azonban nagyon kevesen fogják ezt megtenni, így azoknál a formátumoknál kell maradnunk, amelyeket a QuickTime "beépítve"

támogat. Az eredetileg is támogatott formáturnak listája hosszú, de nem szerepel rajta sem a Theora-videó, sem a Vorbis-audió, sem az Ogg-tároló.

Ugyanakkor a QuickTime támogatja az MP4-tárolóba ágyazott (Main profilú) H.264-videosávokat és AAC-audiosávokat.

• Az olyan mobileszközök, mint az Apple i Phone vagy a Google Android, az MP4-tárolóba ágyazott (Baseline profilú) H.264-videosávokat és ("low complexity" profilú) AAC-audiosávokat támogatják.

• Az Adobe Flash (9.0.60.184-es és újabb) változatai az MP4-tárolóba

ágyazott H. 264-videosávokat (valamennyi profilt) és AAC-audiosávokat (valamennyi profilt) támogatják.

• Az Internet Explorer 9 támogaeni fogja az MP4-tárolóba ágyazott H.264-videosávokat és AAC-audiosávokat, de azt még nem lehet tudni,

hogy mely profilokat. • Az Internet Explorer 8 egyáltalán nem támogatja a HTML5-videókat, de

lényegében minden Internet Explorer-felhasználó rendelkezik az Adobe Flash bővítménnyel. A fejezet későbbi részében megmutatom, hogyan

ágyazhatunk be úgy HTML5-videókat, hogy ha szükséges, elegánsan helyettesíthessük őket Flash-fájlokkal.

A fenti információkat emészthetöbb formában megtaláljuk az 5.2. táblázat­ban is.

5.2. táblázat A használatban levő böngészők által támogatott videokodekek

IE Flrefox

Theora+Vorbis+Ogg - 3.5+

132 l Videó a Weben

5.0+ 10.5+

5. fejezet

Page 128: HTML5 - Az új Szabvány

H.264+AAC +MP4

W e bM

Arefmc Satari Cbrome

3.0+ 5.0+ 3.0+ 2.0+

A helyzet egy éven belül jelentősen meg fog változni: a WebM-et több bön­gészőben is megvalósítják, méghozzá nem kísérleti formában, és a felhaszná­Jók frissítik a böngészőjüket ezekre az új változatokra. A kodekek támogatása várhatóan az 5.3. táblázatban foglaltak szerint alakul majd.

5.3. táblázat A jövőbeli böngészők által támogatott videokodekek

Theora+VorbiS+Og_g - 3.5+

H.264+AAC +MP4

W e bM 9.0+· 4.0+

5.0+

3.0+ 5.0+

6.0+

10.5+

11.0+

3.0+ 2.0+

• Az Internet Explorer 9 csak akkor fogja támogatn i a WebM-et,.ha a felhasználó telepített egy

VP8-kodeket'; ami arra utal, hogy a Microsoft nem fogja mellékelni magát a kodeket.

b A Google elkötelezte magát amellett, hogy az Android.egy jövőbeli kiadásában"támogatni

fogja a WebM-et, de még nincs biztos ütemterv.

És most jöjjön a feketeleves ...

Leírókód professzor azt mondja

A tárolóknak és kodekeknek nincs olyan kombinációja, amelyik min­den HTML5-képes böngészőben működne. Ez nem valószínű, hogy a közeljövőben meg fog változni. Ahhoz, hogy a videóink minden eszközön és rendszeren megtekinthe­tők legyenek, több változatban kell kódolnunk őket.

Ha a lehető legtöbb böngészővel és rendszerrel szeretnénk együttműködni, a videóink elkészítésénél az alábbi munkafolyamatot kell követnünk:

l. Készítünk egy Ogg-tárolóba ágyazott, Theora-videosávból és Vorbis­audiosávból álló változatot.

2. Készítünk egy másik, WebM (VP8 + Vorbis) formátumú változatot.

5. fejezet Videó a Weben l 133

Page 129: HTML5 - Az új Szabvány

3. Készítünk még egy, MP4-tárolóba ágyazott, H.264 Baseline videosáv­ból és AAC "low complexity" audiosávból álló változatot.

4. Mindhárom videofájlra hivatkazunk egy <v ideo> elemből, és szükség esetén Flash alapú videolejátszásra váltunk vissza.

A H.264-videók

felhasználási engedélyével kapcsolatos kérdések

Mielőtt folytatnánk, fel kell hívnom a figyelmet arra, hogy a videók többszöri kódolásának ára van. A nyilvánvaló költségen felül- mármint azon túl, hogy a többszöri kódoláshoz több idő és több számítógép-használat szükséges- a H.264

kódolású videókhoz egy nagyon is valóságos költség kapcsolódik: a jogdíj. Emlékezhetünk rá, hogy amikor először szóba került a H.264 (lásd a "H.264"

című részt néhány oldallal korábban), említettem, hogy ezt a videokodeket szabadalrnak kötik, és a felhasználását az MPEG LA konzorciummal kell engedélyeztetni. Ez meglehetősen fontos kérdés, de ahhoz, hogy megérthes­sük, miért is lényeges, álljon itt egy részlet a H.264 Licensing Labyrinth című cikkből*:

Az MPEG LA a H.264 jogdíj-portfolióját kétféle felhasználási enge­

délyre bontja: az egyik a kódolók és dekódolók gyártóinak, a másik a tartalomszolgáltatóknak készült. [ . . . ]

A szolgáltatói oldal engedélyeit további négy alkategóriába sorolták, amelyek közül kettő (az előfizetés és a címenkénti vásárlás vagy felhasz­nálás) esetében a végfelhasználó közvetlen ül fizet a videoszolgáltásokért,

míg kettő (a "szabad" televíziós és internetes sugárzás) esetében nem a végfelhasználó tól, hanem más forrásból szedik be a jogdíj at. [ ... ]

A "szabad" televíziós felhasználás jogdíja kétféle lehet. Az első eseté­ben A VC-átviteli dekóderenként 2500 dollár egyszeri díjat kell fizetni, mely dekódert "az Engedélyes közvetlenül vagy áttételesen használja AVC-videók sugárzására a Végfelhasználónak", aki dekódolja és meg­tekinti azokat. Ha azon töprengünk, hogy ilyenkor vajon kétszeresen

* http:l!www.streamingmedia.com/Articles/Editorial/Featured-Articles/The-H.264-Licensing­Labyrinth-65403.aspx

134 l Videó a Weben 5. fejezet

Page 130: HTML5 - Az új Szabvány

számítanak-e fel jogdíjat, a válasz: igen. A kódolót gyártó céggel már megfizettették a jogdíjat, de a műsorszolgáltatónak is ki kell fizetnie a kétféle tÍpusú jogdíj egyikét.

A jogdíj második típusát az éves sugárzási díj jelenti. [ ... ] Az éves sugárzási díjat a piac mérete (az előfizetők száma) alapján állapítják meg:

• Naptári évenként és 100 OOO-től 499 999 televíziókészülékig terjedő sugár­zási piaconként 2500 dollár

• Naptári évenként és 500 OOO-től 999 999 televíziókészülékig terjedő sugár­zási piaconként 5000 dollár

• Naptári évenként és l OOO OOO vagy annál több televíziókészülékig terjedő sugárzási piaconként 10 OOO dollár

[ ... ] Miért fontos a "szabad" televíziós felhasználás jogdíja azoknak, akik nem műsorsugárzással terjesztik a tartalmakat? Ahogy korábban említettem, a jogdíj-kötelezettség a tartalomszolgáltatás minden tÍpu­sára vonatkozik. Az MPEG LA a "szabad" televíziós sugárzás meghatá­rozását a földi sugárzáson túlra is kiterjesztette, ezen felül pedig az imer­netes sugárzásra is jogdíjakat állapított meg, mint "AVC-videók olyan terjesztésére a Világhálón, amelynek során a végfelhasználók nem fizet­nek a letöltés vagy megtekintés jogáért". Más szavakkal, minden nyilvá­nos sugárzás, legyen az földi, kábeles, műholdas vagy internetes szolgál­tatás, jogdíjköteles. [ ... ]

Az internetes sugárzás jogdíja valamivel magasabb lehet- nyilván abból indultak ki, hogy az internetes tartalomközvetítés sokkal gyor­sabb növekedést fog felmutatni, mint a földi sugárzás vagy a kábeles, illetve műholdas "szabad" televíziózás. Az MPEG LA a "szabad televí­ziós sugárzás" piaci díjához adna még egy kiegészítő díjat, de ennek megfizetése alól az első (2010. december 31-én lejáró) engedélyes perió­dus végéig felmentést adott, és leszögezte, hogy "a jogdíj az első periódus után sem lesz magasabb a szabad televíziós sugárzásért azonos időszakra fizetett összegnél".

A cikk elkészülte óta már változtattak is az internetes sugárzás jogdíjszerkeze­tén. Az MPEG LA nemrég bejelentette, hogy 2015. december 31-ig kiterjeszti az ingyenes internetes sugárzás lehetőségét. És hogy utána mi lesz? Ki tudja ... ?

5. fejezet Videó a Weben J 135

Page 131: HTML5 - Az új Szabvány

Ogg-videók kódolása a Firefogg segítségével

(Ebben a részben az "Ogg-videó" kifejezést a "Theora-videó és Yorbis-audió egy Ogg-tárolóban" helyett használom. Ez az a kodek+tároló kombináció, amelyet a Mozilla Firefox és a Google Chrome beépítve támogat.)

A Firefogg egy nyílt forrású, GPL felhasználási engedélyű Firefax-bővít­mény az Ogg-videók kódolásához. A használatához telepítenünk kell a Mozilla

Firefox 3.5-ös vagy későbbi változatát, majd el kell látogatnunk a Firefogg webhelyére, amelyet az 5.1. ábrán láthatunk.

Kattintsunk az Install Firefogg (A Firefogg telepítése) gombra. A Firefox ekkor megkérdezi, hogy valóban engedélyezni szereménk-e a webhelynek egy bővítmény telepítését. A folytatáshoz kattintsunk azAllow (Engedélyezés) gombra (5.2. ábra).

A Firefox ekkor a szokványos szoftverrelepítési ablakot jeleníti meg. A foly­

tatáshoz kattintsunk az Install Now (Telepítés most) gombra (5.3. ábra). A te­lepítés befejezéséhez a Restart Firefox (A Firefox újraindítása) lehetőséget kell választanunk (5.4. ábra). Miután a Firefox újraindult, a Firefogg webhely

megerősíti, hogy a Firefogg telepítése sikeresen lezajlott (5.5. ábra). A kódolást a Make Ogg Vicleo (Ogg-videó készítése) hivatkozásra kat­

tintva indíthatjuk el (5.6. ábra), a forrásvicleót pedig a Select file (Fájl kivá­lasztása) gombbal választhatjuk ki (5.7. ábra).

o. ••

5.1. ábra A Firefogg honlapja

136 l Videó a Weben

Firefog g 'fldeoentodinganduploldlngforfuefo•

Sifnus!ngf!rafuqg-Ustf!rmqgonYPyrS!II-�

5. fejezet

Page 132: HTML5 - Az új Szabvány

« F•rcftu: prcwntcd th" Jltc (fircfogg.org) from 1sl:mg you to tn sUU sof'twnrt on yout computer.

Stopptd

Firefog g vid eo eneolting and uptoalftno ror Flrefox

sttu uslng Ftrefogg - Usef!refoggonyoyrSrts-�

5.2. ábra A Firefog g telepítésének engedélyezése

5oft.- ht.ilation

.. ��� yg�

Install add-ons only from authors whom you t rust.

Maliciaus software can damage you r computer or viclate you r privacy.

You have asked to install the follawing item:

Firefogg-l.O.O.xpi (Avthar not veri[ied) http :/ /firefogg .o r g/win 3 2/Fire fo gg -l. O. O.xp i

5.3. ábra A Firefogg telepítése

Cancel

5. fejezet Videó a Weben l 137

Page 133: HTML5 - Az új Szabvány

Restart Firefax to complete your changes.

Firefogg 1.0.0 Restart to cornplete the mstallat1on .

. - .-- �· - ·:,. ' . ---· . ---- �· .. · .. - .,. .. - . fa'\.._�.:\_���J.JIJ.J.V,�_--'iol0..- ·�-:...���··� :-- •-:.O..•.l.Oc .. ,.,.,.,.-\_.•���1��

Close

5.4. ábra A Firefox újrainditása

Firefog g vid eo en toding and uploadlng for Firefox

Sdes ysjng F!ratogg. Use Fjrefoag povourSrte· �

Done

5.5. ábra A telepítés sikerült

138 l Videó a Weben 5. fejezet

Page 134: HTML5 - Az új Szabvány

·�-.o!!!!f ... !'P!!!!!'!f!eo----

fM_ {dit Yiew Hittory JfOOkmlor,"',.,'._.;.L0 -��·..;";.'.;.'' -- -----------'""'1 =-----..,.; : C X � "[; http�/fiRtogg.�g/ ü""1Rt· ·;._� p.j \:ilodlg-

Firefog g vieleo en coding and uploading for Firetoll

S1te s ysingfjrefoag-Usefjretogg onmyrSjtfl -"�===:::c·

http://firefogg.orrJ/mtkt[lftdex.html

5.6. ábra Készítsünk videót!

............ ,.....

� :LJ http://fireft,gg.org/mtktlindtx.html

T D Flrefogg- M.ke09g v.., ln, ... �-ru ,.. .

�-""- •

p

Ma ke O gg V i d e o Firefoga-vieleo encoding and u pioaCiing for Firefok

Srtgs US!OQ firefoga. u se flll!fogg on ygyr $(ta. Matca Ogg Vid eo

- Selectfile

{')

5.7. ábra A vicleofájl kiválasztása

5. fejezet

.,:. lll """" '·'"' •

Videó a Weben l 139

Page 135: HTML5 - Az új Szabvány

A Firefogg fő felülete hat "lapból" áll (lásd az 5.8. ábrát):

Preset (Sablon) Az alapértelmezett sablon a "web video", ami a céljainknak tökélete­sen megfelel.

Encoding range (Kódolási tartomány) A videó kódolása hosszú ideig tarthat. Amikor először kódolunk, érde­mes lehet a videónak csak egy részét (mondjuk az első 30 másodpercét) kódolni, amíg meg nem találjuk a nekünk tetsző beállításokat.

Basic quality and reso/ution control (Alapszintű minőség- és felbontásszabályozás) A lényeges beállítások többsége itt található.

Metadata (Metaadatok) Ezzel a lappal itt nem foglalkozom, de annyit elmondhatok, hogy olyan metaadatokat adhatunk a videóhoz, mint a videó címe és szer­zője. Az iTunes vagy valamelyik másik zenerendszerező segítségével már valószínűleg adtunk metaadatokat a zenegyűjteményünkhöz -a működési elv ugyanaz.

Advanced video encoding controls (Haladó videokódolás-szabályzók) Ezekhez csak akkor nyúljunk, ha pontosan tudjuk, mit csinálunk. (A Firefogg interakdv segítséget nyújt a legtöbb beállításhoz. Ha többet sze­retnénk tudni egy lehetőségről, kartintsunk a mellette látható "i" jelre.)

Advanced audio encoding controls (Haladó hangkódolás-szabályzók) Ezeket is csak akkor szabad piszkálnunk, ha pontosan tudjuk, mit csinálunk.

. (_...,......, .

• ....._.w. ........ .,.-

---

5.8. ábra Kódoljunk videót!

140 l Videó a Weben 5. fejezet

Page 136: HTML5 - Az új Szabvány

Csak a "Basic quality and resolution control" lapot (5.9. ábra) nézzük meg részletesen, mert minden fontos beállítás ezen található:

Video Quality (Képminőség) A képminőséget egy O-tól (legrosszabb minőség) 10-ig (legjobb mi­nőség) terjedő skála méri. A nagyobb értékek nagyobb fájiméretet jelentenek, ezért kísérleteznünk kell, hogy megállapítsuk, milyen mé­ret/minőség arány felel meg leginkább az igényeinknek.

Audio Quality (Hangminőség) A hangminőséget egy -l-től (legrosszabb minőség) 10-ig (legjobb minőség) terjedő skálán szabályozhatjuk A nagyobb értékek a kép­minőséghez hasonlóan itt is nagyobb fájiméretet jelentenek.

Video Codec (Videokodek) Itt mindig a "theora" értéket kell megadnunk.

Audio Codec (Audiokodek) Itt mindig a "vorbis" értéket kell megadnunk.

Video Width and Video Height (Képszélesség és képmagasság) Ezek alapértelmezés szerint a forrásvideó szélességéhez és magasságá­hoz igazodnak Ha a vicleót kódolás közben át is szeretnénk mére­tezni, itt módosíthatjuk a szélességét vagy a magasságát. A Firefogg automatikusan átállítja a másik kiterjedést, hogy megtarrsa az eredeti arányokat, így a videó képe nem nyomódik össze vagy nyúlik meg.

Az 5.10. ábrán azt láthatjuk, hogy a vicleót az eredeti szélességének a felére kicsinyírjük. Figyeljük meg, hogy a Firefogg önműködően ehhez igazítja a magasságot.

5. fejezet Videó a Weben l 141

Page 137: HTML5 - Az új Szabvány

New0r1ee.ns2006 dv

� Preset: Web Video Theora, V orbis 400kbs & 400px max width

• Encodlng umye

r �-boasic qualhy •nd resolution control

OVideo Ouahty

OTVIIO Pass Encodmg f!

8 Audio Ouahty

OV•deoCodec 1heor.� •

OAud•o Codec vorb1s •

O ont �-��YSI'* 0.408> .

5.9. ábra Alapszintű minőség- és felbontásszabályzás

New0rleons2006 dv

� Preset Custom settlngs

� Encoding ra nye

Basic quality and resolution control

OTVIIO Pass Encod1ng �

O AudiO Oualdy

OVIdeoCodec

OAudio Codec

OVideo Widlh 3211

-===� OVideoHe�ght 113

httpJ!firtfogg.orgfm•kt/indtX.htmlft

5.1 O. ábra A videó képszélességének és képmagasságának szabályozása

142 l Videó a Weben s_ fejezet

Page 138: HTML5 - Az új Szabvány

Miután beállítottunk minden szabályzót, kattintsunk a Save Ogg (Ogg-fájl mentése) gombra, hogy elindítsuk a tényleges kódolást (5.11. ábra). A Firefogg ekkor egy fájlnevet kér a kódolt videó számára.

--

& � http://firtfogg.orglm•i:tftndex.htm.-

____ _ �

Li Aref�OggY"tdeoln,-� w select new file • Sl!IW 0gg

New0r1eans2006 dv .eJ • Preset Custom senings

t En coding range

• Basic quality and resolution control

• Metadala for the clip

• Advanced video encoding controls

' Advanced audio encodlng controls

http://firrlogg.org/mlktfmdex.htmltli

5.11. ábra A kódolást a .save Ogg" gombra kattintva indíthatjuk el

p

�IIIYSiow o ... ,,···

A Firefogg a videó kódolásának előrehaladását egy csinos folyamatsávon mu­tatja (lásd az 5.12. ábrát). Nekünk csak annyi a teendőnk, hogy várunk (és

várunk, és várunk ... ).

Ogg-videók kötegelt kódolása

az ffmpeg2theora segítségével

(Ahogy az előző részben, az "Ogg-videó" kifejezést itt is a "Theora-videó és Yorbis-audió egy Ogg-tárolóban" jelentésben fogom használni. Ez az a kodek+

tároló kombináció, amelyet a Mozilla Firefox és a Google Chrome beépítve támogat.)

Az Ogg-videók készítéséhez több kapcsolat nélkül használható kódoló is rendelkezésre áll. Ha sok vicleofájlt szeretnénk kötegelve, automatizáltan

5. fejezet Videó a Weben l 143

Page 139: HTML5 - Az új Szabvány

kódolni, mindenképpen próbáljuk ki az ffmpeg2theora nevű programot (http://v2v. cel �j/ffmpeg2theora/).

Az ffmpeg2theora egy nyílt forrású, GPL felhasználási engedéllyel ren­delkező alkalmazás Ogg-videók kódolásához. Előre lefordított bináris válto­zatai Mac OS X-re, Windowsra és újabb Linux-terjesztésekre is elérhetők. Az ffmpeg2theora szinte bármilyen vicleofájlt elfogad bemenetként, beleértve az átlagfogyasztói piacra szánt karnkorderek által előállított DV-videókat is.

Az ffmpeg2theora-t a parancssorból meghívva vehetjük használatba. Windowson kövessük a Start, Programs, Accessories, Command Prompt (Start, Programok, Kellékek, Parancssor), Mac OS X-en pedig az Applications, Uti­lities, Terminal (Alkalmazások, Segédprogramok, Terminál) útvonalat.

f.net�dlng vldeo to Oqq X

M é 1 O%· Transcoded

• Preset CUS(Otn setti�

• Encoding r•nge

p

!O

• Basic qu.tlily •nd reso=l:.::uti :.::•• :.::co:;::ntr:.::•' ----------: ..:- a VSiow o ..... , e

5.12. ábra A kódolás folyamatban

Az ffmpeg2theora számos parancssori kapcsolót elfogad. (Ha mindet látni szeretnénk, írjuk be az ffmpeg2theora --help parancsot.) Én csak hár­mat emelnék ki közülük:

• --v ideo-quali ty Q (képminőség), ahol a Q egy O és 10 közötti szám • --audio-quality Q (hangminőség), ahoi a Q egy -2 és 10 közötti szám

144 l Videó a Weben 5. fejezet

Page 140: HTML5 - Az új Szabvány

• --max_ size=WxH (maximális méret), ahol a W és a H a videó számára engedélyezett maximális szélesség (wid th) és magasság (height). (A kettő kö­zötti "x" csupán egy "x".) Az ffmpeg2theora a vicleót arányosan méretezi át a megadott keretek között, így előfordulhat, hogy a kódolás után a videó kisebb lesz a megadott WxH méretnél. Például ha egy 720x480 képpontos vicleót kódolunk a --max _ size 320x240 beállítással, eredményként egy 320 képpont széles és 213 képpont magas vicleót kapunk.

A fentiek szerím tehát az ffmpeg2theora-ban így kódolhatunk egy vicleót ugyanazokkal a beállításokkal, mint amelyeket az előző részben ("Ogg-videók kódolása a Firefogg segítségéve!") használtunk:

you@ localhas t$ ffmpeg2theora --videoquali ty 5 --audioquality l

--max size 320x240 pr6.dv

Az .ogv kiterjesztéssei ellátott kódolt videó ugyanabba a könyvtárba kerül, mint ahol az eredeti videó is található. Másik helyet vagy fájlnevet úgy adha­tunk meg, ha átadjuk az -- output= / a / kódolt / videó/ elérési / útj a

parancssori kapcsolót az ffmpeg2theora-nak.

H.264-videók kódolása

a HandBrake segítségével

(Ebben a részben a "H.264-videó" kifejezést a "Baseline profilú H.264-videó és low complexity profilú AAC-audió egy MPEG4-tárolóban" helyett hasz­nálom. Ez az a kodek+tároló kombináció, amelyet a Safari, az Adobe Flash, az iPhone és a Google Android eszközök beépítve támogatnak.)

A jogdíj kérdésétől eltekintve (lásd a fejezet "A H.264-videók felhaszná­lási engedélyével kapcsolatos kérdések" című részét kicsit korábban) a H.264-videók kódolásának legegyszerűbb módja a HandBrake (http://handbrake.fr) használata. A HandBrake egy nyílt forrású, GPL felhasználási engedéllyel rendelkező alkalmazás H.264-videók kódolásához. (Régebben más video­formátumokat is tudott kezelni, de a legújabb változatban a fejlesztök úgy döntöttek, hogy a legtöbb formátum támogatását elhagyják, és minden erőfeszítésüket a H.264-videókra összpontosítják.) A HandErake-ből előre

5. fejezet Videó a Weben l 145

Page 141: HTML5 - Az új Szabvány

lefordított bináris változatok Windowsra, Mac OS X-re és újabb Linux-ter­jesztésekre is elérhetők (http://handbrake.fr/downloads.php).

A HandBrake kétféle kivitelben készül: grafikus felületű és parancssori változatban. Én először a grafikus felületet mutatom be, majd azt is megnéz­zük, hogyan adhatók meg a javasolt beállítások a parancssorban.

Miután megnyitottuk a HandBrake alkalmazást, az első dolgunk a forrás­videó kiválasztása (lásd az 5.13. ábrát). A fájl kiválasztásához kattintsunk a Source (Forrás) ikonra, majd a lenyíló listából válasszuk a Video File (Videofájl) lehetőséget. A HandBrake szinte bármilyen vicleofájlt elfogad be­menetként, beleértve az átlagfogyasztói piacra szánt karnkorderek által elő­állított DV-videókat is.

5.13. ábra A forrásvideó kiválasztása

A HandBrake ekkor panaszkodni fog, hogy még nem állítottunk be alapér­telmezett könyvtárat, ahová a kódolt videókat mentheti (lásd az 5.14. ábrát). Ezt a figyelmeztetést nyugodtan figyelmen kívül hagyhatjuk, de azt is meg­tehetjük, hogy megnyitjuk a beállítóablakot (a Tools-Eszközök- menüből), és megadunk egy alapértelmezett kimeneti könyvtárat.

146 l Videó a Weben 5. fejezet

Page 142: HTML5 - Az új Szabvány

'Selea.��·�cCif'JITJ.Ie i<OO:oÚ'!2) - .,.., �es: :1 .. jl1v.:u;t. 1 • w� oo�.z

dJiftgS"(Pr�l:�) """'

IOI!oEI!!!!)lr,1ooJ ......

1ZD> <�80 Asced.P

j"" L­

...., KeepAspertJlat!D

] Pod5GR.I)p0rt

You currtntly � "AutOfl'\ltK:1IJy n�me. output files"ltnlbled forthe dest•IVbon file*. but you do no1 have • dd11ult directory set.

You should set 1 "Dd1ult P.th" '" H.ndB�kH preferenus. ($ee 'lools' menu ·>'Options'·> ·�..r hb·> 'tnf•ult hth')

.._ ..

pUe •Stra:t SQ:'!' 'h$�480 C2D

-�

5.14. ábra Ezt a figyelmeztetést hagyjuk figyelmen kívül

A jobb oldalon találjuk a sablonok listáját. Ha az "iPhone &iPod Touch"

sablont választjuk, mint az 5.15. ábrán, a beállítások többsége az általunk kívánt értékeket kapja.

Az egyik lényeges beállítás, amely alapértelmezés szerint ki van kapcsolva, a Web opeimized (Optimalizálás a Webre). Ha ezt a lehetőséget az 5.16. áb­rának megfelelően bekapcsoljuk, egyes metaadatok átrendezödnek a kódolt videóban, és a videó megtekintését már akkor meg lehet majd kezdeni, ami­kor a nagy része még töltődik a háttérben. Én melegen ajánlom, hogy mindig kapcsoljuk be ezt a beállítást. Mivel a kódolt videó minőségére vagy fájimé­retére nincs hatással, igazán nincs okunk rá, hogy ne tegyük.

A Picture (Kép) lapon a kódolt videó lehetséges legnagyobb szélességét és magasságát állíthatjuk be (lásd az 5.17. ábrát). A Keep Aspect Ratio (01-

dalarány megtartása) lehetőséget ugyancsak célszerű bekapcsolni, nehogy a HandBrake átmérerezés közben összenyomja vagy megnyújtsa a képet.

5. fejezet Videó a Weben l 147

Page 143: HTML5 - Az új Szabvány

�Queue !ti:! ShowQueue .• PrNI_. !II]ActMtyWindow

T q>

Q? '"' U � -

C

5. l 5. ábra Válasszuk az i Phone sablont

.......

BA-Univet<HII .....

-·· B ........

-....

HighPt-ofie

Bl«»<Y oa .. k Apple nr teoacy iPhone leoacy iPodlt!:c;J<K:Y

li Souru • Ci Start m Add to Queue ffiJ Show Queue lill Previ- [ll] A.ctMty Window

lot

Sourcc:. � Pr

Tlte: lt(00:02:22) ·l Chapten: li:..=3 ltYou;tl c=3 0.../Jti::Jn: 00:02:22

-

�, -------------------------------------- � output SdtinQS (Pt'Uet Custom)

Ctri.Iler: [K"�Re •]l':t"..oefiescze �� �Pod5G5lClJ)Ort

PicttJ"e Vüeo Fbrs Yideo Audo J � Chapters Adv-anced

Souce: 120x<480 As;:Ject.Ratio: 1.36

�: : Heqt:

� KeepAspectRolltlo

• ., .... ,, ... " ,_. = = ·J

ScanComplet:ed

5.1 6. ábra Mindig optimalizáljunk a Webre

148 l Videó a Weben

Cropping

'""

D , ... � n -

u

5. fejezet

Page 144: HTML5 - Az új Szabvány

.. �- -. .. -.- --· -··· . -. - � '-�-. ,- ..... - .. - .

�--- '·k�J-s!iíj � líSourct• Cjsurt. -AddtoQutut 1fiJ91owQutut .Prtv�rw -ActMty'W'indow ""'"'"'� �

Tti&: b (OO:!)?:Z2) •J Chapters: � tt..ouc;t. � CU«o"l: 00:1l2:22

- - ---- � "''

Output Scttlnp (Preset: Custom) Ccrtaher: '""' Fie ·l�uroefilsize rl)Webopbnczed f)PodSGRQUt

""""' -- <•-ScMce: 720x480 AspectR«lo: 1.36 ·-_,�Ih-' � �"""'Wid:h f)CuR:OfTI •

�K�As!mBtt;!lll Top

·l o--:p -líi'i'-Loft r-� �Rdt

o .;.. """""

� Sun�ed , r-- -=·a:W--.--a��-:.o....w.,... ____"...",. '""'--�

5.1 7. ábra Állítsuk be a szélességet és a magasságot

A "Video" lapon, amelyet az 5.18. ábrán láthatunk, több fontos beállítást adhatunk meg:

Video Codec (Videokodek) Ügyeljünk rá, hogy itt a H. 264 (x264) értéket válasszuk.

2-Pass Encoding (Kétmenetes kódolás) Ha ezt a négyzetet bekapcsoljuk, a HandBrake kétszer futtatja le a videokódolót. Először csupán elemzi a videót, és olyan dolgokat vizsgál, mint a színösszetétel, a mozgás és a jelenethatárok. A videó tényleges kódolását a második menetben hajtja végre, az első körben összegyűjtött információk felhasználásával. Ahogy ez várható, ez a módszer körülbelül kétszer annyi ideig tart, mint az egymenetes kódolás, viszont jobb minőségű videót eredményez a fájlméret növe­lése nélkül. Én mindig engedélyezem a kétmenetes kódolást a H.264-videók esetében. Hacsak nem a következő YouTube-ot építjük, és napi 24 órában videókat kódolunk, valószínűleg nekünk is érdemes a kétmenetes kódolást választanunk.

5. fejezet Videó a Weben l 149

Page 145: HTML5 - Az új Szabvány

Turbo First Pass (Gyors első menet) Ha a kétmenetes kódolást választottuk, ennek a négyzetnek a bekap­csalásával némi időt takaríthatunk meg. Ez a beállítás úgy csökkenti az első menetben elvégzett munka mennyiségét (a videó elemzésének alaposságát), hogy közben csak kis mértékben rontja a minőséget. Én általában engedélyezem ezt a lehetőséget, de ha nekünk a minőség kiemeit szempont, jobb, ha kikapcsoljuk.

Quality (Minőség) A kódolt videó "minőségét" többféleképpen is megadhatjuk: beállít­hatjuk a célfájl méretét - ez esetben a HandBrake minden tőle tel­hetőt megtesz, hogy a végeredménykém kapott videó ne legyen nagyobb ennél a méretnél -; beállíthatunk egy átlagos "bitsebessé­get", ami szó szerím a kódolt videó egy másodpercének tárolásához szükséges bitek számát jelenti (azért hívják "átlagos" bitsebességnek, mert egyes másodpercek több bitet igényelnek, mint mások); de egy O-tól 100 százalékig terjedő skálán megadhatunk egy állandó minő­séget is (a magasabb értékek jobb minőséget, de nagyobb fájlokat eredményeznek). A minőség beállítására nincs általános szabály.

Kérdezzük meg Leírókód professzort!

Kérdés: Ogg-videó is készíthető kétmenetes kódolással? Válasz: Igen, de a kódoló működésének alapvető különbsége miatt erre valószínűleg nincs szükség. A kétmenetes H.264-kódolás szime min­dig jobb minőségű vicleót eredményez, a kétmenetes Ogg-kódolásnak azonban csak akkor vesszük hasznát, ha a kódolt videó fájljának adott méretűnek kell lennie. (Lehet, hogy éppen ez érdekel minket, de az itt bemutatott példák nem erről szálnak, és a webes videók kódolására valószínűleg nem éri meg ennyivel több időt fordítani.) Az Ogg-videók minőségét szabályozzuk inkább a Quality-beállítással, és ne veszödjünk a kétmenetes kódolássaL

150 l Videó a Weben 5. fejezet

Page 146: HTML5 - Az új Szabvány

· ��-:���----��---� Souru • i; Sbrt. (���Add to Queue � ShowQueue PrN!ew [IIJ A.ttMtyWindow

Source � Pl'

_, l• ("'""'"') - il """'•" C:=::J - � ""'-' oo,oz,zz fil 7""" - � l ll Output� (PTeset: CtKtom)

cc:n-: [K>1Fie __ --:JrJla'oeflesiZe 0 web� [liPodSG�

NKel \I':!Mf!sr-s l � l,., ..l �-l Ql,aptm J A,Nanc:pd,

..... .......

YldeoeodM: !"-"'...!."""> ·l e Target.Size(MB):

Framerate(R>S): �3§�e il 8 Avostrate(l!b9s):

2-Passfnccd'lo c Const.-tQualty:

TU'bofirstPass

60.78"lloRf:20

�.. �! � :l

5.18. ábra A képminöségre vonatkozó beállítások

A példában 600 kbps átlagos bitsebességet választottam, ami egy 320x240-es videóhoz elég magas érték. Ezen kívül engedélyeztem a kétmenetes kódolást

is, gyors első menettel. Az Audio (Hang) lapon, amelyet az 5.19. ábrán láthatunk, valószínűleg

semmit sem kell megváltoztatnunk Ha a forrásvideónkban több hangsáv is található, szükséges lehet kiválasztani, hogy melyik kerüljön be a kódolt vide­óha. Ha a videó nagyrészt abból áll, hogy egy ember beszél (tehát nem zene vagy aláfestő hang hallható benne), a hangsáv bitsebességét valószínűleg 96 kbps-re vagy valamilyen hasonló értékre csökkenthetjük. Ettől eltekintve azon­ban az "iPhone" sablonból örökölt alapértelmezések többnyire megfelelnek.

5. fejezet Videó a Weben l 151

Page 147: HTML5 - Az új Szabvány

OuQiut 5etbngf (Preet Co.Ktom)

ccn- j...,..B= -l ._...,.. .. "Wl!bQJibliZed PodSG�

·�.

5.19. ábra A hangminöségre vonatkozó beállítások

Következő lépésként kattintsunk a Next (Tovább) gombra, és válasszunk egy könyvtárat, illetve fájlnevet a kódolt videó számára (5.20. ábra), végül pedig indítsuk el a kódolást a Start gombbal (5.21. ábra). A HandBrake a videó kódolása közben statisztikai adatokat jelenít meg (5 .22. ábra).

·- �--... , ... Sbrt íi!l Add tn Qutut ltiJ ShcMr Qutut Prtvttw [II]AcbYityWíndow

....... � ,_",_",..,. �

llie.,I(00:02:22} ·f"-<, u::-:3 ...... � .,.._ ,,.,.,._" -R.: C:��� ........ r �

Duqlui:SetttnQs(Pt�eu.tom)

�� .... Re ·J lMQBf'-Sile " Wtlboptmacj ...... .._.

�Yidlol'bfs'l1lllo ..... - --�. Audiolr-.b

� l:iiiiiiiii:J Selectedtradt:Newtredo. .

""" .... """' - .......... .., ... ORC

[-- ·)I�U . .[ ..... ::;J�O o

,: ... -� """""""' - Sln!Pwat.Qtf.z) 8blte('li:bpJ) ORC

.l - MC(foMC) OOb)'Pt-GLOQic n .. ,,. 0.0

l. � "'-� . .

5 .20. ábra Adjuk meg a célfájl nevét

152 l Videó a Weben 5. fejezet

Page 148: HTML5 - Az új Szabvány

" ..........

li"'�·· ,\ti"'�-""'"""'"'�"'-""'� ··�lll""'""'"""""" -.�-

Tda: !J(OO:Ill-.m •l �' C:3 tt-nJu;to C:3 t'Uabon: 001ll:22

fle: C:�f�p9.,.�.M'W

output Sdtfroc)l' (PrH«: eu.tom) cont-.: [ijifit=::;J U L«9eNesize (l]Wflb� PodSG�

;,_,;!ifA� J

U!!iiiJ

��l�ti��������������·---------------------------,, AudioTradu:

�� �Tradi:NIMTrd

s-u Aldo Codec: f4xdDoon Sarrcllwate !ar .u �

1- ·llMC•-> ·ll- ·ll- ·l� o

Track Sotne At.doCodac P4xdaown �ate(lrH;z) lllnte(Kbps) AN:.(JMQ �ProL.ogocn

-- �

5.21. ábra Készítsünk videót!

5.22. ábra Türelem, ifjú padawan!

H.264-videók kötegelt kódolása

a HandBrake segítségével

(Az előző részhez hasonlóan a "H.264-videó" kifejezést itt is a "Baseline pro­filú H.264-videó és low complexity profilú AAC-audió egy MPEG4-tá­rolóban" kifejezés helyett használom. Ez az a kodek+tároló kombináció, ame­lyet a Safari, az Adobe Flash, az iPhone és a Google Android eszközök beépítve támogatnak.)

Ahogy fentebb említettem, a HandBrake-nek parancssori változata is lé­tezik. A grafikus kiadáshoz hasonlóan ennek is töltsük le a legfrissebb válto­zatát, a http:llhandbrakefrldownloads2.php címrőL

Az ffmpeg2theora-hoz ( lásd a fejezet "Ogg-videók kötegelt kódolása az

ffmpeg2theora segítségével" cím ű részét) hasonlóan a HandBrake parancssori

5. fejezet Videó a Weben l 153

Page 149: HTML5 - Az új Szabvány

változata is szédítő mennyiségű kapcsolót kínál. (Ha az összeset meg szeret­nénk tekinteni, írjuk be a HandBrakeCLI --help parancsot egy terminál­vagy parancsablakba.) Itt csak néhány fontosabbat tekintünk át:

• --preset "X", ahol az "X" egy HandErake-sablon neve (lényeges, hogy a nevet idézőjelbe tegyük). A webes H.264-videókhoz az "iPhone & iPod Touch

" sablonra van szükségünk.

• --width W, ahol a W a kódolt videó szélessége. A HandErake automa-tikusan átállítja a magasságot, hogy megtartsa az eredeti videó arányait.

• --vb Q, ahol a Q az átlagos bitsebesség (kilobit/másodpercben mérve) • --t wo-pass- ez a kapcsoló engedélyezi a kétmenetes kódolást • --turbo- ez a kapcsoló engedélyezi a gyors első menetet a kétmenetes

kódolás során • --input F, ahol az Fa forrásvideó fájlneve. • --output E, ahol az E a kódolt videó célfájljának a neve.

Íme egy példa a HandErake meghívására a parancssorból, azokkal a parancs­sori kapcsolókkal, amelyek megfelelnek a HandErake grafikus változatában választott beállításoknak:

you@localhost$ HandBrakeCLI --preset "iP hone & iPod Touch"

-- width 320

--vb 600

--two-pass

--turbo --inputpr6.dv

--output pr6 .mp4

Felülről lefelé: a parancs elindítja a HandErake-et az "iPhone & iPod Touch" sablonnal, a vicleót átméretezi 320x240 képpontosra, 600 kbps átlagos bitse­bességet állít be, engedélyezi a kétmenetes kódolást gyors első menettel, be­olvassa a pr6.dv fájlt, és pr6.mp4 néven mentve kódolja azt.

WebM-videók kódolása az ffmpeg segítségével

A WebM formátumot 2010. május 19-én tették közzé-egyetlen nappal az előtt, hogy ezt a részt írtam. Így nem csoda, hogy még nem volt nagy vá­laszték kódolóeszközökből és útmutatókból. A helyzet persze egyszerű-

154 l Videó a Weben 5. fejezet

Page 150: HTML5 - Az új Szabvány

södni fog, amint megírják (vagy frissítik) a WebM egykattintásos támoga­tásához szükséges eszközöket. Addig azonban ezekre az eszközökre lesz szükségünk:

• a libvp8 könyvtárra, valamint az ffmpeg egy különleges, kiegészítő fol­tokkal ellátott (a libvp8-hoz kapcsolódni képes) változatára, amely még nem része a hivatalos ffmpeg-gyűjteménynek:

-útmutató Linuxhoz (http:lllardbucket.org/bloglarchives/201 0/0511 9/vpB­webm-and-Jfmpeg/)- ezt személyesen teszteltem Ubuntu "Lucid" 10.04

rendszeren -útmutató Windowshoz (http:!lwww.ioncannon.netlmeta/1128/compiling­

webm-jfmpeg-windowsl)- ezt még nem próbáltam ki

• az mkclean legújabb változatára (http://www.matroska.orgldownloads/ mkclean.html).

Készen állunk? Rendben. A parancssorból indítsuk el az ffmpeg-et paramé­terek nélkül, és győződjünk meg róla, hogy a fordítás során belekerült a VP8-

támogatás:

you@localhost$ fÖ!p!g FFmpeg version SVN-r23197, Copyright (c) 2000-2010 the FFmpeg developers

built on May 19 2010 22:32:20 with gcc 4.4.3

configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-

postproc

--enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame

--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora

--enable-libx264 --enable-libxvid --enable-xllgrab --enable-libvpx-vpB

Ha nem látjuk az --enable-libvpx-vp8 varázsszavakat, az ffmpeg-nek nem a megfelelő változatával rendelkezünk. (Ha megesküszünk rá, hogy az

imént fordítottuk le helyesen, ellenőrizzük, hogy nincs-e belőle két példá­nyunk. Ez nem okoz gondot, mert nem fognak ütközni egymással - csak éppen a teljes elérési utat meg kell majd adnunk az ffmpeg VP8-at ismerő változatának elindításához.)

Most azt mutatom be, hogy miként lehet kétmenetes kódolást végrehaj­

tani (lásd a fejezet "H.264-videók kódolása a HandBrake segítségéve!" című részét). Az első menet csak végigpásztázza a bemenő vicleofájlt (-i pr6.dv) ,

és adatokat ír ki róla egy naplófájlba (ami automatikusan a pr6.dv-O.log nevet kapja). A videokodeket a -vcodec kapcsolóval adhatjuk meg:

5. fejezet Videó a Weben l 155

Page 151: HTML5 - Az új Szabvány

you@localhost$ ffmpeg -pass l -passlogfile pr6. dv -threads 16 -token_ parti tions 4

-altref l-lag 16 -keyint_min O -g 250 -mb_static_threshold O -skip _threshold O -cp:nin l -qmax 51 -i pr6. dv -vcodec li.bvpx_ vp8 -an

-f rawvideo -y NUL

A parancssorba írt ffmpeg-utasítás nagy részének semmi köze a VP8-hoz vagy a WebM-hez. A libvp8 ugyan több VP8-beállítást is támogat, amelyeket á tadha­tunk az ffmpeg-nek, de ezeknek a működését még nem ismerem. Amint talá­lok róluk egy jó leírást, felteszek egy hivatkozást ennek a könyvnek a webhelyére.

A második menetben az ffmpeg kiolvassa az első menetben rögzített sta­tisztikai adatokat, és ténylegesen végrehajtja a kép- és a hangsáv kódolását. Az eredmény egy MKV-fájl lesz, amit majd mi alakítunk később WebM-fájllá. (Az ffmpeg idővel képes lesz közvedenül WebM-fájlokat kiírni, de jelenleg rejtélyes és veszélyes hibákat okoz, ha ilyesmivel próbálkozunk.)

Íme a második menet parancsa:

you@localhost$ ffmpeg -pass 2 -passlogfile pr6. dv -threads 16 -token_ parti tions 4

-altref l-lag 16 -keyint_min O -g 250 -mb_static_threshold O -skip _threshold O -cp:nin l -qmax 51 -i pr 6. dv -vcodec li.bvpx _ vp8 -b 614400 -s 320x240 -aspect 4:3 -acodec vorbis -y pr6 . mkv

Ebben az utasítássorban öt fontos paraméter található:

-vcodeclibvpx_vp8

Ez a paraméter azt adja meg, hogy a VP8 videokodekkel végezzük a kódolást. A WebM mindig a VP8 kodeket használja.

-b 614400

Ez a bitsebességet határozza meg. Más formátumoktól eltérően a libvp8-nak a bitek számával, és nem kilobitben kell megadnunk a bitrátát, ezért ha 600 kbps bitsebességű videót szeretnénk, a 600-at meg kell szoroznunk 1024-gyel (így jön ki a 614 400).

-s 320x240

Ez a célfájl képméretét adja meg, a szélesség és a magasság szorzataként.

-a spect 4:3

156 l Videó a Weben 5. fejezet

Page 152: HTML5 - Az új Szabvány

Ez a videó képarányát határozza meg. Az alapfelbomású videók általában 4:3

oldalarányúak, a magas minőségű videók oldalaránya azonban többnyire 16:9 vagy 16:10. A tesztelés során úgy találtam, hogy ezt kifejezetten meg kell adnunk a parancssorban, és nem szabad az ffmpeg automatikus észlelésére támaszkodnunk.

-acodec vorbis

Ez a paraméter azt adja meg, hogy a Yorbis audiokodekkel kódolunk A WebM mindig a Yorbis audiokodeket használja.

Ezzel egy MKY-fájlt kapunk, YP8 kódolású képpel, és Yorbis kódolású hanggal. Ez nagyon közel áll ahhoz, amit szerernénk, mert a WebM tároló­formátuma szinte megegyezik az MKY formátumával (valójában annak egy részhalmaza). Csak néhány hitet kell átállítanunk a végleges WebM-videofájl előállításához a korábban említett mkclean segédprogram segítségéve!:

you@localhost$ rnkclean -doc type 4 pr 6 .rnkv pr 6. webrn

És ennyi az egész!

És végül, a leírókód!

Felmerülhet bennünk a kérdés, hogy ha ez egy HTML-ről szóló könyv -amiben eddig biztosak volrunk -, akkor hol a leírókód? Nos, a HTML5-ben kétféle módszerrel ágyazhatunk be egy videót egy weboldalba, de mindket­tőhöz szükségünk van a <video> elemre. Ha csak egy videofájlunk van, egyszerűen hivatkozhatunk rá egy src jellemzőbőL Ez nagyon hasonlít ah­hoz, mint amikor egy képet ágyazunk be egy <img src=

" .. . "> címkével:

<v ideo src="pr6. wel:m"></video>

Elméletileg összesen ennyire van szükség, de az <img> címkékhez hasonlóan a <v ideo> címkékben is mindig célszerű megadni a width és height jel­lemzőket is. A width (szélesség) és height (magasság) jellemzők értéke ugyanaz lehet, mint amit a kódolás során maximális szélességként és magas­ságkém megadtunk:

<v ideo src= "pr 6. webrn" width="320" height="240"></video>

5. fejezet Videó a Weben l 157

Page 153: HTML5 - Az új Szabvány

Ne aggódjunk, ha a videó valamelyik kiterjedése kicsit kisebb a fentinél, a bön­gésző ugyanis a <video> elem által meghatározott doboz közepére igazítja a videót, így az soha nem fog aránytalanul összenyomódni vagy megnyúlni.

Alapértelmezés szerint a <video> elem nem jelenít meg semmilyen lejátszásvezérlőt; ezeket egyszerű HTML-, CSS- és J avaScript-kóddal hozhat­juk létre. A <vide o> elemnek vannak olyan tagfüggvényei, mint a play()

(lejátszás) és a pau se() (szünet), valamint rendelkezik egy írható és olvas­ható, currentTime (aktuális idő) nevű tulajdonsággal, illetve szintén írható­olvasható volume (hangerő) és muted (elnémított) tulajdonságokkal, tehát minden olyasmivel, amire a saját felületünk felépítéséhez szükségünk lehet.

Ha nem akarunk saját felületet építeni, a böngészőt is utasíthatjuk, hogy jelenítse meg a beépített vezérlőket. Ehhez csak a controls jellemzőt kell belefoglalnunk a <video> elembe:

<v ideo src= "pr 6. webm • wid th= "320" height= "240" controls></video>

Van még két további elhagyható jellemző, amelyekről említést szeretnék tenni, mielőtt rovábbmennénk: a preload és az autoplay. Ne bántsuk a hírhozót: hadd magyarázzam el, hogy ezek miért hasznosak. A preload

jellemző azt mondja a böngészőnek, hogy azt szeretnénk, hogy kezdje el le­tölteni a videofájlt, amint az oldal betöltése elindul. Ennek akkor van értelme, ha az oldal kimondottan azt a célt szolgálja, hogy megtekintsük a videót. Ha viszont a videó csak kiegészítő tartalom, amit csak néhány látogató fog meg­nézni, a preload jellemzőt none értékre állítva utasíthatjuk a böngészőt, hogy csökkentse a minimumra a hálózati forgalmat.

Íme egy példa egy olyan videóra, amelynek a letöltése (de nem a lejátszása) rögtön elindul az oldal betöltésekor:

<v ideo src= "pr 6. webm • width= "320 • height= "240 • preload></video>

Ez pedig egy olyan videó, amely az oldal betöltésekor nem töltődik le azonnal:

<v ideo src= "pr 6. webm • width= "320" height= "240 • preload="none"></video>

Az autoplay (automatikus lejátszás) jellemző pontosan azt eredményezi, amire a neve utal: azt közli a böngészővel, hogy a videofájl letöltését az oldal betöltésekor rögtön el szeretnénk kezdeni, és a videó lejátszását is el szeret­nénk indítani, amint lehet. Vannak, akik rajonganak ezért, és vannak, akik gyűlölik, de hadd magyarázzam el, miért fontos, hogy a HTML5-ben legyen

158 l Videó a Weben 5. fejezet

Page 154: HTML5 - Az új Szabvány

egy ilyen jellemző. Egyesek akkor is automatikusan el szeretnék indítani a videóikat, ha ez idegesíri a felhasználókat. Ha a HTML5 nem határazna meg egy szabványos módszert a videók automatikus lejátszására, a fejlesztök JavaScript-trükkökkel akkor is megoldanák, például meghívnák a videó play() tagfüggvényét az ablak load eseménye közben. Ez ellen a látogatók sokkal nehezebben tudnak védekezni, egy olyan bővítményt viszont egysze­rűen hozzá lehet adni a böngészőhöz (vagy írni is lehet egyet, ha szükséges), amely lehetövé teszi, hogy azt mondjuk: "hagyd figyelmen kívül azautoplay

jellemzőt, mert egyetlen vicleót sem szeretnék automatikusan elindítani". Íme egy példa egy olyan videóra, amelynek a letöltése és a lejátszása az

oldal betöltése után a lehető leghamarabb elindul:

<v ideo src= "pr 6. webm" width= "320" height= "240" autoplay><lvideo>

Az alábbiakban pedig egy olyan Greasemonkey-parancsfájlt (http://www. greasespot.net) láthatunk, amelyet a Firefax-példányunkra telepítve meg­akadályozhatjuk a HTML5-videák automatikus lejátszását. A parancsfájl a HTML5 által meghatározott autoplay DOM-jellemzőt használja, ami a HTML-kód autoplay jellemzőjének JavaScript-megfelelője:

l l ==UserScript==

l l @name Disable v ideo a utoplay

ll @namespace http:lldiveintomark.orglprojectslgreasemonkeyl l l @description Ensures that HTMLS v ideo elements do not autoplay

l l @include l l ==IUserScript==

var arVideos = document. getElementsByTagName ('v ideo') ;

for (var i = arVideos .length - l; i >= O; i--) {

var elmVideo = arVideos [i]; elm V ideo. autoplay = false;

De várjunk csak egy percet! Ha végig figyelemmel kísértük a fejezetet, akkor tudjuk, hogy nem csak egy, hanem három videofájlunk van. Az egyik egy .ogv fájl, amelyet a Firefogg (lásd: "Ogg-videók kódolása a Firefogg segítsé­géve!") vagy az ffmpeg2theora (lásd: "Ogg-videók kötegelt kódolása az ffmpeg2theora segítségéve!") használatával hoztunk létre, a második egy .mp4 fájl, amelyet a HandErake-kel (lásd: "H.264-videók kódolása a Hand­Brake segítségéve!") készítettünk el, a harmadik pedig egy .webm fájl, ame­lyet az ffmpeg-gel (lásd: "WebM-videók kódolása az ffmpeg segítségéve!")

5. fejezet Videó a Weben l 159

Page 155: HTML5 - Az új Szabvány

állítottunk elő. A HTML5-ben rendelkezésre áll egy elem, amelyből mind­háromra hivatkozhatunk: a <source>. Minden <video> elem tetszőleges számú <source> elemet tartalmazhat. A böngésző sorban végigmegy a video­források listáján, és az első olyat választja, amelyet képes lejátszani.

Ez felvet egy újabb kérdést: honnan tudja a böngésző, hogy melyik vicleót

tudja lejátszani? Nos, a legrosszabb esetben mindegyiket betölti, és megpró­bálja lejátszani őket, ami persze hatalmas sávszélesség-pazarlás. Ha a bön­gészőt viszont mindegyik videóról előre tájékoztatjuk, jelentősen csökkent­hetjük a hálózati forgalmat. Ezt a <source> elemben elhelyezett type

jellemzővel tehetjük meg:

<videe wid th= "320' height= "240 • centrels>

<seurce src="pr6 .mp4" type=' videe/mp4; cedecs= "avcl. 42E01E, mp4a. 40.2 '" >

<source src="pr6. wetm" type=' videe/webm; cedecs= 'vp8, verbis "' >

<source src="pr6.ogv" type=' videe/egg; cedecs= "theera, verbis" >

</videe>

Nézzük meg részletesen a fenti kódot! A <v ideo> elem meghatározza a videó szélességét és magasságát, de ténylegesen nem hivatkozik egyeden videofájlra sem. A <video> elemen belül azonban van két <source> elem: mindkettő egy-egy videofájlra mutat (az src jellemzővel), és megadja annak formátu­mát (a type jellemzővel).

A type jellemző bonyolultnak tűnik- és bizony az is! Háromféle infor­

mációt tartalmaz: a tá:rolóformátumot (lásd: "Videotárolók"), a videokodeket (lásd: "Videokodekek") és az audiokodeket (lásd: "Audiokodekek"). Kezdjük a lista végével. Az .ogv vicleofájl esetében a tárolóformátum az Ogg, amit itt a video/ogg jelöl. (Ez az Ogg-videofájlok MIME-típusa.) A videokodek a Theora, az audiokodek pedig a Vorbis. Ez elég egyszerű, attól eltekintve, hogy a jellemző értékét kicsit macerás megadni: magának a code cs értéké­nek is idézőjelben kell állnia, ezért a teljes type értéket másfajta idézőjelek közé kell zárnunk:

<seurce sr c= "pr 6. egv • type=' video/ ogg; codecs="theora, vorbis'" >

A WebM-fájl <source> eleme nagyon hasonló, csak a MIME-típus más (video/ogg helyett video/webm), illetve másik videokodek (theora he­lyett vp8) szerepel a codecs paraméteren belül:

<seurce src= "pr 6. webm" type=' video/wetm; codecs="vpB, vorbis"' >

160 l Videó a Weben 5. fejezet

Page 156: HTML5 - Az új Szabvány

A H.264-fájl <source> eleme még bonyolultabb. Emlékszünk még rá, hogy azt mondtam, hogy mind a H.264-videó (lásd:

"H.264"), mind az AAC­

audió (lásd: "Advanced Audio Coding") különféle "profilú" lehet? Mi a kó­dolást a Baseline H.264-profillal és a

"low complexity

" AAC-profillal végez­

tük, majd az egészet egy MPEG-4 tárolába csomagoltuk Ezek az információk mind szerepeinek a type jellemzőben:

<source src= "pr 6 .mp4" type='vicleo/mp4; coclecs="avcl. 42E01E, mp4a. 40 .2'">

Ennek a bonyolult meghatározásnak az az előnye, hogy a böngésző a type jellemzőt megvizsgálva eldöntheti, hogy le tudja-e játszani az adott videofájlt. Ha úgy dönt, hogy erre nem képes, nem tölti le a fájlt - még egy részét sem. Ezzel sávszélességet takarítunk meg, és a látogatóink gyorsabban tekinthetik meg azt a videót, amiért jöttek.

Ha a videóink kódolásakor a fejezet utasításait követjük, egyszerűen be­másolhatjuk a type-jellemzőértékeket az itteni példából - ha nem, akkor magunknak kell kitalálnunk a megfelelő type paramétereket.

Leírókód professzor azt mondja

E könyv írásának idején (2010. május 20-án) az iPad tartalmazott egy hibát, amely megakadályozta, hogy az első felsorolt videoforráson kívül bármit felismerjen. Sajnos ez azt jelenti, hogy az MP4-fájlt kell az első helyre tennünk, és csak az után következhetnek az ingyenes video­formárumok. Sóhaj.

AMIME-típusok beleköpnek a levesbe

A videós kirakósjátéknak annyi darabja van, hogy nem is igazán merem fel­hozni, de muszáj, mert egy rosszul beállított webkiszolgáló végtelen kínlódás­hoz vezethet, amikor megpróbáljuk kideríteni, hogy miért tudjuk lejátszani a videóinkat a saját számítógépünkön, de az üzemi webhelyünkön nem. Ha ebbe a problémába ütközünk, az okot valószínűleg a MIME-típusokban kell keresnünk.

5. fejezet Videó a Weben l 161

Page 157: HTML5 - Az új Szabvány

Az l. fejezetben már említettem a MIME-típusokat, de akkor valószí­nűleg nem mértük fel a jelentőségüket. Így hát megismétlem csupa nagy­betűvel:

Leírókód professzor azt kiabálja

A VIDEOFÁJLOKAT A MEGFELELŐ MIME-TÍPUSSAL KELL SZOLGÁLTATNI!

De mi a megfelelő MIME-típus? Már láttuk: a <source> elem type jellem­zőjében szereplő érték egyik része. A t y pe jellemző beállítása a HTML-kódban azonban nem elég. Arról is gondoskodnunk kell, hogy a webkiszolgáló belefog­lalja a helyes MIME-típust a Content-Type H TTP-fejlécbe.

Ha az Apache webkiszolgálót vagy annak valamelyik rokonát használjuk, Add Type utasításokat használhatunk az egész webhelyre érvényes httpd. conf fájlban vagy a videofájljainkar tároló könyvtár .htaccess fájljában. (Ha más webkiszolgálót üzemeltetünk, nézzünk urána a kiszolgáló dokumentáci­ójában, hogy miként állírhatunk be konkrét fájltípusokat a Content-Type

HTTP-fejlécben.) A következő Add Type urasírásokat kell beszúrnunk:

AddType video/agg .ogv AddType video/mp4 .mp4 AddType video/webm . webm

Az első sor az Ogg-tárolóban elhelyezett, a második az MPEG-4 tárolóha burkolt, a harmadik pedig a WebM-videók típusát adja meg. Ezeket csak egyszer kell beállítanunk, aztán megfeledkezhetünk róluk. Ha viszont nem adjuk meg ezeket a beállításokat, a videóink egyes böngészőkben biztosan nem lesznek lejátszhatók, még akkor sem, ha a H TML-kódban megadjuk a MIME-típust a type jellemzőben.

A webkiszolgáló beállírásának egyéb véres részleteit megtaláljuk a Mozilla Developer Center egyik kitűnő cikkében, amelynek címe "Configuring ser­vers for Ogg media" ("Kiszolgálók beállítása Ogg-médiafájlok számára", https:lldeveloper. mozilla. orglen/Conjiguring_servers_for _ Ogg_media - a cikk­ben olvasható tanácsok az MP4- és WebM-videókra is érvényesek).

162 J Videó a Weben 5. fejezet

Page 158: HTML5 - Az új Szabvány

Mi a helyzet az Internet Explorerrel?

Miközben a könyvet Írtam, a Microsoft megjelentette az Internet Explorer 9

"fejlesztői előzetesét". Ez még nem támogatta a HTML5 <v ideo> elemét, de

a Microsoft nyilvános ígéretet tett (http:l/blogs.msdn.com/ie/archive/2010/03/161 html5-hardware-accelerated-jirst-ie9-platform-preview-available-for-developers. aspx), hogy az IE 9 végleges változata támogatui fogja az MPEG-4 tárolóban elhelyezett, H.264-videosávval és AAC-audiosávval rendelkező videofájlokat, akárcsak a Safari az asztali Mac, illetve a Mobile Safari az iOS rendszereken.

De mi a helyzet az Internet Explorer régebbi változataival- például az IE 8-cal vagy az előtte kiadott változatokkal? Nos, a legtöbb Internet Explorer­

felhasználó telepíti az Adobe Flash bővítményt is, márpedig a Flash újabb változatai (a 9.0.60.184-estől kezdve) támogatják az MPEG-4 tárolóban el­helyezett, H.264-videosávval és AAC-audiosávval rendelkező videofájlokat. A Safarira elkészített H.264 kódolású videókat (lásd a fejezet "H.264-videók kódolása a HandBrake segítségéve!" című részét) lejátszhatjuk egy Flash alapú videolejátszóban is, ha észleljük, hogy a látogató nem rendelkezik HTML5-képes böngészővel.

A FlowPlayer (http://fiowplayer.orgl) egy nyílt forrású, GPL felhasználási engedélyű, Flash alapú videolejátszó. (Kereskedelmi felhasználási engedéllyel is elérhető; lásd a http:llflowplayer.orgldownload/ címen.) A FlowPlayer mit

sem tud a <video> elemről, és nem képes varázslattal Flash-objektummá alakítani egy <v ideo> címkét, de a HTML5-öt felkészítették az ilyen esetek kezelésére, hiszen egy <v ideo> elembe beágyazhatunk egy <obj e ct> ele­met. A HTML5-videókat nem támogató böngészők figyelmen kívül hagyják a <video> elemet, és helyette egyszerűen a beágyazott <object> elemet jelenítik meg, amely meghívja a Flash bővítményt, és lejátssza a filmet a Flow­Playeren keresztül, míg a HTML5-videókat ismerő böngészők megkeresik az általuk lejátszható videoforrást, és azt játsszák le, teljesen figyelmen kívül hagyva a beágyazott <object> elemet.

Az utolsó mondat az egész kirakósjáték kulcsa: a HTML5 kimondja, hogy a <video> elemek minden gyermekét (a <source> elemeket kivéve) telje­

sen figyelmen kívül kell hagyni. Ez teszi lehetövé, hogy az újabb böngészők lejátsszák a HTML5-videókat, miközben a régebbi böngészők elegánsan a Flash-re szorítkoznak, anélkül, hogy bármilyen JavaScript-trükkre lenne

5. fejezet Videó a Weben l 163

Page 159: HTML5 - Az új Szabvány

szükség. A módszerről a Vicleo for Everybody! webhelyén (http:llcamendesign. comlcodelvideo_for_everybody) bővebben is olvashatunk.

Egy teljes példa

Nézzünk meg egy példát, amely a fenti eljárásokat alkalmazza. A Vicleo for Everybody! kódját kiegészítettem, hogy WebM formátumú videó is legyen benne. Az alábbi parancsokkal három formátumban kódoltam a forrásvideót:

U Theora/Vorbis/Ogg

you@localhost$ ffmpeg2theora --videobitrate 200 --max_ size 320x240 --output pr 6 . ogv pr 6 . dv

U H.264/AAC/MP4

you@localhost$ HandBrakeCLI --preset "iPhone & iPod Touch" --vb 200 --width 320 --two-pass --turbo --optimize --input pr 6. dv --output pr 6. mp4

## VP8/Vorbis/WebM

you@localhost$ ffmpeg -pass l -passlogfile pr6. dv -threads 16 -token_ parti tions 4

-altref l -lag 16 -keyint_min O -q 250 -mb_static_threshold O -skip _threshold O -qmin l -qmax 51 -i pr6. dv -vcodec libvpx _ vp8

-an -f rawvideo -yNULffmpeg --videobitrate 200 you@localhost$ ffmpeg -pass 2 -passlogfile pr6. dv -threads 16 -token_ parti tions 4

-altref l -lag 16 -keyint_min O -g 250 -mb_static_threshold O -skip _threshold O -qmin l -qmax 51 -i pr6. dv -vcodec libvpx _ vp8 -b 204800 -s 320x240 -aspect 4:3 -acodec vorbis -ac 2 -y pr6 .mkv

you@localhost$ mltclean --doctype 4 p r 6 .mkv pr6. wel:m

A végleges leírókód egy <vide o> elemet használ a HTML5-videolejátszáshoz, a régebbi böngészők pedig az ebben levő beágyazott <object> elemet játsz­

hatják le a Flash segítségéve!:

<v ideo id= "movie" width= "320" height= "240 n preload controls>

<source src= npr6.mp4" type=' video/mp4; code cs= "avcl. 42E01E, mp4a. 40.2 "' />

<source src= npr6. webm" type=' video/webm; codecs= "vp8, vorbis "' l>

<source src= "pr 6. ogv" type=' video/ogg; code cs= ''theora, varbis '" l>

<object width= "320" height= "240" type= "application/x-shockwave-flash"

data="flowplayer-3.2.l.swf">

<par am name= "movie" value= "flowplayer-3. 2 .l. swf" l>

<par am name= "allowfullscreen" value= "true" />

<par am name= "flashvars" value=' config= {

"eli p": {"url n: "http: l /wearehugh. com/dihSigood/bbb _ 480p.mp4 ",

164 l Videó a Weben 5. fejezet

Page 160: HTML5 - Az új Szabvány

•autoPlay •: false, •autoBuffering •: true l l' />

<p> Download v ideo as <a href= "pr 6 .mp4 ">MP4</a>,

<a href= "pr 6. webm ">WebM</ a>, or

<a href= "pr 6. ogv ">Ogg</ a>. </p>

</object>

</video>

A HTML5 és a Flash együttes használatával a vicleót szinte bármely böngé­szőben és eszközön megtekinthetjük

További olvasmányok

• "The <v ideo> element" a HTML5 szabványleírásában (http://bit.lyla3kpiq) • Vicleo for Everybody! (http:llcamendesign.com/codelvideo_for_everybody) • "A gen de introduction to v ideo eneadin g" (http:lldiveintomark. orgltaglgive) • Christopher Blizzard: "Theora l. l is released-what you need to know

"

(http:llhacks. mozilla. org/2009/09/theora-1-1-re!eased/) •

"Configuring servers for Ogg media" (https:lldeve!oper.mozil!a.orglen/Con­

figuring_servers_for _ Ogg_media) • "Encoding wi th the x264 codec" (http:llwww.mplayerhq.hu/DOCSIHTMLI

enlmenc-feat-x264. html) •

"Video type parameters" (http://wiki.whatwg.orglwiki/Video_type_para­

meters} • Zeneader Vicleo JS (http://videojs.com)- egyéni vezérlők HTML5-videókhoz • Simon Pieters:

"Everything you need to know about HTML5 audio and

v ideo" (http:lldev. opera. comlartic!es/viewleverything-you-need-to-know-about­htm!5-video-and-audiol )

Page 161: HTML5 - Az új Szabvány

6. fejezet

Itt áll ön (és mindenki más)

Ugorjunk fejest!

A helymeghatározás (geolokáció) annak a művészete, hogy kiderítsük, hol is vagyunk a világban, és (ha akarjuk), megosszuk ezt az információt azokkal, akikben megbízunk. A tartózkodási helyünkről sok minden árulkodik - az

IP-címünk; a drót nélküli hálózati kapcsolatunk; az adótorony, amellyel a mo­biltelefonunk kommunikál; de egy GPS-eszköz is megmondhatja a szélességi és a hosszúsági fokot az űrben keringő műholdakról kapott információk alapján.

Kérdezzük meg Leírókód professzort!

Kérdés: A helymeghatározás veszélyesnek tűnik. Ki lehet kapcso/ni?

Válasz: Természetes, hogy nem szívesen osztunk meg olyan magánjel­legű információkat, mim a tartózkodási helyünk, egy távoli webkiszol­gálóvaL A Geolocation API egyértelműen kimondja (http://www.w3.

org/TR/geolocation-API/#security), hogy "a böngészőknek nem szabad

a helyre vonatkozó információkar áradniuk a webhelyeknek a felhasz­náló kifejezett engedélye nélkül". Más szavakkal, ha nem akarjuk el­árulni a tartózkodási helyünket, nem kell.

A Geolocation API

A Geolocation API segítségével megbízható webhelyekkel oszthatjuk meg a tartózkodási helyünket. Az oldalon található JavaScript-kód hozzáfér a szé­lességi és hosszúsági fokhoz, és ezt az információt a távoli webkiszolgálónak

6. fejezet Itt áll ön (és mindenki más) l 167

Page 162: HTML5 - Az új Szabvány

elküldve olyan helyfüggő műveleteket végezhet, mint a helyi üzletek keresése vagy a tartózkodási helyünk megjelenítése egy térképen.

Ahogy a 6.1. táblázatból láthatjuk, a helymeghatározó API-t a fontosabb asztali és mobil böngészők többsége támogatja. Ezen felül burkolókönyvtárak segítségével egyes régebbi böngészők és eszközök is képessé tehetök a haszná­latára- ezt is látni fogjuk a fejezet későbbi részében.

6.1. táblázat A Geolocation API támogatása

3.5+ 5.0+ 5.0+ 3.0+ 2.0+

A szabványos helymeghatározó API mellett a mobileszközök különféle esz­közfüggő programozási felületeket is támogatnak, amelyekről szintén szót ejtünk majd ebben a fejezetben.

Mutasd a kódot!

A helymeghatározó API középpontjában a globális navigator objektum egy új tulajdonsága áll: a navigator .geolocation. A helymeghatározó API legegyszerűbb használata így fest:

function get _location () { navigator.geolocation.getCurrentFosition(show_map);

Nincs képességérzékelés, nincs hibakezelés, és nincsenek kapcsolók. A web­alkalmazásnak azonban ezek közül legalább az első kettőre szüksége szokott lenni. A helymeghatározó API támogatásának észlelésére (lásd a 2. fejezet "Helymeghatározás" című részét) a Modernizr-t használhatjuk:

function get _location () {

}

if (Modernizr.geolocation) { navigator.geolocation.getCurrentPosition(show_map);

} else { l l nincs beépített támogatás; próbáljuk meg esetleg a Gearst?

}

Az, hogy mit csinálunk, ha a helymeghatározó API nem támogatott, csak tőlünk függ. A Gears használatár, mint alapértelmezett helyettesítő megol-

168 l Itt áll ön (és mindenki más) 6. fejezet

Page 163: HTML5 - Az új Szabvány

dást, hamarosan elmagyarázom, de először arról szeretnék szót ejteni, hogy mi történik a getCurrentPosition () hívás közben. Ahogy a fejezet elején említettem, a helymeghatározás támogatása engedélyezéshez kötött. Ez azt jelenti, hogy a böngészőnk soha nem fog arra kényszeríteni minket, hogy fedjük fel az aktuális tartózkodási helyünket egy távoli kiszolgálónak. A fel­

használó által tapasztalt viselkedés minden böngészőben más és más: a Mozilla

Firefaxban a Geolocation API getCurrentPosition () függvényének meg­hívása azt eredményezi, hogy a böngésző egy

"információs sávot" jelenít meg

a böngészőablak tetején. Az információs sáv kinézetét a 6.1. ábrán láthatjuk.

cfrveintohtm15.org wants to lmow your location. � l Shtrc location J l ()g_n t Share J � .R�ember for this srte x

6.1. ábra A helymeghatározó információs sáv

Az információs sáv megjelenése a következőkről tájékoztat minket, mint vég­felhasználókat, illetve a következő műveletekre és döntésekre ad lehetőséget:

• Közli, hogy egy webhely tudni szeretné a tartózkodási helyünket. • Közli, hogy melyik webhely szeretné tudni a tartózkodási helyünket. • Egy kattintással a Mozilla

"Location-Aware Browsing" ("Tartózkodási

helyet figyelembe vevő böngészés") cím ű súgóoldalára ugorhatunk, amely elmagyarázza, miről is van szó.

• Engedélyezhetjük a tartózkodási helyünk megosztását. • Megtilthatjuk a tartózkodási helyünk megosztását.

• Utasíthatjuk a böngészőt, hogy jegyezze meg, mit választottunk (a meg­

osztását engedélyezését vagy letiltását), így a szóban forgó információs sáv többé nem fog megjelenni az adott webhely meglátogatásakor.

Az információs sáv ezen kívül

• nem modális, tehát nem akadályozza meg, hogy másik böngészőablakra vagy -lapra váltsunk,

• laphoz kötődö, tehát eltűnik, ha másik böngészőablakra vagy -lapra vál­

tunk, és újra megjelenik, amikor visszakapcsolunk az eredeti lapra, • feltétlenül megjelenik, tehát egy webhely semmiképpen nem kerülheti meg,

• blokkoló, tehát a webhely nem képes kideríteni a tartózkodási helyün­ket, amíg a válaszunkra vár.

6. fejezet Itt áll ön (és mindenki más) l 169

Page 164: HTML5 - Az új Szabvány

Kicsit feljebb láttuk a JavaScript-kódot, amelynek a hatására megjelenik az említett információs sáv. Egy egyszerű függvényhívásról van szó, amelynek a paramétere egy visszahívó függvény (itt show _ map() néven). A getCurrent

Pos i t ion () hívás azonnal visszaadja a vezérlés t, de ez nem jelenti azt, hogy elérhetjük a felhasználó tartózkodási helyét. A tartózkodási helyről először

a visszahívó függvényben kapunk biztosan információt. A visszahívó függ­vény így fest:

function show_ map (pos i ti on)

var latitude = position. coords .latitude;

var longi tu de = pos i ti on. coords .longi tud e;

l l Jelenítsünk meg egy térképet, vagy csináljunk valami érdekeset!

l

A visszahívó függvény egyetlen paraméterrel hívódik meg; ez a paraméter egy objektum, amelynek két tulajdonsága van: a coords (koordináták) és a timestamp (időbélyeg). Az időbélyeg pontosan az, amire a neve utal: a tartózkodási hely kiszámításának dátuma és ideje. (Mivel a művelet aszink­ron módon történik, nem tudhatjuk előre, hogy ez mikor következik be. A felhasználónak időbe telhet, amíg elolvassa az információs sávot, és bele­

egyezik, hogy megossza a tartózkodási helyét; a GPS-sel felszerelt eszközök­nek időbe telhet, amíg kapcsolódnak egy GPS-műholdhoz, és így tovább.) A coords objektumnak olyan tulajdonságai vannak, mint a l atitude

(szélességi fok) és a longitude (hosszúsági fok), amelyek pontosan azt adják

meg, amire a nevük ural: a felhasználói földrajzi helyét. A position objek­tum tulajdonságait a 6.2. táblázat sorolja fel.

6.2. táblázat A position objektum tulajdonságai

Tu

coords.latitude

coords.longitude

coords.altitude

coords.accuracy

double

double

double vagy null

double

coords. al ti tudeAccuracy double vagy null

coords.heading

coords.speed

timestarop

double vagy null

double vagy null

DOMTimeStamp

170 l Itt áll ön (és mindenki más)

tizedfok pontossággal

tizedfok pontossággal

az alapfelületi ellipszoid felett. méterben

méterben

méterben

a valódi északtól számított fokban, az

óramutató járása szerint

méter/másodpercben

Olyan, mint egy Da te ( ) objektum

6. fejezet

Page 165: HTML5 - Az új Szabvány

Ezek közül csak három tulajdonság (coords .lati t u de, coords .longi tud e

és coords. accuracy) jelenléte garantált. A többi null értéket is kaphat, az eszköz és a vele kommunikáló helymeghatározó háttérkiszolgáló képessé­geitől függően. A heading (irány) és spe ed (sebesség) tulajdonságok kiszá­mítása a felhasználó előző tartózkodási helye alapján történik (amennyiben ez rendelkezésre áll).

A hibák kezelése

A helymeghatározás bonyolult, mert sok minden kisiklathatja a műveletet. A

"felhasználói beleegyezést" már említettem. Ha a webalkalmazásunk meg

szeretné tudni a felhasználó tartózkodási helyét, de a felhasználó nem akarja megadni azt, meg vagyunk lőve. Mindig a felhasználó nyer. De hogyan fest mindez kódban? Úgy tűnik, a g etCurrentPosition() függvénynek egy második paramétert kell átadnunk- egy hibakezelő visszahívó függvényt:

navigator.geolocation.getCurrentPosition( show_map, handle_error)

Ha bármi félresiklik, a hibakezelő függvényünk hívódik meg egy Po sition

Error objektummaL Ennek az objektumnak a tulajdonságait a 6.3. táblá­zatban láthatjuk.

6.3. táblázat A PositionError objektum tulajdonságai

nous ések

code short felsoroló érték

messa_g_e DOMString nem a vé_g_felhasználóknak szánva

A code tulajdonság értéke a következők egyike lehet: • PERMISSION _ DENlED (l) -"A hozzáférés megragadva": ezt az érté­

ket akkor kapjuk, ha a felhasználó a Don' t Share (Nincs megosztás) gombra kattint, vagy más módon megragadja, hogy hozzáférjünk a tartózkódási helyéhez.

• POSITION _ UNAVAILABLE (2) -"A hely nem hozzáférhető": ezt az értéket akkor kapjuk, ha nincs hálózati kapcsolat, vagy ha a helymegha­tározó műholdakat nem lehet elérni.

6. fejezet Itt áll ön (és mindenki más) J 171

Page 166: HTML5 - Az új Szabvány

• TIMEOUT (3) -"Időtúllépés": ezt az értéket akkor kapjuk, ha a hálózati kapcsolat él ugyan, de túl sokáig tart kiszámítani a felhasználó tartózko­dási helyét. Mennyi idő számít "túl soknak

"? A következő részben meg­

mutatom, hogyan határozhatjuk meg. • UNKNOWN _ERROR (0) -"Ismeretlen hiba

": ezt az értéket akkor kap­

juk, ha bármilyen más hiba lép fel. Például:

function handle _error (err) { if (err.code=l) { l l A felhasználó nemet mondott 1

Kérdezzük meg Leírókód professzort!

Kérdés: A helymeghatározó API a Nemzetközi Ürállomáson, a Holdon és más bolygókan is müködik? Válasz: A Geolocation API szabványleírása (http:llwww.w3.org/TRI geolocation-API/#coordinates_interfoce} ezt mondja:

"A fóldrajzi vonat­

koztatási rendszer, amelyet e felület jellemzői használnak, a World Geodetic System (2d) [WGS84] (geodéziai világrendszer). Egyetlen más vonatkoztatási rendszer sem támogatott." A Nemzetközi Űrállomás Föld körüli pályán mozog, ezért az állomáson tartózkodó űrhajósok (http:!!twitter.com/Astro_Tj) a helyzetüket le tudják írni szélességi és hosszúsági fokokkal, illetve magassággaL A geodéziai világrendszer ugyanakkor Föld-központú, ezért nem használható helymeghatáro­zásra sem a Holdon, sem más bolygókon.

Választást! Szabad választást!

Egyes népszerű mobileszközök -például az iPhone és az Android telefonok - két módszerét támogatják a tartózkodási hely meghatározásának. Az első módszer háromszögeléssei számítja ki a helyzetünket a telefonszolgáltatónk különböző adótornyaihoz viszonyított közelségünk alapján. Ez a módszer

172 l Itt áll ön (és mindenki más) 6. fejezet

Page 167: HTML5 - Az új Szabvány

gyors, és nem igényel semmilyen különleges GPS-hardvert, viszont csak durva közelítéssel adja meg, hogy hol tartózkodunk. Attól függően, hogy hány mobiladótorony van a körzetünkben, ez a

"durva közelítés" lehet csupán

egy háztömbnyi, de akár minden irányban plusz-mínusz egy kilométer is.

A második módszer ezzel szemben valóban az eszközünk GPS-hardverét használja, hogy kommunikáljon a Föld körül keringő helymeghatározó mű­holdakkal. A GPS általában néhány méter pontossággal képes megállapítani a helyünket. A hátránya az, hogy a mobileszközök GPS-lapkája sok energiát

fogyaszt, ezért a telefonok és más általános célú mobileszközök többnyire kikapcsolják a lapkát, amíg ténylegesen szükség nincs rá. Ez azt jelenti, hogy némi időt igényel, amíg a lapka kapcsolatot teremt az űrben keringő GPS­műholdakkal. Ha valaha is használtuk a Google Maps szolgáltatást egy iPhone-készüléken vagy más okostelefonon, már mindkét módszert láttuk mű­

ködés közben. Először egy nagy kör jelenik meg, amely hozzávetőlegesen mutatja a helyzetünket (a legközelebbi mobiladótorony alapján), majd egy kisebb kör

(a más adótornyokkal végzett háromszögelés alapján), végül pedig egy pont, ami a pontos helyzetünket mutatja (a GPS-műholdaktól kapott adatok szerint).

Azért írom le mindezt, mert a webalkalmazásunktól függően nem biztos, hogy nagy ponrosságra van szükségünk. Például ha a közelben levő mozik

műsorára vagyunk kíváncsiak, valószínűleg az "alacsony pontosságú" hely­

meghatározás is elegendő. Annyira nincs sok filmszínház, még a sűrűn lakott

városokban sem, és valószínűleg magunk is ismerünk néhányat. Ha viszont valós idejű útbaigazítást adunk sarokról sarokra, pontosan tudnunk kell a fel­használó helyét, hogy azt mondhassuk: "20 méteren belül fordulj jobbra" (vagy valami ilyesmit).

A getCurrentPasi t ion() függvény egy nem kötelező harmadik para­métert is elfogad: egy PositionOptions objektumot. A PositionOptions

objektumoknak három tulajdonsága állítható be (lásd a 6.4. táblázatot). Egyik tulajdonság megadása sem kötelező: beállírhatunk egyet, kettőt vagy hármat, de akár el is hagyhatjuk mindet.

6.4. táblázat A PositionOptions objektum tulajdonságai

enableHighAccuracy

timeout

maximumA9:e

6. fejezet

boolean

long

long_

rtetmezés

false

(nincs alapértelmezés)

o

a true lassabb lehet

ezredmásodpercben

ezredmásode.ercben

Itt áll ön (és mindenki más) l 173

Page 168: HTML5 - Az új Szabvány

Az enableHighAccuracy ("nagy pontosság engedélyezése") tulajdonság pontosan arra való, amire a neve utal: ha true-ra állítjuk, és az eszköz támo­gatja, illetve a felhasználó is beleegyezik, hogy megossza a pontos helyzetét, az eszköz megpróbálja kideríteni a pontos helyet. Az alacsony és a nagy pon­tosságú helymeghatározást az i Phone és Android telefonokon egyaránt külön

kell engedélyezni, ezért előfordulhat, hogy a getCurrentPosition() hí­vása enableHighAccuracy: true értékkel kudarcot vall, de enableHigh

Accuracy: false értékkel sikerrel jár. A timeout tulajdonság azt adja meg, hogy a webalkalmazásunk hány

ezredmásodpercet hajlandó várni a helymeghatározásra. Az időzítő csak az után kezd visszaszámolni, hogy a felhasználó engedélyt adott a helyzete ki­számítására, tehát nem a felhasználónak ketyeg az óra, hanem a hálózatnak.

A maximumAge tulajdonság lehetővé teszi az eszköznek, hogy azonnal visszaadjon egy elraktározott helyzetet. Tegyük fel például, hogy első alka­lommal hívjuk meg a getCurrentPasi t ion() függvényt. A felhasználó engedélyezi a műveletet, az ehhez kötött visszahívó függvény ("success_ callback") pedig egy olyan helyzettel hívódik meg, amelynek a kiszámítása pontosan délelőtt 10 órakor történt. Pontosan egy perccel később (de. 10:01-

kor) ismét meghívjuk a getCurrentPasi t ion () függvényt, a maximumAge

tulajdonságnak a 75000 értéket adva:

navigator.geolocation.getCurrentPosition(

success _ callback, error_ callback, { maximumAge: 7 500 0}) ;

Itt azt mondjuk, hogy nem feltétlenül a felhasználó jelenlegi helyzetére vagyunk kíváncsiak; azzal is megelégszünk, ha tudjuk, hol volt 75 másod­perccel (75 OOO ezredmásodperccel) ezelőtt. Esetünkben az eszköz azt tudja, hogy hol tartózkodott a felhasználó 60 másodperccel (60 OOO ezredmásod­perccel) korábban, mert kiszámította a helyzetét, amikor először hívtuk meg a getCurrentPos it ion() függvényt. Mivel ez a megadott időtartomá­nyon belülre esik, az eszköz nem vesződik azzal, hogy ismét kiszámalja a fel­használó helyzetét, hanem pontosan azt az információt adja vissza, amit az első alkalommal: ugyanazt a szélességi és hosszúsági fokot, ugyanazt a pon­tosságot, és ugyanazt az időbélyeget (10:00 AM).

Mielőtt azonban lekérdeznénk a felhasználó helyzetét, végig kell gondol­nunk, hogy milyen ponrosságra van szükségünk, és ennek megfelelően kell beállítanunk az enableHighAccuracy tulajdonságot. Ha a felhasználó

174 l Itt áll ön (és mindenki más) 6. fejezet

Page 169: HTML5 - Az új Szabvány

helyét egynél többször kell meghatároznunk, azt is tisztáznunk kell, hogy legfeljebb milyen régi lehet az információ ahhoz, hogy még hasznát vehessük, és ennek megfelelően be kell állítanunk a maximumAge tulajdonság értékét is. Ha viszont folyamatosan kell figyelnünk a felhasználó helyzetét, akkor

a getCurrentPosition () függvény nem felel meg nekünk- helyette a watchPosition() függvényt kell használnunk.

A watchPosition () függvény felépítése megegyezik a getCurrent

Po sition () függvényével: ugyanúgy két visszahívó függvényt kell megad­nunk neki - egyet siker, egyet pedig kudarc esetére -, és ugyanúgy elfogad egy PositionOptions objektumot (az imént látott tulajdonságokkal). A különbség annyi, hogy a visszahívó függvény minden alkalommal meghívódik, amikor a felhasználó helyzete megváltozik Nincs szükség tehát a tartózko­dási hely aktív lekérdezésére: az eszköz határozza meg az optimális lekérdezési időközt, és gondoskodik a visszahívó függvény meghívásáról, amikor úgy ítéli meg, hogy a felhasználó helyet változtatott. Ezt felhasználhatjuk például

arra, hogy egy térképen jelezzük a felhasználó mozgását; utasításokat adjunk neki, hogy merre menjen; és így tovább. A lehetőségeknek csak a fantáziánk

szab határt. Maga a watchPosition() függvény egy számot ad vissza, amelyet

érdemes elraktároznunk valahol. Ha már nem kívánjuk figyelni a felhasz­náló helyváltoztatását, ezt a számot átadva hívjuk meg a clearWatch ()

függvényt, és az eszköz abbahagyja a visszahívó függvényünk hívogatását. A dolog ugyanúgy működik, mint a JavaScriptben a setinterval () és clearinterval () függvények.

Mi a helyzet az Internet Explorerrel?

Az Internet Explorer nem támogatja a W3C helymeghatározó API-ját, amely­ről eddig beszéltünk (lásd a fejezet "A Geolocation API" dmű részét), de ne essünk kétségbe. AGears (http:lltools.google.comlgearsl) egy nyílt forrású bön­gészőbővítmény a Google cégtől, amely Windowson, Macen, Linuxon, vala­

mint Windows Mobile és Android rendszereken is működik, és különféle szolgáltatásokat biztosít a régebbi böngészők számára - többek között egy helymeghatározó API-t. Ez a programozási felület nem teljesen azonos a W3C Geolocation API-jával, de ugyanazt a célt szolgálja.

6. fejezet Itt áll ön (és mindenki más) l 175

Page 170: HTML5 - Az új Szabvány

Ha már a régi rendszereknél tartunk, szeretnék rámutatni, hogy a mobil­telefonokon az eszköztől függően különféle helymeghatározó API-kkal talál­kozhatunk. A BlackBerry, a Nokia, a Palm és az OMTP BOND I mind saját helymeghatározó felületet biztosítanak, amelyeknek a működése természe­tesen eltér a Gearsétől, ami viszont másképp működik, mint a W3C Geo­location API-ja . . .

A felmentő sereg: geo.js

A geo.js (http:llcode.google.comlplgeo-location-javascriptl) egy nyílt forrású, MIT felhasználási engedélyű JavaScript-könyvtár, amely elsimítja a különb­ségeket a W3C helymeghatározó API-ja, a Gears API-ja és a mobileszközök által kínált különféle API-k között. A használatához két <script> elemet kell beszúrnunk az oldalunk aljára. (Elméletileg bárhová tehetjük ezeket, de a <head> részben elhelyezett parancsfájlok lelassítják az oldal betöltését, ezért ne oda tegyük őket!)

Az első parancsfájl a gears_init.js (http:llcode.google.comlapislgearslgears_ initjs), amely előkészíti a Gearst, amennyiben az telepítve van, a másik pa­rancsfájl pedig a geo.js (http:llgeo-location-javascript.googlecode.comlsvnltrunkl jslgeojs}. Az oldalba például az alábbihoz hasonló kóddal szúrhatjuk be őket:

<! DOCTYPE html>

<html>

<head>

<me ta char set= "utf-8 ">

<title>Dive Into HTML 5</title>

</head>

<body>

<script src=" gears _ini t. js "X/ script> <script src=" geo. js "X/ script>

</body>

</html>

Most már készen állunk bármelyik telepített helymeghatározó API használatára:

if (geo_position_js.init()) { geo_position_js.getCurrentPosition(geo_success, geo_error);

)

176 l Itt áll ön (és mindenki más) 6. fejezet

Page 171: HTML5 - Az új Szabvány

Nézzük végig egyenként a lépéseked Először is, kifejezetten meg kell hívnunk egy init() függvényt, amely true-t ad vissza, ha valamelyik támogatott helymeghatározó API elérhető:

if (geo_yosition_js.init()) {

Az i n i t () függvény meghívásával még nem derítjük ki a felhasználó tartóz­

kodási helyét, csupán arról bizonyosodunk meg, hogy a helymeghatározás lehetséges. Ahhoz, hogy ténylegesen megtudjuk a felhasználó helyzetét, meg

kell hívnunk a getCurrentPosition() függvényt:

geo_yosition_js.getCurrentPosition(geo_success, geo_error);

A getCurrentPosition() függvény hatására a böngésző engedélyt kér a felhasználótól, hogy meghatározza és megossza a tartózkodási helyét. Ha a

helymeghatározást a Gears biztosítja, egy párbeszédablak jelenik meg, amely

azt kérdezi, hogy a felhasználó megbízik-e a webhelyben annyira, hogy meg­engedje neki a Gears használatár. Ha a böngésző beépítve támogatja a Geo­

location API-t, a párbeszédablak másképp fog kinézni. A Firefox 3.5 például egy információs sávot jelenít meg az oldal tetején, és a felhasználó ezen enge­délyezheti a helyzete megosztását a webhelyünkkeL

A getCurrentPosition () függvény paraméterként két visszahívó

függvényt vár. Ha a getCurrentPosition () függvény sikeresen megha­

tározta a felhasználó helyzetét - vagyis a felhasználó engedélyt adott erre, és a Geolocation API el is végezte a feldarát -, az első paraméterként kapott

függvényt hívja meg. Az alábbi példában a siker viszahívó függvénye a geo success nevet viseli:

geo_position_js.getCurrentPosition(geo_success, geo_error);

Ez a visszahívó függvény egyeden paramétert vár, amelyben a tartózkodási helyet leíró adatok találhatók:

function geo_success (p) { alert ('Found you at latitude • + p.coords .latitude + " longitude "+p.coords.longitude);

}

Ha a getCurrent Po sition () függvény nem tudta kideríteni a felhasználó

tartózkodási helyét - vagy azért, mert a felhasználó ezt nem engedélyezte; vagy azért, mert a helymeghatározó API nem járt sikerrel valamilyen okból

6. fejezet Itt áll ön (és mindenki más) J 177

Page 172: HTML5 - Az új Szabvány

kifolyólag-, akkor a második paraméterként kapott függvényt hívja meg. Az alábbi példában a kudarc viszahívó függvénye a ge o _ error nevet viseli:

geo_position_js.getCurrentPosition(geo_success, geo_error);

Ennek a visszahívó függvénynek nincsenek paraméterei:

function geo _error () ( alert ('Could not find you! ' );

J

A geo.js jelenleg nem támogatja a watehPosition () függvényt. Ha folya­

matos helymeghatározásra van szükségünk, magunknak kell újra és újra le­

kérdeznünk a helyet a getCurrentPosition () függvénnyeL

Egy teljes példa

Nézzünk végig egy példát arra, hogy a geo.js segítségével hogyan deríthetjük ki a felhasználó helyzetét, és jeleníthetünk meg egy térképet a közvetlen kör­

nyezetéről! Amikor az oldal betöltődik, meg kell hívnia a geo _ position _js.

init() függvényt, hogy megállapítsa, hogy van-e lehetőség helymeghatáro­zásra a geo.js által támogatott valamelyik felületen keresztül. Ha igen, akkor létrehozhatunk egy hivatkozást, amelyre kattintva a felhasználó kiderítheti a helyzetét. A hivatkozásra kattintás az alább látható lookup _ loeation ()

függvényt hívja meg:

function lookup _location () geo_position_js.getCurrentPosition(show_map, show_map_error);

)

Ha a felhasználó engedélyt ad a helyzete nyomon követésére, és a háttérszal­gáitatás ténylegesen képes megállapítani a helyzetét, a geo.js meghívja az első, show _map() nevű visszahívó függvényt, a loe nevű egyetlen paraméter­rel. A loe objektum eoords tulajdonsága tartalmazza a szélességi és hosz­szúsági fokot, valamint a helymeghatározás pontosságát leíró információkat.

(Ez utóbbit nem használjuk fel ebben a példában.) A show _ map() függ­vény többi része egy beágyazott térképet jelenít meg a Google Maps API se­

gítségéve!:

178 l Itt áll ön (és mindenki más) 6. fejezet

Page 173: HTML5 - Az új Szabvány

function show_ map (loe) { $("1geo-wrapper") .css({'width' :'320px','height' :'350px' )); var map� new GMap2 (document .getElementByid ( "geo-wrapper ')); var center� new GLatLng (loe. eoords .latitude, loe. coords. longitudel; map.setCenter(center, 14);

map. addControl (new GSmallMapControl () ) ; map. addControl (new GMapTypeControl ()); map.addOverlay (new GMarker (center, {draggable: false, title: 'You a re here

(more or less) ")));

)

Amennyiben a geo.js nem képes meghatározni a helyzetet, a második vissza­hívó függvényt, a show_ map_ error()-t hívja meg:

function show_ map_ error () { $ ( '#live-geolocation ") .html (' Unable to determine your location.');

)

További olvasmányok

• A W3C helymeghatározó API-ja (http://www. w3.org!TR!geolocation-APII) • Gears (http://tools.google. comigears/j • A BlackBerry helymeghatározó API-ja (http:llwww.tonybunce.com/2008/

05108/Blackberry-Browser-Amp-GPS. aspx) • A Nokia helymeghatározó API-ja (http:llwww.forum.nokia.com/infocenterl

index.jsp?topic=!Web_Developers_Library!GUID-4DDE3IC7-ECOD-4EEC-BC3A-AOB0351154F8. html)

• A Palm helymeghatározó API-ja (http:l!developer.palm.comlindex.php? option=com_content&view=article&id=1673#GPS-getCurrentPosition)

• Az OMTP BONDI helymeghatározó API-ja (http:llbondi.omtp.org!I.O/ apislgeolocation. h tm l)

• geo.js (http:llcode.google.comlplgeo-location-javascriptl)- a helymeghatá­rozó API burkoló parancsfájlja

Page 174: HTML5 - Az új Szabvány

7. fejezet

A helyi tárolás múltja, jelene és jövője

a webalkalmazásokban

Ugorjunk fejest!

A maradandó helyi tárolás az egyik olyan terület, ahol a beépített ügyfélprog­rarnak hagyományosan előnyt élveznek a webalkalmazásokkal szemben. A beépített alkalmazások számára az operációs rendszer jellemzően egy el­vont réteget biztosít az olyan, alkalmazáshoz kapcsolódó adatok tárolására és

kinyerésére, mint a felhasználói beállítások vagy a futási állapot. Ezek az adatok tárolódhatnak a rendszerleíró adatbázisban (beállírásjegyzékben), INI-fájlokban, XML-fájlokban és más helyeken is, a rendszer hagyományai­nak megfelelően. Ha egy beépített ügyfélalkalmazásnak a kulcs-érték páro­kon túlmutató helyi tárolásra van szüksége, használhat saját adatbázist, saját

fájlformátumot vagy más, tetszőleges megoldást. A webalkalmazások hagyományosan nem rendelkeznek ilyen luxusszol­

gáltatásokkal. A Világháló történetének korai időszakában feltalálrák ugyan a sütiket (cookie), amelyek valóban használhaták is kis mennyiségű információ maradandó helyi tárolására, de számos hátrányuk van, amelyek válóoknak bizonyulharnak:

• A sütiket minden HTTP-kérelemhez mellékelni kell, ami szükségtelenül lelassítja a webalkalmazást, hiszen ugyanazokat az adarokat küldjük el újra és újra.

• A sütiket a HTTP-kérelmekhez mellékeljük, ami azt jelenti, hogy az adatokat titkosírás nélkül küldjük el az Interneten át (kivéve akkor, ha

a teljes webalkalmazás SSL-kapcsolaton keresztül működik). • A sütik legfeljebb 4 KB adatot tárolhatnak. Ez elég ahhoz, hogy lelassítsa

az alkalmazást (lásd feljebb), de ahhoz már kevés, hogy igazán hasznos legyen.

7. fejezet A helyi tárolás múltja, jelene és jövője ... l 181

Page 175: HTML5 - Az új Szabvány

Amire ténylegesen szükségünk van: • Jelentős méretű tárolóhely ... • az ügyfélgépen ... • amely oldalfrissítés után is megőrzi a tartalmár ... • és nem küldi el azt a kiszolgálónak.

Ezeknek a céloknak az elérésére számos megoldás született, de végsősoron -így vagy úgy - egyik sem bizonyult kielégítőnek.

A helyi tárolásra a HTMLS előtt alkalmazott trükkök

rövid története

Kezdetben csak az Internet Explorer létezett - legalábbis a Microsoft azt akarta, hogy a világ ezt higgye. Ennek érdekében az első Nagy Böngészőhá­ború ideje alatt a Microsoft egy csomó dolgot talált fel és épített be "a böngé­szőbe, amely örökre véget vet minden böngészőháborúnak", vagyis az Internet Explorerbe. Ezek egyike volt a D HTML Behaviors ("D HTML-viselkedések"

vagy "DHTML-műveletek"), amelynek a részét képezte a userData ("fel­használói adatok") nevű "viselkedés".

A userDate tartományonként 64 KB-nyi, hierarchikus XML alapú szer­kezetben elhelyezett adat tárolását teszi lehetővé a weboldalaknak (A meg­bízható tartományok - például az intraneres vagy belső hálózati webhelyek -tízszer ennyi adatot tárolhatnak 640 KB-nak elégnek kell lennie bárkinek, nem?) Az IE nem jelenít meg semmilyen engedélykérő párbeszédablakot, és nem engedi meg a rendelkezésre álló tárolóhely növelését sem.

2002-ben az Adobe beépített egy szolgáltatást a Flash 6-ba, amely a sze­rencséden és félrevezető "Flash-sütik" néven vált ismertté, de a Flash-kör­nyezeten belül Local Shared Objects (röviden LSO, magyarul "helyi megosz­tott objektumok") a tisztességes neve. Az LSO röviden annyit csinál, hogy lehetővé teszi a Flash-objektumoknak, hogy tartományonként akár 100 KB adatot tároljanak 2005-ben Brad Neuberg kifejlesztette a Flash-JavaScript híd egy korai prototípusát, amelyet AJAX Massive Storage Systemnek (AMASS) nevezett el, de ezt korlátok közé szorította a Flash néhány tervezési furcsasága. 2006-ra - az Externallnterface megjelenésével a Flash 8-ban- az LSO-k JavaScript-kódból történő elérése nagyságrendekkel könnyebbé és

182 l A helyi tárolás múltja, jelene és jövője ... 7. fejezet

Page 176: HTML5 - Az új Szabvány

gyorsabbá vált. Brad átírta az AMASS-t, és do j ox. s torage néven beépítette a népszerű Dojo Toolkitbe. Ennek a megoldásnak köszönhetőerr minden tar­tomány "ingyen" megkapja a szokásos 100 KB tárolóhelyet, ráadásul a fel­használó nagyságrendenként (l MB, 10 MB stb.) eldöntheti, hogy növeli-e a tárolóhely méretét.

2007-ben aztán a Google útjára bocsátotta a Gearst- azt a nyílt forrású böngészőbővítményt, amelyet azzal a céllal készítettek, hogy kiegészítő ké­pességekkel lássa el a böngészőket. (A Gearsről korábban már ejtettünk szót, amikor a helymeghatározó API támogatásáról beszéltünk az Internet Explo­rerben - lásd az előző fejezet "Mi a helyzet az Internet Explorerrel?" című részét.) A Gears egy az SQLite-on alapuló beágyazott SQL-adatbázishoz nyújt felületet. AGearsnek csak egyszer kell megszereznie a felhasználó en­gedélyét, és tartományonként korládan mennyiségű adatot tárolhat az SQL­adatbázis tábláiban.

Közben Brad Neuberg és mások folytatták a dojox.storage felturbó­zását, hogy egységes felületet biztosítsanak a különböző bővítményekhez és API-khoz. 2009-re a do j ox. starage képessé vált önműködően észlelni (és egységes felülettel ellátni) az Adobe Flash, a Gears és az Adobe AIR táro­lóit, valamint a HTML5-tároló korai prototípusát, amelyet csak a Firefax régebbi változataiban valósítottak meg.

Ha áttekintjük ezeket a megoldásokat, kirajzolódik egy minta: minden megoldás vagy egy adott böngészőhöz kötődik, vagy egy külső bővít­ményre támaszkodik. A megoldások a különbségek kiegyengetésére irányuló (a do j ox. s torage-ben megvalósított) minden hősies erőfeszítés ellenére gyökeresen eltérő felülettel, tárolási korlátokkal és felhasználó élménnyel ren­delkeznek. Ezt a problémát igyekszik orvosoini a HTMLS: szabványos felü­letet igyekszik nyújtani, amelyet a különféle böngészők beépítve és egysége­sen valósítanak meg, anélkül, hogy külső bővítményekre támaszkodnának.

Bemutatkozik a HTML5-tároló

Az, amit én "HTMLS-tárolónak" (HTMLS Storage) nevezek, valójában a Web Starage nevezetű szabvány, amely egy időben része volt magának a HTMLS-szabványtervezetnek, de később - számunkra érdektelen üzlet­politikai okokból - önálló leírásba különítették el. Egyes böngészőgyártók

7. fejezet A helyi tárolás múltja, jelene és jövője . . . l 183

Page 177: HTML5 - Az új Szabvány

"Local Storage" (helyi tároló) vagy "DOM Storage" (DOM-tároló) néven is hivatkoznak rá. A helyzetet még jobban bonyolítja, hogy bizonyos hasonló célú, kidolgozás alatt álló szabványok, amelyekre a fejezerben még kitérek, hasonló nevek alatt futnak.

Mi is valójában a HTML5-tároló? Egyszerűen megfogalmazva, egy mód­

szer, amellyel a weboldalak nevesített kulcs-érték párokat tárolhatnak hely­

ben, az ügyfél webböngészőjén belül. A sütikben tárolt adatokhoz hasonlóan ezek az adatok is megőrződnek, amikor távozunk a webhelyről, bezárjuk a böngészőablakot, kilépünk a böngésző ből, vagy más hasonló műveletet vég­zünk. A sütikkel ellentétben azonban ezeker az adatokat soha nem visszük át egy távoli webkiszolgálóra (hacsak valamilyen rejtélyes okból kifolyólag nem tesszük meg ezt saját kezűleg). Ezen felül a maradandó helyi tárolásra irá­nyuló (fentebb ismertetett) korábbi kísérletekkel ellentétben a HTML5-

tárolót a webböngészők belsőleg valósítják meg, tehát ott is elérhető, ahol nem állnak rendelkezésre külső böngészőbővítmények.

Mely böngészőkről is van szó? Ahogy a 7.1. táblázatban láthatjuk, a

HTML5-öt lényegében minden böngésző legújabb változata támogatja -még az Internet Explorer is!

7.1. táblázat

8.0+ 3.5+ 4.0+ 4.0+ 10.5+ 2.0+ 2.0+

A HTML5-tárolót JavaScript-kódból a globális window objektum lo ca l­

Starage objektumán keresztül érhetjük el. Mielőtt azonban használatba vehetnénk, ki kell derítenünk, hogy a böngésző támogatja-e (lásd a "Helyi

tárolás" című részt a 2. fejezetben):

function supports _ htmlS _ storage ()

return (' loealStor age' in window) && window [' localStorage' ] ! ��null;

l

Azt is megreherjük, hogy nem magunk írjuk meg ezt a függvényt, hanem a Modernizr-t használjuk (lásd a 2. fejezet "Modernizr: egy HTML5-észlelő könyvtár" című részét) a HTML5-tároló támogatásának felderítésére:

if (Modernizr .localstorage) { l l A window. loealS torage elérhető!

) else {

184 l A helyi tárolás múltja, jelene és jövője ... 7. fejezet

Page 178: HTML5 - Az új Szabvány

l l Nincs beépített támogatás a HTML5-tárolóhoz : (

l l Próbáljuk meg esetleg a dojox. storage

l l vagy egy külső megoldás használatát

A HTML5-tároló használata

A HTML5-tároló kulcs-érték párokon alapul. Az adatokat egy nevesített kulccsal tároljuk, és ugyanezzel a kulccsal nyerhetjük ki őket:

interface Storage (

getter any getltem (in DOMString key);

setter creator void setitem (in DOMString key, in any data);

);

A nevesített kulcs egy karakterlánc, az adatok pedig bármilyen típusúak le­

hetnek, amit a JavaScript támogat: karakterláncok, logikai értékek, egész

vagy lebegőpontos számok. Ugyanakkor az adatok ténylegesen karakter­láncként tárolódnak. Ha nem karakterláncot, hanem valami mást szeret­

nénk tárolni és visszanyerni, olyan függvényeket kell használnunk, mint

a parseint () vagy a parseFloat (), amelyek a kinyert adatokat a várt

JavaScript-adattípusra alakítják. Ha a setitem ()-et egy már létező nevesített kulccsal hívjuk meg, a függ­

vény szó nélkül felülírja a korábbi értéket. Ha a getrtem ()-et nem létező

kulccsal hívjuk meg, a függvény kivétel kiváltása helyett null-t ad vissza.

Más JavaScript-objektumokhoz hasonlóan a loealStor age objektumot is kezelhetjük társírásos (asszociatív) tömbként, így a getrtem () és se ti tem()

függvények helyett írhatunk egyszerűen szögletes zárójeleket is. Ezt a kód­

részletet például. ..

var foo = localStorage .get! tem( "bar");

l l ... localStorage.setitem( "bar", foo);

... erre is átírhatjuk:

var foo = localStorage ["bar" l ;

l l ... localStorage["bar"] = foo;

7. fejezet A helyi tárolás múltja, jelene és jövője ... l 185

Page 179: HTML5 - Az új Szabvány

Arra is léteznek tagfüggvények, hogy eltávolítsuk egy adott nevesített kulcs értékér, vagy kipucoljuk a teljes tárolóterületet (vagyis egyszerre töröljünk minden kulcsot és értéket):

interface Starage { deleter void removertem (in DOMString key);

void clear () ;

};

Ha a removertem ()-et egy nem létező kulccsal hívjuk meg, nem csinál semmit.

Végül, van olyan tulajdonság is, amellyel megkaphatjuk a tárolóterületen

található értékek számát, illetve sorszám szerint végigmehetünk az összes kul­cson (hogy kiolvassuk az egyes kulcsok nevét):

interface Starage { readonly attribute unsigned long length;

getter DOMString key (in unsigned long index);

};

Ha a key()-t egy olyan sorszámmal hívjuk meg, amely nem O és (length-l)

-vagyis a tömb hossza mínusz l -közé esik, a függvény null-t ad vissza.

A HTML5-tárolóterület változásainak nyomon követése

Ha nyomon szeretnénk követni a tárolóterület változásait, a storage ese­ményt kell elfognunk. A window objektum storage eseménye akkor kö­vetkezik be, amikor valaki meghívja a setitem(), a removertem (l vagy a ele ar () függvényt, és az ténylegesen megváltoztat valamit. Például ha egy

elemet egy már létező értékre állítunk, vagy akkor hívjuk meg a clear ()-t, amikor nincsenek nevesített kulcsok, a storage esemény nem indul el, mert a tárolóterületen nem történik semmilyen változás.

A storage esemény mindenhol támogatott, ahol a localStarage ob­jektum, így az Internet Explorer 8-ban is. Az IE 8 ugyanakkor nem támo­gatja a W3C szabványos addEventListener függvényét (bár az IE 9-be már be fog kerülni a támogatása), így a storage eseményhez csak akkor kapcsolódhatunk, ha előbb megvizsgálj uk, hogy a böngésző melyik esemény­

kezelő rendszert ismeri. (Ha már csináltunk ilyesmit más eseményekkel kap­csolatban, nyugodtan átugorhatjuk ezt a részt. A storage esemény elfogása

186 l A helyi tárolás múltja, jelene és jövője ... 7. fejezet

Page 180: HTML5 - Az új Szabvány

ugyanúgy történik, mint más események csapdába ejtése. Ha az eseményke­zelőink bejegyzésére a jQuery-t vagy valamelyik másik JavaScript-könyvtárat részesítjük előnyben, a starage esemény esetében sem kell lemondanunk róluk.) Ezt kell tennünk:

if (window.addEventListener)

window. addEventListener ( "starage ", handle _ storage, false) ;

) else { window.attachEvent("onstorage", handle_storage);

l;

A hand le _ starage () visszahívó függvény egy StarageEvent objek­tummal hívódik meg, kivéve az Internet Explorerben, ahol az eseményobjek­

tum a windaw.event-ben tárolódik:

function handle_storage (e) { if (!e) { e= window. event; l l

Ezen a ponton az e változóban egy StarageEvent objektum található, amelynek hasznos tulajdonságait a 7.2. táblázat sorolja fel.

7 .2. táblázat A StarageEvent objektum tulajdonságai

key

oldValue

newValue

url•

String

tetszőleges

tetszőleges

String

sek A hozzáadott, eltávolított vagy módosított nevesített kulcs

A korábbi érték (amelyet felülírtunk) vagy null, ha új elemet

hoztunk létre

Az új érték vagy null, ha eltávolítottunk egy elemet

A változást előidéző tagfüggvényt meghívó oldal

• Az url tulajdonság neve eredetileg uri volt, és egyes böngészők ez utóbbi tulajdonsággal

kerültek piacra, még az előtt, hogy a szabványleírás megváltozott volna. A lehető legteljesebb

körű együttműködés érdekében célszerű előbb az url tulajdonság létezését ellenőriznünk,

majd- ha nem létezik- megvizsgál nunk, hogy létezik-e az uri tulajdonság.

A starage esemény nem vonható vissza. A hand le _ starage () vissza­hívó függvényen belülről nincs rá mód, hogy megakadályozzuk a változás bekövetkezését. Az esemény csupán arra szolgál, hogy a böngésző közölhesse velünk: "Ez történt az imént. Semmit nem tehetsz ellene; csak azt akartam, hogy tudd.".

7. fejezet A helyi tárolás múltja, jelene és jövője ... l 187

Page 181: HTML5 - Az új Szabvány

A jelenleg használt böngészők korlátai

Amikor a külső bővítményekkel megvalósított helyi tárolási megoldásokról beszéltem (lásd e fejezet "A helyi tárolásra a HTML5 előtt alkalmazott trük­kök rövid története" című részét), külön hangsúlyoztam az egyes módszerek korlátait, például a tárolható adatok mennyiségét. A most már szabványosí­tott HTML5-tároló korlátairól azonban még egy szót sem ejtettem.

Alapértelmezés szerint minden webhely 5 MB tárolóterületet kap. Ez meg­lepőerr egységes minden böngészőben, annak ellenére, hogy a HTML5-tároló szabványleírása csupán ajánlásként fogalmazza meg. Az egyik dolog, amit észben kell tartanunk, hogy az adatokat nem az eredeti formájukban, hanem karakterláncokként tároljuk. Ha sok egész vagy lebegőpontos számot táro­lunk, az ábrázolás eltérése összességében jelentős különbséget eredményezhet,

mert minden számjegy karakterként tárolódik, nem pedig a lebegőpontos számok szokásos ábrázolása szerint.

Ha túllépjük a rendelkezésünkre álló tárhelyet, QUOTA _ EXCEEDED _

ERR kivétel lép fel. A következő kérdésünk nyilván az lesz, hogy "Kérhetek a felhasználótól több tárhelyet?". A válasz: "Nem". E könyv írásának idején egyetlen böngésző sem támogatja semmilyen módszerét annak, hogy a web­fejlesztők további tárolóterületet igényeljenek. Vannak ugyan böngészők -például az Opera -, amelyek lehetővé teszik a felhasználónak, hogy szabá­lyazza az egyes webhelyek tárhelykvótáját, de ez kizárólag a felhasználótól függ; a webfejlesztő nem építheti be a webalkalmazásaiba.

A HTML-tároló működés közben

Nézzük meg egy példán keresztül, hogyan is működik a HTML5-tároló! Idézzük fel magunkban a 4. fejezetben elkészített Halma-játékot (lásd az említett fejezet "Egy teljes példa" című részét). A játékkal van egy aprócska gond: ha játék közben bezárjuk a böngészőablakot, elveszítjük az addigi lépé­seket. A HTML5-tárolóval azonban képessé válunk arra, hogy helyben, ma­

gán a böngészőn belül mentsük a játékot. A http:lldiveintohtml5.orglexamples/

localstorage-halma.html címen megtekinthetjük, hogyan is működik ez élő­ben. Végrehajtunk néhány lépést, bezárjuk a böngészőlapot, majd újra meg­nyitjuk. Ha a böngészőnk támogatja a HTML5-tárolót, a bemutatóoldal

188 l A helyi tárolás múltja, jelene és jövője ... 7. fejezet

Page 182: HTML5 - Az új Szabvány

csodák csodájára emlékezni fog a játék állására- beleértve a lépéseink számát

és a bábuknak a táblán elfoglalt helyét -, sőt még arra is, hogy melyik bábu volt kiválasztva.

Hogyan működik mindez? Nos, minden alkalommal, amikor valami megváltozik a játékban, meghívjuk ezt a függvényt:

function saveGameState ( ) { if (! supportsLocalStorage ()) { return false; )

localStarage ["halma .game. in .progress "l = gGameinProgress;

for (var i= 0; i< kNumPieces; i++) { localStarage [ "halma. piece. " + i + ". row "l = gPieces [i l . row;

localStarage [ "halma. pi e ce. " + i + ".column "l = gPieces [i l . column;

}

localStarage ["halma. selectedpiece "l = gSelectedPieceindex;

localStorage[ "halma.selectedpiecehasmoved"l gSelectedPieceHasMoved;

localStarage ["halma .movecount "l = gMoveCount;

return true;

Amint láthatjuk, a kód a localStarage objektum segítségével menti (a gGameinPrag ress logikai változóba), hogy folyamatban van-e egy já­

ték. Ha igen, akkor végigmegy a bábukon (a gPieces JavaScript-tömbön), és mindegyikről elraktározza, hogy hányadik sorban és oszlopban áll. Ezt követően további információkat ment a játék állapotáról, például azt, hogy

melyik bábu van kiválasztva (a gSelectedPieceindex egész szám típusú változóba), hogy a bábu egy potenciálisan hosszú ugrássorozat közepén tar­tózkodik-e (a gSelectedPieceHasMaved logikai változóba), illetve az addig megtett lépések számát (a gMoveCaunt egész típusú változóba).

Az oldal betöltésekor ahelyett, hogy automatikusan egy newGame () nevű függvényt hívnánk meg, amely a bedrótozott alapértékekre állítaná visz­sza az említett változókat, egy resumeGame () függvényt hívunk meg. A

resumeGame () függvény a HTML5-tárolóra támaszkodva megvizsgálja,

hogy vannak-e a helyi tárolóban mentett adatok egy folyamatban levő játék állapotáról, és ha igen, visszaállítja az értékeket a localStarage objektum

segítségével:

function resumeGame ()

if {! supportsLocalStorage ()) { return false; }

gGameinProgress = ( localStarage ["halma .game. in .progress "l == "true");

if ('gGameinProgress) { return false;}

gPieces =new Array (kNumPieces);

for (var i= O; i< kNumPieces; i++) {

7. fejezet A helyi tárolás múltja, jelene és jövője . .. l 189

Page 183: HTML5 - Az új Szabvány

var row = parseint ( localStarage [ "halma. piece. " + i + ".ro w "l ) ; var column= parseint ( localStarage ["halma .piece. "+i+ ".column"]);

gPieces [i] = new Cell (row, column);

l gNumPieces = kNumPieces;

gSelectedPieceindex = parsein t ( localStarage ["halma. selectedpiece "l); gSelectedPieceHasMoved = localStarage ["halma. selectedpiecehasmoved "] ==

� "true";

gMoveCount = parseint ( localStarage ["halma .movecount "l); drawBoard();

return true;

Ennek a függvénynek a legfontosabb része azzal az ellentmondással kapcsola tos, amelyet a fejezet korábbi részében említettem. Még egyszer: az adatok ténylege­sen karakterláncként tárolódnak- ha nem karakterláncot, hanem valami mást tárolunk, visszanyerés előtt magunknak kell azt a megfelelő adattípusra alakíta­nunk. Az a jelző például, amelyik megadja, hogy van-e folyamatban levő játék

(gGameinProgress), Boolean típusú. A saveGameState () függvényben csak elraktároztuk ezt a jelzőt, és nem foglalkoztunk az adattípusával.

localStarage [ "halma. game. in. progress "l = gGameinProgress;

A resumeGame () függvényben azonban a helyi tárolóból kiolvasott értéket karakterláncként kell kezelnünk, és saját kezűleg kell felépítenünk a megfe­

lelő logikai értéket:

gGameinProgress = ( localStarage ["halma .game. in .progress "] = "true");

Ehhez hasonlóan a lépések száma egész számként tárolódik a gMoveCount változóban. A saveGameState () függvényben csak elraktároztuk:

localStarage [ "halma. movecount "l = gMoveCount;

A resumeGame () függvényben azonban az értéket egész számmá kell ala­

kítanunk a JavaScript beépített parseint () függvényének segítségével:

gMoveCount = parsein t ( localStarage ["halma .movecount "l);

190 l A helyi tárolás múltja, jelene és jövője ... 7. fejezet

Page 184: HTML5 - Az új Szabvány

A kulcs-érték párokon túl: versengő elképzelések

Míg a múlt trükkökkel és kerülő megoldásokkal terhelt (lásd az "A helyi tá­rolásra a HTML5 előtt alkalmazott trükkök rövid története" című részt a fe­jezet elején), a HTML5-tárolás jelene meglehetősen rózsás: szabványosítottak egy új API-t, amelyet meg is valósítottak minden fontosabb böngészőben,

rendszeren és eszközön. Webfejlesztőként nem mindennap látunk ilyesmit, nem igaz? Az élet azonban többről szól, mint 5 megabájtnyi kulcs-énék pár­ról, a maradandó helyi tárolás jövője pedig ... hogy is mondjam? ... fogalmaz­zunk úgy, hogy több, egymással versengő elképzelés létezik.

Az egyik látomást egy betűszó jelképezi, amellyel már valószínűleg talál­koztunk: az SQL. 2007-ben a Google útjára bocsátotta a Gearst- azt a nyílt forrású, böngészőfüggetlen bővítményt, amely egy az SQLite-on alapuló be­ágyazott adatbázist tartalmaz. Ez a korai prototípus ihlette később a Web SQL Database szabványt. A Web SQL Database (korábbi nevén: "WebDB") egy SQL-adatbázishoz készült vékony burkoló, és az alábbihoz hasonló mű­

veletek elvégzését teszi lehetövé JavaScript-kódokból:

openDatabase (' documents', 'l. 0', 'Local document storage', 5*1024*1024, function (db) {

db. changeVersion (' ' , ' l. O' , function (t) { t. executeSql ( ' CREATE TAB LE doc i ds (id, name) ' ) ;

} , error);

) );

Amint láthatjuk, a lényeg az executeSql ( ) tagfüggvénynek átadon karak­

terláncban történik. Ez a karakterlánc bármilyen támogatott SQL-utasítás lehet, beleértve a SELECT, az UPDATE, az INSERT és a DELETE utasítást is. Pontosan olyan, mint a háttéradatbázisok programozása, csak éppen JavaScriptbőL Minő élvezet!

A 7.3. táblázat megmutatja, mely böngészők valósították meg eddig a Web SQL Database szabványt:

7.3. táblázat A Web SQL Database támogatása

IE Firefox Satari Chrome

4.0+ 4.0+

iPhone Android

10.5+ 3.0+

7. fejezet A helyi tárolás múltja, jelene és jövője . .. l 191

Page 185: HTML5 - Az új Szabvány

Természetesen, ha már több adatbázis-terméket is használtunk életünkben, akkor tisztában vagyunk vele, hogy az "SQL" inkább piaci márka, mintsem kőbe vésett szabvány. (Egyesek ugyanezt mondanák a HTML5-ről is, de ez­zel most ne törődjünk.) Létezik persze tényleges SQL-szabvány is- SQL-92-nek hívják - de nincs a világon olyan adatbázis-kiszolgáló, amely kizárólag ehhez a szabványhoz igazodna. Van az Oracle SQL-je, a Microsoft SQL-je, a MySQL SQL-je, a PostgreSQL SQL-je, az SQLite SQL-je, és ezen temékek mindegyike folyamatosan új szolgáltatásokkal bővül, tehát még az sem írja körül pontosan, hogy miről beszélünk, ha azt mondjuk, hogy "SQLite SQL'' -azt kell mondanunk, hogy "az SQL-nek az a változata, amelyet az SQLite X.Y.Z. változata tartalmaz

".

Mindez az alábbi nyilatkozathoz vezet minket, amely jelenleg a Web SQL Database szabvány elején olvasható:

Ez a szabvány zsákutcába került: minden érdekelt megvalósító ugyanazt az SQL-háttérkiszolgálót (Sqlite) használja, de több független megvaló­sírásra van szükségünk ahhoz, hogy a szabványosírást folytathassuk. Amíg egy ú jabb fejlesztőcég érdekeltté nem válik abban, hogy megvaló­sítsa ezt a szabványt, az SQL-nyelvjárás leírása egyszerűen egy az Sqlite-ra mutató hivatkozás marad, ami egy szabvány esetében elfogadhatatlan.

Ennek a háttérinformációnak a birtokában muratom be a következő elkép­zelést, amely a webalkalmazások számára biztosított fejlett, maradandó he­lyi tárolás megvalósítására irányul: az Indexed Database API-t, amelyet korábban "WebSimpleDB

"-ként ismertek, ma pedig "lndexedDB

"-nek be­

céznek. Az lndexed Database API egy úgynevezett objektumtárolót tesz elérhetővé.

Az objektumtárolók sok szempontból hasonlítanak az SQL-adatbázisokra: vannak "adatbázisok

" "rekordokkal

", és minden rekord adott számú "mező­

vel"

rendelkezik. Minden mezőnek van egy meghatározott adattípusa, ame­lyet az adatbázis létrehozásakor kell megadni. Kijelölhetjük a rekordok egy részhalmazát, majd kinyerhetjük azokat egy "kurzorral

" (sormutatóval). Az

objektumtár módosítása "tranzakciókon"

keresztül történik. Ha már programoztunk SQL-adatbázisokat, ezek a kifejezések valószínű­

leg ismerősek a számunkra. A legfontosabb különbséget az jelenti, hogy az objektumtárnak nincs strukturált lekérdezőnyelve. Nem építünk fel olyan

192 l A helyi tárolás múltja, jelene és jövője ... 7. fejezet

Page 186: HTML5 - Az új Szabvány

utasításokat, mint a "SELECT * from USERS where ACTIVE = 'Y'",

hanem ehelyett az objektumtár által biztosított tagfüggvényekkel megnyi­tunk egy sarmutatót a USERS nevű adatbázisban, végigmegyünk vele a re­kordokon, kiszűrjük az inaktív felhasznáJók rekordjai t, és kiolvassuk az egyes mezők értékét a fennmaradó rekordokbóL Az

"early walk-through ofindexedDB"

(http:!lhacks.mozilla.org/2010/06/comparing-indexeddb-and-webdatabasel) reme­kül bemutatja az IndexedD B működését, és egymás mellé helyezve összehason­lítja az IndexedDB-t a Web SQL Database-szel.

E könyv írásának idején az IndexedDB-t még nem valósították meg egyet­len fontosabb böngészőben sem. 2010 júniusának elején a Mozilla azt mondta, hogy

"néhány héten belül rendelkezésre áll majd pár tesztváltozat", de arról

semmi hír, hogy akár a Firefox 4-be bekerülne az IndexedDE támogatása. (Ezzel szemben viszont a Mozilla kijelentette, hogy soha nem fogja megvaló­sítani a Web SQL Database-t.) A Google állítása szerint gondolkodik az IndexedDE támogatásán, és még a Microsoft is úgy nyilatkozott, hogy az IndexedDE

"kitűnő megoldás a Web számára".

Mit kezdhetünk tehát mi, webfejlesztők, az IndexedDB-vel? Jelenleg az égvilágon semmit. És egy év múlva? Talán valamit. Addig is böngésszünk a

"További olvasmányok" cím alatt található oktatóanyagok között, hogy le­

gyen honnan elindulnunk

További olvasmányok

HTML5-tároló: • A HTML5-tároló szabványleírása (http:lldev.w3.orglhtml5/webstoragel) •

"Introduction to DOM Storage" (http:llmsdn.microsoft.com/en-us/libraryl

ccl97062(VS.85).aspx) az MSDN-en • Shwetank Dixit: ,;web Storage: easier, more powerful dient-side data storage"

(http:lldev. opera. com/ articles/view/web-storagel) •

"Introduction to DOM Storage" (https:l/developer.mozilla.orglen/dom/

storage) a Mozilla Developer Center oldalán. (Megjegyzés: az oldal nagy részét a globalStarage objektum Firefox-beli prototípus-megvalósítá­sának szentelték, amely egy nem szabványos előfutára a localStarage

objektumnak. A Mozilla a Firefox 3.5-ben adta a böngészőhöz a szab­ványos localStarage felület támogatását.)

7. fejezet A helyi tárolás múltja, jelene és jövője ... l 193

Page 187: HTML5 - Az új Szabvány

• "Unlock local storage for mobile Web applications with HTML5" (http:/1 www. ibm. comldeveloperworks/xmlllibrarylx-html5mobile2/), oktatóanyag at IBM DeveloperWorks oldalán

Brad Neuberg és mások korai (a HTMLS előtti) munkái: • "Internet Explorer Has Native Support for Persisrence?!?!" (http:llcoding­

inparadise. orgiweblog/2 005/08/ ajax-internet-explorer-has-native. h tm l}, a userData objektumról az Internet Explorerben

• Do j o Storage (http://docs.google. com/View?docid=dhkhksk4_ 8gdp9gr#dojo _ storage), egy nagyobb oktatóanyag része, amely a (ma már nem fejlesz­

tett) Dojo Offline könyvtárról szól • A dojox.storage.manager API leírása (http://api.dojotoolkit.org/

jsdoc/HEAD/dojox.storage. manager) • A do j ox. starage Subversion-tár (http:llsvn.dojotoolkit.orglsrcldojoxl

trunklstoragel)

Web SQL Database:

• A Web SQL Database szabványleírása (http:!ldev.w3.orglhtml5/webdatabasel) • Remy Sharp: "Introducing Web SQL Databases" (http:llhtml5doctor.com/

introducing-web-sql-databasesl) • Web Database-bemutató (http:llhtml5demos.comldatabase) • persistence.js (http:llzefme/2774/persistence-js-an-asynchronous-javascript­

orm-for-html5gears), egy "aszinkron JavaScript OR M", amely a Web

SQL Database és Gears tetejére épül

IndexedD B:

• Az Indexed Database API szabványleírása (http:lldev.w3.org/2006/webapil IndexedD B!)

• Arun Ranganathan és Shawn Wilsher: "Beyond HTML5: Database APis and the Road to IndexedDB" (http:llhacks.mozilla.org/2010/06/beyond­html5-database-apis-and-the-road-to-indexeddb!)

• Arun Ranganathan: "Firefox 4: An early walk-through of IndexedD B"

(http:llhacks. mozilla. org/20 l 0/06/comparing-indexeddb-and-webdatabase/)

Page 188: HTML5 - Az új Szabvány

8. fejezet

Bontsuk a kapcsolatot!

Ugorjunk fejest!

Mi az a kapcsolat nélküli webalkalmazás? Az elnevezés első hallásra önellent­mondásnak tűnik, hiszen a weboldalakat letöltjük, hogy megjeleníthessük, a letöltés pedig hálózati kapcsolatot feltételez. Hogyan tölthetünk le valamit, ha nem kapcsolódunk a hálózatra? Természetesen sehogy- akkor viszont igen, amikor a kapcsolat él. A kapcsolat nélküli (offiine) HTML5-alkalmazások pontosan így működnek.

A legegyszerűbb formájában egy kapcsolat nélküli webalkalmazás csupán egy sor URL, amelyek HTML-, CSS- vagy JavaScript-fájlokra, képekre és egyéb erőforrásokra mutatnak. A kapcsolat nélküli webalkalmazás kezdőol­dala erre a jegyzékfájlnak (manifest fájlnak) nevezett listára mutat, ami nem más, mint egy egyszerű szövegfájl, ami valahol a webkiszolgálón található.

A kapcsolat nélküli HTML5-alkalmazásokra felkészített webböngészők ki­olvassák az URL-címeket a jegyzékfájlból, letöltik az erőforrásokat, helyi gyors­tárba írják őket, és önműködően frissítik a helyi másolatokat, ha az eredetijük megváltozik Amikor a webalkalmazást hálózati kapcsolat nélkül próbáljuk elérni, a webböngésző automatikusan a helyi másolatra vált.

A fentieken kívül szinte minden másról mi, a webfejlesztök gondoskodunk.

A DOM-ban van egy jelző, amely tájékoztat róla, hogy hálózati kapcsolattal vagy anélkül dolgozunk, és bizonyos események is elindulnak, amikor az ál­lapot megváltozik (vagyis amikor az egyik pilanatban nincs kapcsolat, aztán ismét van, vagy fordítva), de lényegében ennyi. Ha az alkalmazásunk adato­kat hoz létre vagy állapotot ment, a mi feladatunk helyben elraktározni ezeket az információkat (lásd a 7. fejezetet), amíg nem él a kapcsolat, majd összehan­golni azokat a távoli kiszolgálóval, amint ismét kapcsolódtunk a hálózatra. Más szavakkal, a HTML5 képes kapcsolat nélkül is megőrizni a webalkal­mazásunkat, de az már tőlünk függ, hogy mit csinálunk, amikor a kapcsolat

8. fejezet Bontsok a kapcsolatot! l 195

Page 189: HTML5 - Az új Szabvány

megszakad.A 8.1. táblázatban megtekimhetjük, hogy mely böngészők támo­gatják a kapcsolat nélküli webalkalmazásokat.

8.1. táblázat A kapcsolat nélk.;;u:....'li:....m:....ú:....' k:....öd:....e:....' s:....ta:....· m:....o;..:g:.;.a.;.; tá:....sa=---------------. IE Flrefox Satari Chrame

A gyorstárjegyzék

O ra iPhone Android

_ _c../ _ ___ ../

A kapcsolat nélküli webalkalmazások működéséhez elengedhetetlen egy gyorstárjegyzék (cache manifest). Ahogy már említettem, a jegyzék sorolja fel az összes erőforrást, amire a webalkalmazásnak szüksége lehet, amikor nem kapcsolódik a hálózathoz. Ahhoz, hogy lehetövé tegyük az erőforrások letöl­tését és gyomárba írását, a <html> elemben a manifest jellemzővel hivat-koznunk kell a jegyzékfájlra:

< ' DOCTYPE HTML>

<htrnl manifes t=" /cache.manifest">

<body>

</body>

</html>

A gyorstárjegyzék bárhol lehet a webkiszolgálón, de mindenképpen a text/

eaehe-manifest tartalomtípussal kell szolgáltatni. Ha Apache alapú web­kiszolgálót futtatunk, valószínűleg elég egy AddType utasítást elhelyeznünk a webkönyvtár gyökerében található .htaccess fájlban:

AddType text/eaehe-manifest . manifest

Ügyeljünk rá, hogy a gyorstárjegyzék fájlneve .manifest-re végződjön. Ha másik webkiszolgálót vagy más Apache-beállításokat használunk, néz­zünk utána a kiszolgáló dokumentációjában, hogy mikém szabályozhatjuk a Content-Type fejlécet.

196 l Bontsok a kapcsolatot! 8. fejezet

Page 190: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: A webalkalmazás om több oldalt fog át. Minden oldalon szükség van

külön manifest jellemzőre, vagy elég csak a kezdőoldalon elhelyezni egyet?

Válasz: A webalkalmazás minden oldalán lennie kell egy manifest

jellemzőnek, ami a reljes alkalmazás gyorstárjegyzékére mutat.

Jó, tehát minden egyes HTML-oldalunk hivatkozik a gyorstárjegyzékre, és a gyorstárjegyzéket a megfelelő Content-Type fejléccel szolgáltatjuk. De mi kerül a jegyzékfájlba? A dolog itt kezd érdekessé válni.

Minden gyorstárjegyzék első sora így fest:

CACHE MANIFEST

Ezt követően minden jegyzékfájl három részre oszlik: a kifejezett szakaszra, a tartalék szakaszra és a hálózati fehérlista szakaszra. Mindegyik szakaszt külön sorban szereplő fejléc vezeti be. Ha a jegyzékfájlban nincsenek szakasz­fejlécek, akkor minden felsorolt erőforrás úgy tekintendő, mintha a kifejezett szakaszban szerepelne. A terminológiával ne foglalkozzunk túl sokat, nehogy szétrobbanjon a fejünk.

Íme egy érvényes jegyzékfájl, amely három erőforrást- egy CSS- és egy Java­Script-fájlt, valamint egy JPEG-képet - sorol fel (amelyekből egy óra áll össze):

CACHE MANIFEST /clock.css /clock.js /clock-face. jpg

Ebben a jegyzékfájlban nincsenek szakaszfejlécek, tehát minden felsorolt erő­forrás alapértelmezés szerint a kifejezett szakaszba tartozik. A kifejezett sza­kaszban szereplő erőforrások letöltődnek és a helyi gyorstárba kerülnek, az alkalmazás pedig ezeket a másolatokat használja a hálózaton található eredeti fájlok helyett, ha éppen nem kapcsolódunk a hálózatra. Amikor tehát berölt­jük a fenti gyorstárjegyzéket, a böngésző letölti a clock.css, clock.js és clock­face.jpg fájlokat a webkiszolgáló gyökérkönyvtárábóL Ezt követően kihúz­hatjuk a hálózati kábelt, és újratölthetjük az oldalt: valamennyi erőforrás kapcsolat nélkül is elérhető lesz.

8. fejezet Bontsok a kapcsolatot! l 197

Page 191: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: A HTML-o/dalaimat is fol kell sorolnom a gyorstdrjegyzékben? Válasz: Igen is, meg nem is. Ha a teljes webalkalmazást egyetlen oldal tartalmazza, csak arról kell gondoskodnunk, hogy az oldal a ma n if es t

jellemzőben hivatkozzon a gyorstárjegyzékre. Amikor egy manifest

jellemzővel rendelkező HTML-oldalra ugrunk, ezt az oldalt a böngésző

a webalkalmazás részének tekinti, tehát nem kell feltüntetnünk magá­ban a jegyzékfájlban. Ha azonban a webalkalmazás több oldalt fog át, az összes HTML-oldalt fel kell sorolnunk a jegyzékben, különben

a böngésző nem fogja tudni, hogy vannak más HTML-oldalak is, ame­lyeket le kell töltenie és gyorstárba írnia.

Hálózati szakaszok

Nézzünk egy kicsit bonyolulrabb példát! Tegyük fel, hogy azt szeretnénk,

hogy az óraprogramunk nyomon kövesse a látogatókar egy tracking.cgi nevű parancsfájl segítségéve!, amely dinamikusan töltődik be egy <img src>

jellemzőbőL Ezt az erőforrást nem írhatjuk gyorsrárba, mert az meghiúsítaná a nyomon követésr. Fel kell tehát rüntetnünk, hogy soha nem kerülher gyors­

tárba, és így nem érhető el kapcsolat nélkül:

CACHE MANIFEST NETWORK: /tracking.cgi CACHE: /clock.css /clock.js /clock-face. jpg

Ez a gyorstárjegyzék már tartalmaz szakaszfejlécekeL A NETWORK: ("háló­zar") sor a hálózari fehérlista szakasz kezdete. Az ebben a szakaszban felsorolt erőforrások soha nem íródnak gyorstárba, és nem érhetők el kapcsolat nélkül. (Ha kapcsolat nélkül próbáljuk betölteni őket, hibát kapunk.) A CACHE:

szöveget tartalmazó sor a kifejezett szakasz kezdetét jelzi. A jegyzékfájl fenn­

maradó része megegyezik az előző példában szerepiőveL A felsorolt három erőforrást a böngésző gyorstárazza, és kapcsolat nélkül elérhetővé teszi.

198 l Bontsok a kapcsolatot! 8. fejezet

Page 192: HTML5 - Az új Szabvány

Tartalék szakaszok

A jegyzékfájlokban egy másik típusú szakasz is lehet: a tartalék szakasz. A tartalék szakaszokban azt adhatjuk meg, hogy mivel helyettesíthetők azok

a hálózati erőforrások, amelyek valamilyen oknál fogva nem írhatók gyors­tárba, vagy a gyorstárazásuk nem sikerült. A HTML5-szabványleírás ezt

a példát hozza fel a tartalék szakaszok használatára:

CACHE MANIFEST

FALLBACK:

l /offline.html

NETWORK:

Mit eredményez ez a jegyzékfájl? Először is, gondoljunk egy olyan webhelyre - mondjuk a Wikipediára -, amely oldalak millióit tartalmazza. A teljes web­

helyet nem tölthetjük le - nem is akarnánk ilyet tenni. De tegyük fel, hogy egy részét elérhetővé tehetjük kapcsolat nélkül. Mi alapján döntenénk el,

hogy mely oldalakat írjuk gyorstárba? Mi szólnánk ehhez: minden olyan

oldalt letöltünk és elraktározunk, amit valaha is megtekintettünk a képzele­tünkben létező, kapcsolat nélkül is működő Wikipedián. Ebbe beletartozik

az enciklopédia minden olyan cikke, amelyet valaha olvastunk, minden cse­

vegőoldala (ahol vitatkozhatunk egy adott szócikkről) és minden szerkesztő­

oldala (ahol módosíthatjuk az említett cikket). Erre való a fenti jegyzékfájL Tegyük fel, hogy a Wikipedián minden

HTML-oldal (cikk, csevegőoldal, szerkesztőoldal, előzményoldal) hivatkozik

erre a gyorstárjegyzékre. Ha ellátogatunk egy olyan oldalra, amely erre

a gyorstárjegyzékre mutat, a böngésző azt mondja: "Hé, ez az oldal egy kap­csolat nélküli webalkalmazás része! Ismerem ezt a webalkalmazást?". Ha a bön­

gésző még soha nem töltötte le ezt a bizonyos jegyzékfájlt, létrehoz egy új kap­csolat nélküli "alkalmazás-gyorstárat" (application cache, röviden "appcache"), letölti a jegyzékfájlban felsorolt összes erőforrást, majd hozzáadja az aktuális oldalt az alkalmazás-gyorstárhoz. Ha a böngésző már korábban létrehozta az említett jegyzékfájlt, egyszerűen hozzáadja az oldalt a meglevő alkalmazás­

gyorstárhoz. A meglátogatott oldal mindkét esetben az alkalmazás-gyorstár­ban köt ki. Ez lényeges, mert azt jelenti, hogy lehet egy kapcsolat nélküli

webalkalmazásunk, amely "önműködően" rögzíti a meglátogatott oldalakat, így nem kell minden egyes HTML-oldalt felsorolnunk a gyorstárjegyzékben.

8. fejezet Bontsok a kapcsolatot! l 199

Page 193: HTML5 - Az új Szabvány

Most nézzük meg a tartalék szakaszt. A jegyzékfájl tartalék szakasza egyetlen sort tartalmaz. A sor első fele (a szóköz előtti rész) nem URL-cím, hanem egy URL-minta. Az egyetlen perjel (/ ) karakter a webhely minden oldalára illeszkedik, nem csak a kezdőoldalra. Amikor egy oldalt kapcsolat nélkül próbálunk megtekinteni, a böngésző megnézi, hogy megvan-e az al­kalmazás-gyorstárban. Ha ott megtalálja az oldalt (mert már megtekintettük azt, amíg a hálózatra kapcsolódtunk, és így a böngésző rögzítette az oldalt az alkalmazás-gyorstárban), megjeleníti az oldal tárolt másolatát. Ha a böngésző nem találja az oldalt az alkalmazás-gyorstárban, nem hibaüzenetet jelenít meg, hanem az /offiine.html oldalt, amit a tartalék szakasz sorának második fele határoz meg.

Végül vizsgáljuk meg a hálózati szakaszt. A fenti jegyzékfájl hálózati sza­kasza szintén egyeden sorból áll, amelyben csak egy csillag (*) karakter talál­ható. Ennek a karakternek különleges jelentése van a hálózati szakaszban- ez a "hálózati fehérlista általános helyettesítő karaktere". Ez a nyakatekert név csak annyit takar, hogy ami nem szerepel az alkalmazás-gyorstárban, azt nyugodran töltsük le, ha él a hálózati kapcsolat, ami egy "nyílt végű", kapcso­lat nélküli webalkalmazás esetében igazán fontos. A példánkat folytatva, ez azt jelenti, hogy miközben a hálózaton böngészünk a képzeletbeli, kapcsolat nélkül is működő Wikipedián, a böngészőnk a szokásos módon letölti a ké­peket, videókat és más beágyazott erőforrásokat, még akkor is, ha azok egy másik tartományban találhatók. (Ez megszakott a nagyobb webhelyeken, még ha azok nem is egy kapcsolat nélküli webalkalmazás részei: a HTML­oldalak előállírása és kiszolgálása helyben történik, míg a képek és videók egy másik tartományban található tartalomszolgálrató hálózatról származnak.) Az általános helyettesítő karakter nélkül a képzeletbeli, kapcsolat nélkül is működő Wikipedia furcsán viselkedne, amikor a hálózaton vagyunk: konk­rétan, nem töltene be egyeden külső tárolású képet és videót sem!

Teljes ez a példa? Nem. A Wikipedia nem csak HTML-fájlokból áll: az oldalak szokványos CSS- és JavaScript-fájlokat, illetve képeket is tartalmaz­nak. Ezen erőforrások mindegyikét kifejezetten fel kellene sorolnunk a jegy­zékfájl CA CHE: szakaszában ahhoz, hogy az oldalak helyesen jelenjenek meg és működjenek kapcsolat nélkül is. A tartalék szakasz célja azonban éppen az, hogy lehessen egy "nyílt végű" kapcsolat nélküli webalkalmazásunk, amely túlnyúlik a jegyzékfájlban konkrétan felsorolt erőforrásokon.

200 l Bontsok a kapcsolatot! 8. fejezet

Page 194: HTML5 - Az új Szabvány

Az eseményfolyam

Amit eddig a kapcsolat nélküli webalkalmazásokról, a gyorstárjegyzékekről és a kapcsolat nélküli alkalmazás-gyorstárakról ("appcache") mondtam, félig­meddig hókuszpókusznak tűnhet: az erőforrások letöltődnek, a böngésző döméseket hoz, és minden "csak úgy működik". Ezt persze nem hisszük el, ugye? Végtére is, webfejlesztésről van szó, ahol soha semmi nem működik

"csak úgy". Először is az eseményfolyamról, konkrétan a DOM-eseményekről kell

szót ejtenünk. Amikor a böngészőnk megnyit egy oldalt, amely egy jegyzék­fájira mutat, egy sor eseményt indít el a window. applicationCache

objektumon (lásd alább). Tudom, hogy bonyolultnak tűnik, de higgyük el, ennél egyszerűbben nem tudnám megfogalmazni úgy, hogy ne hagyjak ki fontos információkat. Íme a folyamat:

l. Amint észrevesz egy manifest jellemzőt a <html> elemben, a bön­gésző elindít egy checking eseményt. (Minden itt felsorolt esemény a window. applicationCache objektum eseményeként indul el.) A checking eseményre mindig sor kerül, függetlenül attól, hogy korábban ellátogat­tunk-e már erre vagy bármely más oldalra, amely ugyanerre a gyorstár­jegyzékre mutat.

2. Ha a böngésző még soha nem találkozott ezzel a jegyzékfájllal: • Elindít egy downloading eseményt, majd megkezdi a gyorstárjegyzékben

felsorolt erőforrások letöltését. • Miközben letölt, a böngésző időről időre progress eseményeket indít

el, amelyek arról tartalmaznak információt, hogy a böngésző hány fájlt töltött már le, és hány fájl vár még letöltésre.

• Miután a jegyzékben szereplő összes erőforrást sikeresen letöltötte, a bön­gésző elindít még egy utolsó, cached nevű eseményt. Ez jelzi, hogy a kap­csolat nélküli webalkalmazás teljes egészében a gyorstárba került, és készen áll a kapcsolat nélküli használatra. Ennyi az egész; készen vagyunk.

3. Ezzel szemben, ha az említett oldalt vagy bármely más oldalt, amely ugyanarra a jegyzékfájira mutat, korábban már meglátogattuk, a böngészőnk már tudni fog erről a jegyzékfájlról, és már el is helyezhetett bizonyos erőforráso­kat- akár a teljes kapcsolat nélküli webalkalmazást-az alkalmazás-gyorstárban.

8. fejezet Bontsok a kapcsolatot! l 201

Page 195: HTML5 - Az új Szabvány

A kérdés ebben az esetben tehát az, hogy a jegyzékfájl megváltozott-e azóta, hogy a böngésző utoljára ellenőrizte?

• Ha a válasz nem, tehát a jegyzékfájl nem változott meg, a böngésző azonnal elindít egy noupdate eseményt, és ezzel végzett is.

• Ha a válasz igen, tehát a jegyzékfájl megválrozott, a böngésző egy downloading eseményt indít el, és megkezdi a jegyzékben felsorolt va­lamennyi erőforrás letöltését.

Miközben lerölt, a böngésző időről időre progress eseményeket indít el, amelyek arról tartalmaznak információt, hogy a böngésző hány fájlt töltött már le, és hány fájl vár még letöltésre.

Miután a jegyzékben szereplő összes erőforrást sikeresen újra letöltötte, a böngésző elindít még egy utolsó, updateready nevű eseményt. Ez jelzi, hogy a kapcsolat nélküli webalkalmazás új változata teljes egészében a gyors­tárba került, és készen áll a kapcsolat nélküli használatra. Ekkor azonban még nem az új változatot látjuk. Ha "menet közben" az új változatra szeret­nénk váltani, anélkül, hogy a felhasználót az oldal újratöltésére kényszeríte­nénk, saját kezűleg meg kell hívnunk a window.applicationCache.

swapCache ( ) függvényt. Ha a folyamat bármely pontján félresiklik valami, a böngésző egy error

eseményt vált ki, és leállírja a műveletet. Hogy mi okozhat hibát? Íme egy a végletekig lerövidített lista:

• A jegyzékfájl egy 404-es (Page Not Found- "Az oldal nem található") vagy 410-es (Permanemly Gone- "Véglegesen törölve") HTTP-hibát ad ViSSZa.

• A jegyzékfájl megvan, és nem változott meg, de a rá mutató HTML­oldal nem töltődött le helyesen.

• A jegyzékfájl megvan, és megváltozott, de a böngészőnek nem sikerül letöltenie a benne felsorolt erőforrások egyikét.

202 l Bontsok a kapcsolatot! 8. fejezet

Page 196: HTML5 - Az új Szabvány

A hibakeresés művészete,

avagy "Ölj meg! Ölj meg itt és most!"

Két fontos dologra szeretném felhívni itt a figyelmet. Az elsőről éppen most olvastunk, de lehet, hogy nem igazán fogtuk fel, úgyhogy elismétlem: ha a jegyzékfájlban felsoroltak közül akár csak egyetlen erőforrás letöltése is sikerte­len, a kapcsolat nélküli webalkalmazás gyorstárazásának teljes művelete kudar­cot vall. A böngésző elindítja az error eseményt, de arról nem kapunk visz­szajelzést, hogy pontosan mi volt a probléma, ami a hibakeresést rendkívül bosszantóvá teheti a kapcsolat nélküli webalkalmazásokban.

A másik fontos dolog elméleti értelemben nem hiba, de komoly böngésző­hibának tűnhet, amíg rá nem jövünk, hogy miről is van szó. Arról ugyanis, hogy a böngésző pontosan hogyan is ellenőrzi, hogy a jegyzékfájl megválto­zott-e. A művelet három lépésből áll. Tudom, hogy unalmas, de muszáj tud­nunk, úgyhogy figyeljünk. Íme az eljárás:

l. A böngésző a szokványos HTTP-eljárásokkal ellenőrzi, hogy a gyors­tárjegyzék lejárt-e. Mint minden más fájl esetében, amelyet HTTP-n keresz­tül szolgáltat, a webkiszolgáló általában az ilyen fájlokról is metaadatokat helyez el a HTTP-válaszfejlécekben. Egyes HTTP-fejlécek (az Expires és a Cache-Control) arról tájékoztatják a böngészőt, hogy milyen feltételekkel gyorstárazhatja a fájlt anélkül, hogy megkérdezné a kiszolgálótól, hogy a fájl megváltozott-e. Ennek a fajta gyorstárazásnak semmi köze a kapcsolat nél­küli webalkalmazásokhoz: lényegében minden HTML-oldalra, stíluslapra, parancsfájlra, képre és más webes erőforrásra vonatkozik.

2. Ha a jegyzékfájl lejárt (a HTTP-fejlécek szerint) , a böngésző megkér­dezi a kiszolgálótól, hogy van-e belőle új változat, és ha igen, letölti azt. Ehhez a böngésző egy HTTP-kérelmet ad ki, amely tartalmazza a jegyzékfájl utolsó módosításának dátumát - azt a dátumot, amelyet a webkiszolgáló közölt a HTTP-válaszfejlécben, amikor a böngésző utoljára letöltötte a fájlt. Ha a webkiszolgáló úgy találja, hogy a jegyzékfájl nem módosult az említett dá­tum óta, egyszerűen a 304 (Not Modified)- "Nem módosult"- válaszkódot adja vissza. Ez sem kizárólag a kapcsolat nélküli webalkalmazások sajátossága - lényegében minden erőforrás esetében ez történik a Weben.

3. Ha a webkiszolgáló úgy gondolja, hogy a jegyzékfájl megváltozott az említett dátum óta, a 200-as (OK) HTTP-állapotkódot adja vissza, amelyet az új fájl tartalma, valamint az új eaehe-Control fejlécek és az utolsó

8. fejezet Bontsok a kapcsolatot! l 203

Page 197: HTML5 - Az új Szabvány

módosítás új dátuma követ. Ez biztosítja, hogy az l. és 2. lépés legközelebb is helyesen működjön. (A HTTP klassz. A webkiszolgálók mindig gondolnak a jövőre. Ha a webkiszolgálónak feltétlenül el kell küldenie nekünk egy fájlt, mindent megtesz annak érdekében, hogy feleslegesen ne kelljen kétszer elkül­den ie.) Miután a böngésző letöltötte az új jegyzékfájlt, összeveti annak tartal­mát a legutóbb letöltött másolattal. Ha a jegyzékfájl tartalma megegyezik a korábbi változatéval, a böngésző nem tölti le újra a jegyzékfájlban felsorolt egyik erőforrást sem.

A fenti lépések bármelyike buktatónak bizonyulhat, amikor egy kapcsolat nélküli webalkalmazást fejlesztünk és tesztelünk Tegyük fel például, hogy közzéreszünk egy változatot a jegyzékfájlunkból, majd 10 perccel később rájövünk, hogy még egy erőforrást hozzá kell adnunk. Semmi gond, igaz? Csak beleírunk a jegyzékbe még egy sort, és újra közzétesszük a fájlt. Csak­hogy ekkor a következő történik: újratöltjük az oldalt, a böngésző észleli a manifest jellemzőt, elindítja a checking eseményt, és ... semmi nem történik. A böngésző makacsul ragaszkodik ahhoz, hogy a gyorstárjegyzék nem változott meg. Miért? Azért, mert a webkiszolgálót alapértelmezés sze­rint valószínűleg úgy állították be, hogy a böngészőket arra utasítsa, hogy néhány óráig gyorstárazzák a statikus fájlokat (HTTP-eljárásokon keresztül, a eaehe-Control fejlécek használatával). Ez azt jelenti, hogy a böngésző soha nem jut túl a háromlépéses művelet l. lépésén. A webkiszolgáló termé­szetesen tudja, hogy a fájl megváltozott, de a böngésző nem jut el odáig, hogy ezt megkérdezze a webkiszolgálótóL Miért? Azért, mert amikor utoljára letöl­tötte a jegyzékfájlt, a webkiszolgáló azt mondta neki, hogy néhány óráig ezt az erőforrást tárolja a gyorstárában (HTTP-eljárásokon keresztül, a eaehe­

Control fejlécek használatával). A böngésző pedig most, 10 perccel később, pontosan ezt teszi.

Világossá szeretném tenni, hogy ez nem hiba, hanem kényelmi szolgál­tatás, ami pontosan úgy működik, ahogy működnie kell. Ha a webkiszol­gálóknak nem lenne rá módjuk, hogy közöljék a böngészőkkel (és a köztes számítógépekkel), hogy bizonyos dolgokat gyorstárazniuk kell, a Web egy szempillantás alatt összeomlana. Ez persze nem vigasztal minket, ha órákat töltöttünk azzal, hogy rájöjjünk, miért nem veszi észre a böngészőnk, hogy a jegyzékfájl frissült. (És ami a legszebb az egészben: ha elég ideig várunk, az alkalmazás ismét működni kezd! Mert a HTTP-gyorstár elévült! Ahogy az elő van írva! Öljetek meg! Öljetek meg itt és most!)

204 l Bontsok a kapcsolatot! 8. fejezet

Page 198: HTML5 - Az új Szabvány

Egy dolgot tehát mindenképpen el kell még végeznünk: át kell állítanunk a webkiszolgálót, hogy a jegyzékfájl ne kerülhessen a HTTP-gyorstárba. Ha Apache alapú webkiszolgálót futtatunk, elég ezt a két sort elhelyeznünk a .htaccess fájlban:

ExpiresActive On

ExpiresDefault •access •

Ez a két sor letiltja az adott könyvtárban és annak alkönyvtáraiban található fájlok gyorstárazását. Az üzemi környezetben valószínűleg nem ezt szeret­nénk, ezért vagy minősítenünk kell a fenti meghatározást egy <Fi les> uta­sítással, hogy csak a jegyzékfájlunkra vonatkozzon, vagy létre kell hoznunk egy alkönyvtárat, amelyben csak a gyorstárjegyzék és ez a .htaccess fájl talál­ható. Ahogy az lenni szokott, a beállítás részletei a különféle webkiszolgáló­kan eltérhetnek, ezért nézzünk utána a kiszolgáló dokumentációjában, hogy miként szabályozhatjuk a HTTP-gyorstár fejléceit.

Mindazonáltal a HTTP-gyorstárazás letiltása a gyorstárjegyzékre vonat­kozóan önmagában nem oldja meg minden gondunkat. Így is előfordulhat, hogy módosítjuk az alkalmazás-gyorstár valamelyik erőforrását, de az to­vábbra is ugyanazon az URL-en található a webkiszolgálón. Ebben az eset­ben a háromlépéses művelet 2. lépése akaszt meg minket. Ha a jegyzékfájl nem változott meg, a böngésző soha nem fogja észrevenni, hogy az egyik korábban gyorstárba Írt erőforrás módosult. Vegyük az alábbi példát:

CACHE MANIFEST

#rev 42

c lock. js

clock.css

Ha módosítjuk a clock.css fájlt, és újra közzétesszük, nem fogjuk látni a vál­tozást, mert maga a gyorstárjegyzék nem módosult. Minden alkalommal, amikor változtatunk a kapcsolat nélküli webalkalmazás valamelyik erőforrá­sán, magát a jegyzékfájlt is módosítanunk kell, de ehhez elég akár egyeden karaktert megváltoztatni. Talán az a legegyszerűbb, ha a jegyzékfájlban el­helyezünk egy megjegyzéssort a változat számával, és amikor változtatunk valamelyik erőforráson, a megjegyzésben szereplő változatszámot írjuk át. A webkiszolgáló a módosított jegyzékfájlt adja vissza, a böngésző pedig ész­reveszi, hogy a fájl tartalma megváltozott, és újra letölti a jegyzékben felsorolt összes erőforrást:

8. fejezet Bontsok a kapcsolatot! l 205

Page 199: HTML5 - Az új Szabvány

CACHE MANIFEST

t rev 43 clock.js clock.css

Építsünk egyet!

Emlékszünk még a Halma-játékra, amelyet a 4. fejezetben készítettünk (lásd ott az "Egy teljes példa" című részt), majd később kiegészítettünk, hogy képes legyen maradandó helyi tároló ba memeni a játék állapotát ("A HTML-tároló működés közben")? Nos, itt az ideje, hogy a Halma-játékunkat leválasszuk a hálózatról.

Ehhez egy jegyzékfájlt kell készítenünk, amely felsorolja az összes erő­forrást, amire a játéknak szüksége van. Van ugye a fő HTML-oldal, egy JavaScript-fájl, amely a játék kódját tartalmazza, és .. . ennyi. Nincsenek ké­pek, mivel a grafikát teljes egészében programból, a Canvas API-n keresztül vezéreljük (lásd a 4. fejezetet), és minden szükséges CSS-stílus egy <style>

elemben található a HTML-oldal elején. A jegyzékfájlunk tehát így fest:

CACHE MANIFEST

halma.html .. /halma-localstorage.js

Egy megjegyzés az elérési utakkal kapcsolatban: létrehoztam egy offiine/ alkönyvtárat az examples/ könyvtárban, és a fenti jegyzékfájl ebben az al­könyvtárban kapott helyet. Mivel a HTML-oldalt egy apró kiegészítéssel kell ellátnunk, hogy kapcsolat nélkül is működjön (erre mindjárt visszatérünk), készítettem egy másolatot a HTML-fájlról, és ezt is az offiine/ alkönytárba tettem. Maga a JavaScript-kód azonban nem változott a helyi tárolás támo­gatásának hozzáadása óta (lásd a 7. fejezet "A HTML5-tároló működés köz­ben" című részét), ezért ugyanazt a .js fájlt hasznosítjuk újra, amelynek a helye a szülőkönyvtár (examples/). Összefoglalva, a fájlok helye így fest:

/examples/localstorage-halma.html /examples/halma-localstorage.js /examples/offline/halma.manifest /examples/offline/halma.html

A gyorstárjegyzékben (lexampleslofflinelhalma. manifes t) két fájira szeretnénk hivatkozni. Az első a HTML-fájl kapcsolat nélküli változata (lexamplesloffline/

206 J Bontsok a kapcsolatot! 8. fejezet

Page 200: HTML5 - Az új Szabvány

halma.html), amely a jegyzékfájlban Útvonalelőrag nélkül szerepel, mert a két fájl ugyanabban a könyvtárban található. A második a JavaScript-fájl, amelynek a helye a szülőkönyvrár (lexampleslhalma-localstoragejs), és amelyet a jegyzékben relatív URL-címmel tüntetünk fel (. ./halma-localstoragejs). Pon­tosan így használjuk az <img src> jellemzőkben is a relatív URL-eket. Ahogy a következő példában Járni fogjuk, (az aktuális tartomány gyökeréből kiinduló) abszolút elérési urakat vagy akár (más tartományok erőforrásaira murató) abszolút URL-eket is használhatunk.

A HTML-fájlhoz hozzá kell adnunk a manifest jellemzőt, amely a jegy­zékfájira murat:

<! OOCTYPE html> <htmllang= "en" manifes t= "halma. manifest ">

Ennyi az egész! Amikor egy kapcsolat nélküli működést támogató böngésző először tölti be a kapcsolat nélküli működésre felkészített HTML-oldalt, le­tölti a hivatkozott jegyzéket, annak alapján pedig a szükséges erőforrásokat, és elraktárazza azokat a kapcsolat nélküli alkalmazás-gyorstárban. Innen kezdve a kapcsolat nélküli alkalmazás algoritmusa veszi át az irányítást, ami­kor csak betöltjük az oldalt. A játékot így kapcsolat nélkül is játszhatjuk, és mivel az alkalmazás helyben menti a játék állapotát, akkor függesztjük fel, vagy indítjuk újra, amikor csak akarjuk.

További olvasmányok

Szabványok: • Kapcsolat nélküli webalkalmazások a HTML5-szabványleírásban (http:/1

bit. ly leCk WZa)

A böngészőgyártók dokumentációi: • "Offline resources in Firefox" (https:lldeveloper.mozilla.org/En/Ofjiine_

resources_in_Firefox) a Mozilla Developer Center webhelyén • "HTML5 Offline Application Cache" (http:lldeveloper.apple.comlsaforil

libraryldocumentation/iPhone/Conceptual/Safori]SDatabaseGuide!Offline ApplicationCache!OfjiineApplicationCache.html), a "Safari Client-Side Storage and Offline Applications Programming Guide" (http://developer.apple.com/

8. fejezet Bontsok a kapcsolatot! l 207

Page 201: HTML5 - Az új Szabvány

saforillibraryldocumentationliPhone/Conceptual!Safori]SDatabaseGuide! !ntroductionl!ntroduction. h tm l} része

Oktatóanyagok és bemutatók: • Andrew Grieve: "G maii for Mobile HTMLS Series: U sing Appeaehe to

Launeh Offiine-part l" (http:!lgooglecode.blogspot.com/2009/04/gmail­for-mobile-html5-series-using. h tm l)

• Andrew Grieve: "G maii for Mobile HTMLS Series: U sing Appcaehe to Launeh Offline-part 2" (http:llgooglecode.blogspot.com/2009/05/gmail­for-mobile-html5-series-part-2.html}

• Andrew Grieve: "G maii for Mobile HTMLS Series: U sing Appeaehe to Launeh Offline-part 3" (http:!lgooglecode.blogspot.com/2009/05/gmail­for-mobile-html5-series-part-3.html)

• Jonathan Shark: "Debugging HTMLS Offline Application Caehe"

(http:lljonathanstark.com/blog/2009/09/27/debugging-html-5-offline­application-cachel)

• Paul Ro u get: "An HTMLS offline image editor and u pioader applieation"

(http://hacks. mozilla. orgi201 0/02/an-htm/5-offline-image-editor-and­uploader-application/)

Page 202: HTML5 - Az új Szabvány

9. fejezet

Őrült űrlapok

Ugorjunk fejest!

Mindenki ismeri a webes űrlapokat, nem igaz? Létrehozunk egy <form>

címkét, hozzáadunk néhány <input type= "text"> és talán egy <input

type="password"> elemet, az űrlapot egy <input type="submit">

gombbal tesszük teljessé, és készen is vagyunk. Ez smafu. A HTML5 több mint egy tucat új bevitelielem-típust határoz

meg, amelyeket az űrlapokon használhatunk. Amikor pedig azt mondom, hogy "használhatunk", úgy értem, hogy azon nyomban- mindenféle trükk, szemfényvesztés és kerülő megoldás nélkül. Azért ne örüljünk túlságosan: nem azt akarom mondani, hogy a böngészők kivétel nélkül támogatják is az izgalmas új szolgáltatások mindegyikét. Ó, dehogy. A legkevésbé sem. A leg­újabb böngészőkben persze hasítani fognak az űrlapjaink, a régi böngészők­ben azonban éppen hogy csak működnek majd - hasításról nemigen beszél­hetünk. Ami viszont jó hír, hogy ez azt jelenti, hogy az említett szolgá!tatások minden böngészőben elegánsan kapcsolnak alacsonyabb fokozatba. Még az IE 6-ban is.

Helyőrző szöveg

Az első többletszolgáltatás, amellyel a HTML5 kiegészíti a webes űrlapokat,

az a lehetőség, hogy helyőrző szöveget helyezhetünk el a beviteli mezőkben. A helyőrző szöveg addig látható a beviteli mezőben, amíg a mező üres, és

nincs rajta a fókusz. Amint a mezőbe kattintunk (vagy a tabulátorbillentyű­vel állítjuk rá a fókuszt), a helyőrző szöveg eltűnik.

Valószínűleg találkoztunk már helyőrző szövegekkel. Ahogy a 9.1. ábrán láthatjuk, a Mozilla Firefox 3.5 például a "Search Bookmarks and History"

9. fejezet Örültűrlapok l 209

Page 203: HTML5 - Az új Szabvány

(Keresés a könyvjelzők és az előzmények között) szöveget jeleníti meg a cím­sávban.

l ( Search Bookmorks ond Hístmy ·l

9.1. ábra Helyőrző szöveg a Firefox keresőmezőjében

Ha a címsávra kattintunk (vagy a tabulátorbillentyűvel ráállírjuk a fókuszt), a helyőrző szöveg eltűnik (lásd a 9.2. ábrát).

9.2. ábra A helyőrző szöveg eltűnik, amikor a fókuszt a mezőre visszük

Ironikus módon a Firefox 3.5 azt nem támogatja, hogy a saját webes űrlapja­inkat is helyőrző szöveggel lássuk el. C'est la vie. A helyőrző szöveg támoga­tását a különféle böngészőkben a 9.1. táblázat mutatja.

9.1. táblázat A helyőrzők támogatása

IE Firefox Satari

3.7+ 4.0+

Chrome O

4.0+

Helyőrző szöveget egyébként az alábbi módon szúrhatunk be egy webes űr­lapba:

<form>

<input name= "q" placeholde="Search Bookmarks and History"> <input type= "submit" value= "Search">

</form>

A helyőrzőker nem támogató böngészők egyszerűen figyelmen kívül hagyják

a placeholder (helyőrző) jellemzőt.

210 l Örültűrlapok 9. fejezet

Page 204: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: A placeholder jellemzőben szerepe/het HTML-kód? Egy képet sze­

retnék beszúrni, vagy esetleg megváltoztatnám a színeket.

Válasz: A placeholder jellemző csak szöveget tartalmazhat, HTML­

kódot nem. Egyes gyártóknak ugyanakkor vannak saját CSS-bővítményei (http: 1/trac. web kit. o rg/export/3 7527/trunki Layout Tests/fast/forms/

placeholder-pseudo-style.html), amelyek lehetövé teszik, hogy bizonyos bön­gészőkben formázzuk a helyőrző szöveget.

Automatikus fókuszálású mezők

Sok webhely JavaScript-kód segítségével önműködően a webes űrlapok első beviteli mezőjére állítja a fókuszt. A Google.com nyitóoldala például automati­

kusan a keresőmezőre állítja a fókusz t, hogy a kulcsszavakat azonnal beír has­suk, anélkül, hogy előbb a mezőbe kellene vinnünk a kurzort. Ez a legtöbb ernber számára kényelmes, de a gyakorlott felhasználóknak vagy a különleges igényekkel bíró felhasználóknak idegesítő lehet: ha lenyomjuk a szóköz bil­lentyűt, arra számítva, hogy ezzel görgetjük az oldalt, csalódni fogunk, mert

a fókusz már egy űrlapmezőben található, ezért az oldal nem fog lejjebb gör­dülni. Helyette egy szóközt írunk a beviteli mezőbe. Ha egy másik bevi­teli rnezőre állítjuk a fókuszt, rniközben az oldal még töltődik, a webhely amofókusz-kezelő parancskódja "segít", és visszateszi a fókuszt az eredeti be­viteli mezőbe, amint az oldal teljesen betöltődött, így megszakítja a munkán­kat, és rossz helyre fogunk gépelni.

Mivel az automatikus fókuszállítás JavaScript-kód segítségével történik, nehéz lehet rninden szélsőséges esetet kezelni, és nem sok lehetősége marad azoknak, akik nem akarják, hogy a weboldal

"ellopja" a fókuszt.

A probléma megoldására a HTML5 egy autofocus nevű jellemzőt vezet be a webes űrlapok rninden vezérlője számára. Az autofocus jellemző pon­

tosan azt teszi, arnire a neve utal: a fókuszt egy adott beviteli mezőre állítja. Mivel azonban ez csak leírókód, és nem parancskód, a viselkedése minden webhelyen azonos. Ezen kívül a böngészőgyártók (illetve a bővítmények készítői) rnódot adhatnak a felhasználóknak az automatikus fókuszálás

9. fejezet Őrültűrlapok l 211

Page 205: HTML5 - Az új Szabvány

kikapcsolására. Azt, hogy mely böngészők támogatják az automatikus fóku­szálást, a 9.2. táblázatban láthatjuk.

9.2. táblázat Az a utofókusz támogatása

IE Flrefox Safarl 4.0+

Így tehetünk egy űrlapmezőt automatikus fókuszálásúvá:

<form>

<input name= "q" autofocus>

<input type= "submit" value= "Search">

</form>

Az autofókuszt nem támogató böngészők egyszerűen figyelmen kívül hagy­ják az autofocus jellemzőt.

Tessék? Azt szeretnénk, hogy az automatikus fókuszálású mezőink min­den böngészőben működjenek, ne csak a csili-vili HTML5-ös böngészőkben? Nos, a régi amofókusz-kezelő parancskódunkat nyugodtan megtarthatjuk, csak két apró változtatást kell végrehajtanunk:

l. Adjuk hozzá az autofocus jellemzőt a HTML-kódhoz. 2. Derítsük ki, hogy a böngésző támogatja-e az autofocus jellemzőt

(lásd az "Automatikus űrlapfókusz" című részt a 2. fejezetben), és csak akkor futtassuk a saját amofókusz-kezelő parancskódunkat, ha a böngészőben nincs beépített támogatás az automatikus fókuszáláshoz:

<form name= "f ">

<input id= •q" autofocus> <script>

if (! ( "autofocus" in document. =eateElement ("input") ) )

document .getElementByld ("q") . focus ();

) </script>

<input type= "submit • value= "Go">

</form>

Ha látni szecetnénk egy példát az autofocus jellemző használarára bizton­sági tartalékra való visszakapcsolással együtt, látogassunk el a http:lldive­intohtml5.orglexampleslinput-autofocus-withfallback.html oldalra.

212 l Örültűrlapok 9. fejezet

Page 206: HTML5 - Az új Szabvány

Leírókód professzor azt mondja

Sok webhely vár a fókusz beállításával, amíg a window.onload ese­

mény be nem következik. Ez az esemény azonban addig nem indul el, amíg

valamennyi kép be nem töltődött. Ha az oldalon sok-sok kép található,

a fentihez hasonló naiv parancskód visszaállíthatja a fókuszt a mezőre,

miközben a felhasználó már az oldal másik részén tevékenykedik. (Ezért

utálják a haladó felhasznáJók az aurofókusz-parancskódokat.) A fenti példa

az amofókusz-parancskódot közvetlenül a hivatkozott űrlapmező után

helyezi el, a háttérrendszereink azonban nem biztos, hogy ilyen rugalma­

sak. Ha nem tudunk az oldal közepére parancskódot beszúrni, a fó­

kuszt a window.onload helyett egy olyan egyéni eseményben kell

beállítanunk, mint a jQuery $ (document). ready () eseménye.

E-mail címek

Több mint egy évtizeden keresztül a webes űrlapok csupán néhány fajta me­

zőből álltak. A legelterjedtebbeket a 9.3. táblázat sorolja fel.

9.3. táblázat Bevitelimezö-típusok a HTML4-ben

• n•sfrY .. HYa • • • II' b-!W,.. Me�yzések 1

Jelölőnégyzet

Választógomb

Jelszómező

Lenyíló lista

Fájlválasztó

Elküldö gomb

Egyszerű szövegmező

<input type;"checkbox">

<input type;"radio">

<input type;"password">

<select><option> ...

<input type; "file">

<input type;"submit">

<in�e;"text">

Ki- és bekapcsolható

Más beviteli elemekkel egy csoportba

foglalható

A karaktereket pontokkal (csillagokkal)

helyettesíti, miközben a felhasználó gépel

Egy fájlmegnyitó párbeszédablakot

jelenít meg

A type jellemző elhagyható

A fenti bevitelielem-típusok a HTML5-ben is működnek. Ha az oldalainkat

"előléptetjük HTML5-té" (például a dokumentumtípus módosításával-lásd

9. fejezet Őrült ürlapok l 213

Page 207: HTML5 - Az új Szabvány

"A dokumentumtípus" cím ű részt a 3. fejezet elején), semmit sem kell változ­

tatnunk a webes űrlapjainkon. Éljen a visszirányú megfelelőség! A HTML5 ugyanakkor több új mezőtípust is meghatároz, és nincs rá

okunk, hogy ne kezdjük el használni őket- mindjárt világossá is válik, miért. Az új bevitelielem-típusok közül az elsőt az e-mail címekhez szánták. Így

néz ki:

<form> <input type=" email"> <input type= "submit" value= "'Go">

</form>

Ide egy olyan mondatot akartam írni, ami így kezdődön volna: "Azokban a böngészőkben, amelyek nem támogatják a type="email"-t . .. ".De nem tettem. Hogy miért? Mert nem igazán tudom, mit jelent az, hogy egy böngé­sző nem támogatja a t y pe= "e ma i l "-t. Minden böngésző támogatja. Lehet, hogy nem csinálnak vele semmi különöset (a type="email" különleges kezelésére hamarosan látunk néhány példát), de azok a böngészők, amelyek nem ismerik fel a type= "email" típusú mezőket, egyszerűen type= "text"

típusúként kezelik őket, és sima szövegmezőként jelenítik meg. Nem tudom eléggé hangsúlyozni, mennyire fontos ez. A Világhálón űr­

lapok milliói találhatók, amelyek egy e-mail cím beírását kérik, és mindegyik az <input type="text"> típust használja. Látunk egy szövegmezőt, be­írjuk az e-mail címünket a mezőbe, és ennyi. Aztán jön a HTML5, és kü­lön meghatározza a t y pe= "e mai l "-t. Ettől kiakadnak a böngészők? Nem. A Földön minden egyes böngésző type="text"-ként kezeli az ismeretlen type jellemzőket, még az IE 6 is. A webes űrlapjainkat tehát most rögtön

"előléptethetjük" a type= "email" használatára.

És mit jelent az, ha azt mondjuk, hogy egy böngésző támogatja a type=

"email "-t? Nos, ez több dolgot is jelenthet. A HTML5 szabványleírása nem követel meg adott felületeket az új bevitelielem-típusok számára. Az Opera az e-mail címmezőket egy apró e-mail ikonnal jelzi. Más HTML5-képes bön­gészők, például a Safari vagy a Chrome, egyszerűen szövegmezőként jelenítik meg öket- pontosan úgy, mint a type="text" típusú mezőket -,így a felhasznáJók észre sem veszik a különbséget (hacsak nem tekintik meg az oldal forrását).

Aztán ott van az iPhone.

214 l Őrültűrlapok 9. fejezet

Page 208: HTML5 - Az új Szabvány

Az iPhone nem rendelkezik fizikai billentyűzetteL A "

gépelés" a képer­nyőn megjelenő virtuális billentyűzet tapogatásával történik, ami akkor buk­kan fel, amikor szükség van rá, például amikor egy űrlapmezőre állítjuk a fó­kuszt egy weboldalon. Az Apple azonban nagyon ügyes megoldást alkalmaz az iPhone webböngészőjében: a böngésző a HTML5 új bevitelielem-típusai közül többet is felismer, és dinamikusan az adott típusú beviteli mezőhöz iga­zítja a képernyőn megjelenő billentyűzetet.

Az e-mail címek például szöveges adatok, igaz? Igaz, de különleges szöve­gek: szinte minden e-mail cím tartalmazza a@ jelet és legalább egy pontot(.), szóközt viszont valószínűleg nem. Amikor tehát egy iPhone-felhasználó egy <input type= "email"> elemre fókuszál, egy olyan billentyűzet jelenik meg a képernyőn, amelyen a szóköz billentyű a szokásosnál kisebb, és külön billentyűk találhatók rajta a @ és . karakterek számára ( lásd a 9.3. ábrát).

Összefoglalva: nincs semmilyen hátránya annak, ha az e-mail címet váró összes űrlapmezőnket máris type= "email" típusúvá alakítjuk. Valószínű­leg senki nem fogja észrevenni - talán az iPhone-használókat kivéve (de még ők sem biztos). Akiknek mégis feltűnik, azok csak csendben elmosolyodnak majd, és köszönetet ruandanak nekünk, hogy kicsit kényelmesebbé tettük a Web használatár.

Webcímek

A webcímek - amelyeket sokan URL, a pedánsabbak pedig URI néven is­mernek- szintén különleges célú szöveges adatok. A webcímek alakját inter­netes szabványok szabályozzák. Ha valaki azt kéri, hogy írjunk be egy web­címer egy űrlapra, valami olyasmit vár, mint a http://www.google.com,

nem pedig olyasmit, mint a "125 Farwood Road". Perjelek és a pontok gyak­

ran előfordulnak a webcímekben, a szóközök használata azonban tilos. Ezen­kívül minden webcím végén áll egy tartomány-utótag, például a ".com" vagy az

".org". És akkor jöjjön az ... (dobpergést kérek) ... <input type="url">! Ez

az elemtípus az iPhone-on úgy fest, mint a 9.4. ábrán.

9. fejezet Örültűrlapok l 215

Page 209: HTML5 - Az új Szabvány

<form>

<input type="email">

9.3. ábra E-mail címek beírására optimalizált billentyűzet

<form>

<input type="url">

9.4. ábra URL-címek beírására optimalizált billentyűzet

216 l Örültűrlapok 9. fejezet

Page 210: HTML5 - Az új Szabvány

Ahogy az e-mail címer váró mezőkhöz, az iPhone a webcímekhez is optimá­lis virtuális billemyűzetet biztosít. A szóköz billentyű helyét teljes egészében átveszi a pom, a perjel és a ".com" virtuális billemyűje. Ha a ".com" billentyűt

lenyomva tartjuk, más gyakori utótagot - például ".org" vagy ".ner" - is vá­laszthatunk.

A HTML5-öt nem támogató böngészők a type="url"-t pomosan úgy ke­zelik, mint a type= "text "-et, tehát nincs semmilyen hátrányos következménye annak, ha minden webcímer váró mezőhöz a type="url" típust rendeljük.

Számok léptetőmezőkben

Következzenek a számok. Egy számot kérni sok szempomból nehezebb, mim egy e-mail vagy webcímet. Először is, a számok bonyolultabbak, mint azt

gondolnánk. Nézzünk egy gyors példát: válasszunk egy számot. -l? Nem jó, egy l és 10 közötti számra gondoltam. 7 1/2? Nem, nem törtszámot, ugyan már. n? Na, ez már tényleg irracionális.

Azt akarom mondani, hogy általában nem "csak egy számot" kérünk. Valószínűbb, hogy egy adott tartományba eső számot szeretnénk, és azon

belül is csak bizonyos típusú számokat engedünk meg - például az egész számokar igen, de a törteket vagy tizedestörteket nem, vagy esetleg valami egzotikusabbat akarunk, például egy tízzel osztható számot. A HTML5 erre

is gondolt. Nézzünk egy példát:

<input type="number"

min= "0" max="lO"

step= "2" value="6">

Nézzük végig egyenként a jellemzőker (a szöveger követherjük egy "élő" pél­dán is, ha akarjuk):

• A type= "number" azt jelenti, hogy egy számmezőről van szó.

• A m i n= "0" a mezőben elfogadható legkisebb értéket határozza meg. • A max= "10" az elfogadható legnagyobb érték megadására szolgál.

• A step="2" (lépésköz =2) a mi n értékkel kombinálva a O, 2, 4 stb. tartományra korlátozza az elfogadható értékeket, egészen a max értékig.

9. fejezet Örültűrlapok l 217

Page 211: HTML5 - Az új Szabvány

• A value="6" az alapértelmezett érték. Ennek ismerősnek kell lennie, mert ugyanaz a jellemző, mint amit korábban mindig is használtunk az űrlapmezők értékeinek meghatározására. (Itt azért említem meg, hogy hangsúlyozzam, hogy a HTML5 a HTML előző változataira épül. Tehát amit már tudunk és használunk, azt nem kell újra megtanulnunk.)

Ez a számmezők leírókód része. Ne feledjük, hogy az említett jellemzők egyike sem kötelező. Ha van legkisebb elfogadható érték, de legnagyobb nincs, meg­adhatjuk csak amin jellemzőt, és elhagyhatjuk a max-ot. Az alapértelmezett lépésköz az l, tehát a step jellemzőt csak akkor kell megadnunk, ha ettől eltérő lépésközt szeretnénk. Ha nincs alapértelmezett érték, a value jellemző értéke lehet egy üres karakterlánc, de teljesen el is hagyhatjuk.

A HTML5 azonban nem éri be ennyivel. Ugyanazon a jutányos áron­ingyen- az alábbi hasznos JavaScript-tagfüggvényekhez is hozzájutunk: input.stepUp(n)

A mező értékét n-nel növeli.

input. stepDown (n)

A mező értékét n-nel csökkenti. input.valueAsNumber

Az aktuális értéket lebegőpontos számként adja vissza (az input.value

tulajdonság értéke mindig egy karakterlánc).

Nehezen tudjuk magunk elé képzelni? Nos, az, hogy a számbeviteli mezők pontosan hogyan jelennek meg, a böngészőnktől függ, és a különböző bön­gészőgyártók más-más felülettel valósították meg a számmezők támogatását. Az iPhone-on - ahol a bevitel eleve körülményes - a böngésző megint csak egy másik, ezúttal a számbevitelhez igazított virtuális billentyűzetet jelenít meg (lásd a 9.5. ábrát).

218 l Őrültűrlapok 9. fejezet

Page 212: HTML5 - Az új Szabvány

<form>

<input type="number">

9.5. ábra Számok beírására optimalizált billentyűzet

Az Opera asztali rendszerekre Írt változatában ugyanez a type= "number"

mező egy "léptetőmező" (spinbox) formájában jelenik meg, kis lefelé és felfelé mutató nyilakkal, amelyekre kattintva módosíthatjuk az értéket (9.6. ábra).

l si�� <form>

<input type="number"

min="o••

max=" l O"

step="2"

value="6">

9.6. ábra Léptetőmező

9. fejezet Őrültűrlapok l 219

Page 213: HTML5 - Az új Szabvány

Az Opera figyelembe veszi amin, max és step jellemzőket, ezért mindig elfogadható számértéket kapunk. Ha az értéket feltoljuk a maximum ra, a lép­tetőmező felfelé mutató nyila kiszürkül (9.7. ábra).

L.._ __ 1_,0 l�

9.7. ábra Léptetőmező maximális értéken

Mint minden más bevitelielem-tÍpus esetében, amelyről ebben a fejezetben szó esik, itt is igaz, hogy a type="number"-t nem támogató böngészők az

ilyen típusú mezőket type= "text "-ként kezelik. Az alapértelmezett érték megjelenik a mezőben (mivel a value jellemzőben tárolódik), de a többi­például amin és amax-jellemzőt a böngésző figyelmen kívül hagyja. Ezeket megvalósíthatjuk magunk, de újrahasznosíthatjuk a léptetőmezőket megva­lósító számos JavaScript-keretrendszer egyikét is. Előtte azonban ne felejtsük el az alábbi módon megvizsgálni, hogy a böngészőben van-e beépített HTML5-támogatás (lásd a 2. fejezet "Bevitelielem-tÍpusok" című részét):

if ( !Modernizr. inputtypes. number) { l l nincs beépített támogatás a type: "number" me zök számára

l l esetleg próbáljuk ki a Dojo-t vagy egy másik JavaScript-keretrendszert

J

Számok csúszkákon

A számbevitel ábrázolására nem az előző részben ismertetett léptetőmezők jelentik az egyetlen megoldást. Valószínűleg találkoztunk már olyan "csúszka"

(slider) vezérlőkkel is, mint amilyen a 9.8. ábrán látható.

9.8. ábra Csúszka

Most már a webes űrlapokon is használhatunk csúszkákat. A kód kísértetie­sen hasonlít a léptetőmezőkére:

220 l Örült űrlapok 9. fejezet

Page 214: HTML5 - Az új Szabvány

<input type="range" min�·o" max="lO" ste�"2" value:;:::"6">

A rendelkezésre álló jellemzők ugyanazok, mint a type= "number" esetében

- min, max, step és value -, és a szerepük is ugyanaz. Az egyeden

különséget a felhasználói felület jelenti. A type= "range" típusú vezérlőker a böngészőnek nem olyan mezőként kell megjelenítenie, amelybe írhatunk,

hanem csúszkaként. E könyv írásának idején a Safari, a Chrome és az Opera legújabb változatai mind képesek volrak erre. (Sajnos az iPhone egyszerű szö­

vegmezőt jelenít meg, és még a képernyőn megjelenő billentyűzetet sem számbevitelhez igazítja.) Minden más böngésző type= "text" típusúként kezeli a type= "range" mezőket, tehát semmi nem tarthat vissza minket

attól, hogy akár rögtön használatba vegyük őket.

Dátumválaszták

A HTML4-ben nem volt dátumválasztó vezérlő. Ezt a hiányosságat külön­

féle JavaScript-keretrendszerekkel- például a Dojo, a j Query UI, a YUI vagy

a Closure Library segítségével - orvosolhattuk, de ezek a megoldások termé­

szetesen a dátumválasztót kínáló reljes keretrendszer alkalmazását igényel­ték.

A HTML5 végre módot ad rá, hogy beépített dátumválasztó vezérlőket

használjunk, és ne kelljen magunknak parancskódokat írnunk. Valójában nem is egy módot, hanem hatot: használhatunk dátumválasztót, hónapvá­

lasztót, hétválasztót, időválasztót, dátum- és időválaszrót, illetve dátum-, idő­

és időzónaválasztÓL A támogatás azonban jelenleg- amint azt a 9.4. táblázat is szemlélteti­

meglehetősen gyér.

9.4. táblázat A dátumválasztó támogatása

Betitelimez�tíous Qoera

type�"date"

type�"month"

9. fejezet

9.0+

9.0+

Minden___másbönaész�

Örült űrlapok l 221

Page 215: HTML5 - Az új Szabvány

type= "week • 9.0+

type= "time • 9.0+

type= "da tetime • 9.0+

type= "da tetime-local" 9.0+

A 9.9. ábrán azt láthatjuk, hogy az Opera hogyan jelenít meg egy <input type="date"> mezőt. Ha a dátum mellé egy időpontot is szerernénk, az Operában <input type= "da tetime "> mezőket is használharunk (lásd a 9.10. ábrát). Ha csak évet és hónapot szeretnénk választani (például egy hi­

telkártya lejárati idejénel megadásához), egy <input type= "month "> tí­pusú mezőre (9.11. ábra) van szükségünk- az Opera ezt is támogatja.

9.9. ábra Dátumválasztó

l 2009-12-25: ... J fGol l� l December 0�

Week lolon Tuo Wed Thu Fri Sat Sun

., 1 � � � � !! I. � l! � 11 g �

.. � � 1!! 1!. � 1l! � .. � � � �

��� ?I.

E 3 � � � � 3

o � 10

Today l None

12009-12-25 .. j�� UTC � �l December L •][2009�

Week Wen Tue Wed Thu Fri S..t S...

! � � � !! !! Z ! �l!!!l!l� ��:!!.!l.!!�� �����""-� ll � � � .!! �- 3

-s ;,. 10

Today N�

9.1 0. ábra Dátum- és időválasztó

222 l Örültűrlapok 9. fejezet

Page 216: HTML5 - Az új Szabvány

9.11. ábra Hónapválasztó

j2009-12 :TJ(Go_] G] De<:ember 0J2009J�

Uon Tue Wed Thu Fn Sat St.. � 1 2 3 4 5 6

!. !�� � ll g � � � .!.!! !l .!.!! !!! � � � � � � � � � � � � � 3

10

i[ Today No-ne ___ ]

Ritkábban használjuk, de ugyancsak rendelkezésre áll az <input type=

"week"> mező, amellyel az év egy adott hetét választhatjuk ki (lásd a 9.12.

ábrát). Végül, de nem utolsó sorban, egy időpontot is kiválaszthatunk egy <input type="time"> mező segítségéve!; ezt a 9.13. ábra szemlélteti.

9.12. ábra Hétválasztó

9.13. ábra Időválasztó

J2009-W52 l T J � j[ • j -D���- l� JI2009J�

w-

� � 21. � � .!

Uon Tue Wed Tm Fn Sat Sun

.! � � � � � :?. � �!Q.!.!gQ

��.!.!!!l.!.!!!!!� � �� � � � � � ��!! " 3

7 � 10

�ay J None J

16:201��

Valószínű, hogy idővel más böngészők is támogatni fogják ezeket a bevi­telielem-típusokat, de addig is nyugodtan használhatjuk őket, mert a type=

"email"-hez (lásd a fejezet "E-mail címek" című részét) és más beviteli ele­mekhez hasonlóan ezeket az űrlapmezőket is egyszerű szövegmezőként je­lenítik meg azok a böngészők, amelyek nem ismerik fel a t y pe= "da te "-et és a többi új típust. Ha tetszik, dönthetünk úgy, hogy az <input

9. fejezet Őrültűrlapok l 223

Page 217: HTML5 - Az új Szabvány

type= "date ">-et és társait használjuk, boldoggá téve az Operát használó­kat, és egyszerűen megvárjuk, amíg a többi böngésző felzárkózik, de azt is megtehetjük, hogy az <input type= "date"> mellett észlelőkódot alkal­mazunk, hogy megállapítsuk, hogy a böngésző támogatja-e a dátumválasztó­kat (lásd a "Bevitelielem-típusok" című részt a 2. fejezetben), és biztonsági tartalékként egy nekünk tetsző parancskódot mellékelünk:

<form>

<input type= "date">

</form>

<script>

var i = docurnent. createElement ("input");

i. setAttribute ("type •, "date");

if (i. type== "text") { l l Nincs beépített dátumválasztó-támogatás : ( l l A Dojo/jQueryUI/YUI/Closure használatával

l l vagy valamilyen más megoldással készítsünk egyet,

l l majd dinamikusan cseréljük le az <input> elemet

) </script>

Keresőmezők

Ez egy kicsit bonyolultabb lesz. Pontosabban, az elv elég egyszerű, de a meg­valósírások némi magyarázato t igényelnek. Íme ...

Keresés. Nem csak a Google Search vagy a Yahoo! Search segítségével (persze ezekkel is): gondoljunk egy tetszőleges keresőmezőre egy tetszőleges oldalon, egy tetszőleges webhelyen. Az Amazonnak is van keresőmezője, a Neweggnek is, és a legtöbb blognak is. Hogyan fest a leírókódjuk? Hát így: <input type="text">- olyan, mint minden más szövegmező a Weben, de ezen a HTML5-ben segíthetünk:

<form>

<input name= •q" type=" search">

<input type= "submit" value= "Find ">

</form>

Egyes böngészőkben semmilyen különbséget nem fogunk észrevenni a szok­ványos szövegmezőkhöz képest. Ha viszont Safarit használunk Mac OS X-en, a mező úgy fog festeni, mint a 9.14. ábrán.

224 l Őrültűrlapok 9. fejezet

Page 218: HTML5 - Az új Szabvány

9.14.ábra Keresőmező

®

<form>

<input type•"search">

<input type•"submit" '

</form>

Látjuk a különbséget? A beviteli mezőnek lekerekített sarkai vannak! Tudom, tudom, állati izgalmas! De várjunk csak, tovább is van! Amikor gépelni kez­dünk egy type= "search" mezőben, aSafari egy apró "x" gombot szúr be a mező jobb oldalára. Ha az "x"-re kattintunk, a böngésző törli a mező tar­talmár. (A Google Chrome, amely a háttérben sok mindenben osztozik a Safarival, szintén így viselkedik.) Mindkét apróság azt a célt szolgálja, hogy a mező úgy nézzen ki és viselkedjen, mint az iTunes és más Mac OS X-ügy­félalkalmazások beépített keresőmezői (lásd a 9.15. ábrát).

foo ®

<form>

<input type•"searcb">

<input type•"submit" '

</form>

9.1 5. ábra Keresőmező fókusszal

Az Apple webhelye is az <input type="search ">kódot használja a web­hely keresőmezőjéhez, hogy a webhely "Mac-érzést" nyújtson. A megoldás­ban azonban nincs semmi, ami csak a Mac sajátja lenne. Az egész csupán leíró kód, tehát minden böngésző minden rendszeren a saját szakásainak meg­felelően jelenítheti meg a keresőmezőt. Ezen kívül, mint minden más új bevitelielem-típusnál, a type= "search" kódot nem ismerő böngészők az ilyen mezőket type= "text" típusúként kezelik, vagyis semmi, de semmi okunk arra, hogy ne kezdjük el már ma használni a type= "search" típusú keresőmezőket.

9. fejezet Őrültűrlapok l 225

Page 219: HTML5 - Az új Szabvány

Leírókód professzor azt mondja

Pomosabban, van egy érv, ami az <input type=" search"> hasz­nálata ellen szólhat: a Safari a keresőmezőkre nem alkalmazza a szoká­sos CSS-stílusokat. ("Szokásos stÍlusok" alatt az olyan alapvető dolgo­

kat értem, mint a szegély, a háttérszín, a háttérkép, a kitöltés, és így tovább.) Viszont lekerekített sarkokat kapunk!

Színválasztók

A HTML5 az <input type= "color"> mezőtípust is meghatározza, amely egy szín kiválasztását teszi lehetővé, és a választott szín tizenhatos számrend­

szerű (hexadecimális) ábrázolását adja vissza. Még egyetlen böngésző sem támogatja, ami szégyen, mert én mindig is imádtam a Mac OS színválasztó­ját. Talán egyszer.

És még egy dolog ...

Ebben a fejezetben a beviteli elemek új típusait, illetve olyan új szolgáltatáso­kat mutattam be, mint az automatikus fókuszálású űrlapmezők, de még nem beszéltem arról, ami talán a legizgalmasabb része a HTML5-űrlapoknak: az

automatikus bemenetellenőrzésről. Gondoljunk az e-mail címek bevitelének szokásos problémájára: a webes űrlapokra beírt e-mail címeket valószínűleg valamilyen ügyféloldali JavaScript-kóddal ellenőrizzük, ezt pedig PHP,

Python vagy más kiszolgálóoldali parancsnyelven írt ellenőrzőkód futtatása követi a kiszolgáló oldalán. Az e-mail címekJavaScript-kóddal történő ellen­őrzése két nagy buktatót rejt:

• A látogatók közül meglepően sokan nem engedélyezik a JavaScript­

kódok futtatását (a Felhasználók mintegy 10 százaléka). • Az ellenőrzést rosszul fogjuk megvalósítani.

Azt, hogy a megvalósításba hiba fog csúszni, a legkomolyabban gondoltam. Azt megállapítani, hogy egy tetszőleges karakterlánc érvényes e-mail cím-e,

226 l Őrültűrlapok 9. fejezet

Page 220: HTML5 - Az új Szabvány

hihetetlenül bonyolult (http://www. regular-expressions. info/email. htmf}. Minél közelebbről vizsgáljuk a kérdést, annál bonyolultabb (http://www.ex-parrot. comlpdw/Maii-RFC822-Address.htmf}. Mondtam már, hogy nagyon, nagyon bonyolult (http:l/haacked.com/archive/2007/08/21/i-knew-how-to-validate­an-email-address-until-i.aspx)? Nem lenne egyszerűbb megspórol ni a fejfájást, és az egészet a böngészőre bízni?

A 9.16. ábrán látható képernyőfelvétel az Opera 10-ben készült, bár a bemu­

tatott szolgáltatás már az Opera 9 óta jelen van a böngészőben. A leírókódban csak annyi kell a működéséhez, hogy a t y pe jellemzőt "email" értéke állírjuk (lásd az "E-mail címek" részt kicsit korábban). Amikor egy Opera-felhasználó egy olyan űrlapot próbál benyújtani, amelyen <input type="email">

mező található, a böngésző automatikusan felajánlja az RFC-megfelelő cím­ellenőrzést, még akkor is, ha a parancskóclak futtatását letiltották.

Az Opera emellett az <input type="url"> mezőkbe írt webcímek és

az <input type= "number"> számmezők érvényességének ellenőrzését is biztosítja. A számellenőrzés során az Opera még a min és max jellemzőket is figyelembe veszi, tehát nem engedi, hogy a felhasználó benyújtsa az űrla­

pot, ha például túl nagy számot írt be (lásd a 9.17. ábrát).

IEJtoobar 1 �� too bar is not a legal e-mail address

9.16. ábra E-mail mező ellenőrzése az Operában

1111� rc;o-1 11 is too high. The

highest value you can u se is 1 O.

9.17. ábra Számmező ellenőrzése az Operában

Sajnos még egyetlen más böngésző sem támogatja a HTML5-űrlapellenőrzést, ezért egy ideig még parancskód alapú megoldásokra kell szorítkoznunk.

9. fejezet Örültűrlapok l 227

Page 221: HTML5 - Az új Szabvány

További olvasmányok

Szabványok és leírások:

• <input> típusok (http://bit.ly/akweH4) • Az <input placeholder> jellemző (http://bit.ly!caGLBN) • Az <input autofocus> jellemző (http://bit.ly!dbJFj4)

JavaScript-könyvtárak:

• A Modernizr HTML5-észlelő könyvtár (http:l!www.modernizr.com/)

Page 222: HTML5 - Az új Szabvány

Ugorjunk fejest!

10. fejezet

"Elosztott", "bővíthetőség"

és más divatos szavak

A HTML5-ben 100-nál is több elem található (http://simon.html5.orglhtml5-elements). Találunk közöttük jelenréstükröző elemeket (lásd a 3. fejezetet), míg mások csupán tárolók az oldalon felhasználható API-khoz (lásd a 4. fe­jezetet). A HTML története során (lásd az l. fejezetet) a szabványügyi bi­zottságok tagjai mindig is vitatkoztak, hogy mely elemek kerüljenek bele a nyelvbe. Legyen a HTML-ben <figure> elem? Vagy <person> elem? Eset­leg <r ant>? Aztán meghozzák a döntést, megírják a szabványokat, a szerzők

szereznek, a megvalósírók megvalósítanak, a Web pedig tovább terjeszkedik. A HTML természetesen nem tehet mindenki kedvére. Erre egyetlen szab­

vány sem képes. Egyes ötletek leverik a lécet. A HTML5-ben például nincs <person> elem. (Sőt, <r ant> elem sincs, hogy a fene vinné el!) Semmi nem akadályoz meg minket abban, hogy egy <person> elemet tegyünk egy we­boldalra, csak éppen nem számít majd érvényesnek, a működése nem lesz egységes a különböző böngészőkben (lásd a "Hosszú kitérő arról, hogy mi­kém kezelik a böngészők az ismeretlen elemeket" című részt a 3. fejezetben), és ütközhet a jövőbeli HTML-szabványokkal, ha azokban már esetleg szere­

peini fog ez az elem.

Ha viszont a saját elemek létrehozása nem megoldás, mit tehet egy a jelen­téstükröző kódra odafigyelő webfejlesztő? A HTML korábbi változatainak bővítésére számos kísérletet tettek. A legnépszerűbbnek a mikroformátumok (http://microformats.org/) alkalmazása bizonyult, amelyek a HTML4-ben a class és rel jellemzökre támaszkodnak. Egy másik megoldást kínál az

RO Fa (http://www. w 3. org!TR/rdfo-syntaxl), amelyet eredetileg az XHTML-ben

10. fejezet ,.Elosztott", ,.bővíthetőség"... l 229

Page 223: HTML5 - Az új Szabvány

való használatra terveztek (lásd az l. fejezetben az "

Utószó" című részt), de a HTML-re is átültetik.

Mind a mikroformátumoknak, mind az RDFa-nak megvannak a maga előnyei és hátrányai, viszont gyökeresen más módon próbálják elérni ugyan­azt a célt: a weboldalak olyan jelentésű elemekkel való bővítésér, amelyek nem képezik részét a HTML nyelv magj ának. Ebben a fejezetben nem szeret­nék szenvedélyes vitár nyitni ezekről a formátumokról (ehhez tényleg kellene egy <r ant> elem!), ehelyett inkább egy harmadik lehetőségre összpontosíta­nék, amely magának a HTML5-nek is szerves része: a mikroadatokra.

Mik azok a mikroadatok?

A következő mondatban minden egyes szó számít, ezért nagyon figyeljünk!

Leírókód professzor azt mondja

A mikroadatok hatókörrel ellátott, különböző szótárakból származó név-érték párokkal egészítik ki a DOM szerkezetét.

Mit jelent ez? A mikroadatok egyéni szótárakra (custom vocabularies) épül­nek.

"Az összes HTML5-elem halmaza" például egy szótár. Ez a szótár ma­

gában foglalja a szakaszokat és cikkeket jelölő elemeket (lásd a 3. fejezet "

Új jelentéstükröző elemek a HTML5-ben" című részét), de a személyeket vagy eseményeket leíró elemeker nem. Ha be szeretnénk mutatni egy személyt egy weboldalon, saját szótárat kell meghatároznunk. A mikroadatok ezt teszik lehetövé. Bárki meghatározhat mikroadat-szótárat, és annak segítségével hoz­zálátha t, hogy egyéni tulajdonságokat ágyazzon be a saját weboldalaiba.

A következő dolog, amit tudnunk kell a mikroadatokról, hogy név-érték párokból állnak. Minden mikroadat-szótár névvel rendelkező (nevesített) tu­lajdonságok halmazár határozza meg. Egy Person (

"Személy") szótár megha­

tározhat például olyan tulajdonságokat, mint a name ("

név") vagy a photo

(,,fénykép"). Egy adott mikroadat-tulajdonság beágyazásához a weboldal egy adott pontján meg kell adnunk a tulajdonság nevét. Azt, hogy milyen módon

230 J .,Elosztott", .,bővíthetőség" ... 10. fejezet

Page 224: HTML5 - Az új Szabvány

nyerhetjük ki a tulajdonság értékér, a mikroadatok szabályai határozzák meg, attól függően, hogy hol vezetjük be a tulajdonság nevét. (Erről a következő részben bővebben is szót ejtünk.)

A nevesített tulajdonságok mellett a mikroadatok erőteljesen támaszkod­nak a "hatókörökre" is. A mikroadatok hatókörét úgy képzelhetjük el a leg­egyszerűbben, ha a DOM elemei közötti természetes szülő-gyermek kapcso­latokra gondolunk. A <html> elem (lásd a 3. fejezet "A gyökérelem" című részét) általában két gyermekelemet tartalmaz: a <head> (lásd "A <head> elem" cínű részt a 3. fejezetben) és a <body> elemet. A <body> elemnek jellemzően több gyermeke is van, amelyek mindegyikének saját gyermekei lehetnek. Egy oldalunk például tartalmazhat egy <hl> elemet egy <hgroup>

elemen belül, amely egy <header> elemben található (lásd a "Címsorok"

című részt a 3. fejezetben), az pedig a <body> elemben. Ehhez hasonlóan, egy adattáblázat <td> elemeket tartalmazhat <tr> elemeken belül, amelyek pedig egy <table> elemben helyezkednek el (a <body> elemen belül). A mikroadatok magának a DOM-nak a hierarchikus szerkezetét hasznosírják újra, hogy azt mondhassák: "minden tulajdonság, ami ezen az elemen belül

található, ebből a szótárból származik". Ez lehetövé teszi, hogy ugyanazon az oldalon több mikroadat-szótárat is használhassunk. A mikroadat-szótárakat

akár más szótárakba is ágyazhatjuk, az egész láncban a DOM természetes felépítését újrahasznosítva. (Az egymásba ágyazott szótárakra a fejezet során több példát is láthatunk majd.)

Már érintettem a DOM kérdését, de érdemes alaposabban kifejteni. A mikroadatok célja az, hogy kiegészítő jelentéssei lássák el azokat az adato­kat, amelyek már amúgy is láthatók a weboldalon. A mikroadatokat tehát nem önálló adatformátumnak szánták, hanem a HTML kiegészítésének. Ahogy a következő részben látni fogjuk, a mikroadatok akkor működnek a legjobban, ha egyébként helyesen használjuk a HTML-t, de a HTML szó­tárát nem találjuk elég kifejezőnek. A mikroadatok a DOM-ban már sze­replő adatok jelentésének finomhangolására alkalmazhatók kiválóan. Ha az adatok, amelyeknek a jelentését körül szetetnénk írni, nem szerepeinek

a DOM-ban, célszerű megvizsgálnunk, hogy valóban a mikroadatok je­lentik-e a megoldást.

Most már jobban értjük Leírókód professzor fenti kijelentését? Remélem, igen. Akkor nézzük meg, hogyan is működik mindez a gyakorlatban!

10. fejezet "Elosztott", "bővíthetőség" . . . l 231

Page 225: HTML5 - Az új Szabvány

A mikroadatok adatmodellje

Saját mikroadat-szótárat meghatározni könnyű. Először is egy névtérre van szükségünk, ami csupán egy URL. A névtér URL-je mutathat például egy működő weboldalra, bár ez szigorúan véve nem kötelező. Tegyük fel, hogy egy olyan mikroadat-szótárat szeretnénk meghatározni, amely egy személyt ír le. Ha a birtokunkban van a data-vocabulary.org tartomány, a mikroadat­szótárunk névtereként a http:l!data-vocabulary.org!Person címet használhat­juk. Így egyszerűen létrehozhatunk egy globálisan egyedi azonosítót: csak ki kell választanunk egy URL-t egy olyan tartományból, amelyet mi irányítunk

Ebben a szótárban meg kell határoznunk néhány nevesített tulajdonságot. Kezdjük három alaptulajdonsággal:

• name (a felhasználó teljes neve) • photo (a felhasználó arcképére mutaró hivatkozás) • url (egy a felhasználóhoz társított webhelyre, például egy webnaplóra

vagy Google-profilra mutató hivatkozás)

A fenti tulajdonságok közül kettő URL, a harmadik pedig sima szöveg. Tehát mindegyik egyszerűen ábrázolható leírókóddal; ehhez még nem kell sem mikroadatokat, sem szótárakat használnunk. Tegyük fel, hogy van egy pro­filoldalunk vagy egy "névjegy" ("about") oldalunk. Ezen a nevünk valószínű­leg címsorként, például egy <hl> elemmel jelölve szerepel. A fényképünk feltehetőleg egy <img> elem, mivel azt szeretnénk, hogy mások lássák. Ezen kívül a profilunkhoz társított URL-ekből már nyilván hiperhivatkozásokat hoztunk létre, hiszen azt szeretnénk, hogy a látogatók rájuk kattintsanak. A példa kedvéért tételezzük fel, hogy a teljes profilt egy <section> elembe burkoltuk, hogy elválasszuk az oldaltartalom többi részétől. Így:

<section>

<hl>Mark Pilgrim</hl>

<p><img sr c= "h t tp: l /www. example. com/photo. jpg" alt=" [me smiling] "></p>

<p><ahref="http://diveintomark.org/">weblog</a></p>

</section>

A mikroadatok adarmodelljét a név-érték párok jelentik. Egy mikroadat­tulajdonság nevét (amilyen a példánkban a name, a photo vagy az url) mindig egy HTML-elemben adjuk meg, a neki megfelelő tulajdonságértéket

232 l ,.Elosztott", ,.bővíthetőség" ... 10. fejezet

Page 226: HTML5 - Az új Szabvány

pedig az elem DOM-jából olvassuk ki. A legtöbb HTML-elem esetében a tu­lajdonságérték egyszerűen az elem szövegtartalma. Mindazonáltal - ahogy a 10.1. táblázat is mutatja-ez alól van néhány kivétel.

1 0.1. táblázat Honnan származik a mikroadat-tulajdonságok értéke? ették

<me ta> con ten t iellemző

<audio> sr c jellemző

<embed>

<iframe>

<img>

<source>

<v ideo>

<a> href jellemző

<a re a>

<link>

<object> data jellemző

<L ime> datetime jellemző

Minden más elem Szöve.9.es tartalom

"Mikroadatokat hozzáadni" egy oldalhoz csupán annyiból áll, hogy a már meglevő HTML-elemeket kiegészítjük néhány jellemzőveL Az első teendőnk minden esetben az, hogy egyitemtype jellemző hozzáadásával bejelentjük, hogy melyik mikroadat-szótárat használjuk. A második teendőnk mindig a szótár hatókörének meghatározása egy itemscope jellemzőveL Ebben a példában minden adat, aminek a jelentését le szeretnénk írni, egy <section> elemben található, ezért az itemtype és itemscope jellemzőket ebben a <section> elemben adjuk meg:

<section i temscope i temtype="http: //data-vocabulary. org/Person">

A <section> elemen belül az első adat a nevünk, amelyet egy <hl> elem burkol be. A <hl> elem nem igényel semmilyen különleges feldolgozást, vagyis a 10.1. táblázat "Minden más elem" szabálya alá tartozik, amelynél a mikroadat­tulajdonság értéke egyszerűen az elem szövegtartalma (a dolog ugyanilyen jól működik, ha a nevünket egy <p>, <div> vagy <span> elembe burkoljuk):

<hl itemprop="name">Mark Pilgrim</hl>

10. fejezet "Elosztott", "bővíthetőség"... l 233

Page 227: HTML5 - Az új Szabvány

Ez magyarul annyit tesz, hogy "Íme a http://data-vocabulary.org/

Person szótár name tulajdonsága. A tulajdonság értéke Mark Pilgrim."

A következő a photo tulajdonság, amelynek elvileg egy URL-nek kell lennie. A 10.1. táblázat szerint az <img> elemek "értékér

" az src jellemző­

jükben találjuk. Nézzenek oda, hiszen a profilfotónk URL-je már egy <img

src> jellemzőben található! Mindössze annyit kell tennünk, hogy bejelent­jük, hogy az <img> elem a photo tulajdonság:

<p><img itemprop="photo" src= "h t tp: l /www. example. com/photo. jpg"

al t=" [mosolygok) "></p>

Ez magyarul annyit tesz, hogy "Íme a http://data-vocabulary.org/

Person szótár photo tulajdonsága. A tulajdonság értéke http://www.

example. com/ photo .jpg.".

Végül, az url tulajdonság szintén egy URL. A 10.1. táblázat szerím az <a> elemek "értékér

" a href jellemzőjükben találjuk. Ez ismét csak tökéle­

tesen illeszkedik a meglevő kódunkhoz, hiszen csak annyit kell tennünk, hogy azt mondjuk, hogy a meglevő <a> elem az url tulajdonság:

<a itemprop="url" href= "h t tp: l /diveintomark. org/ ">dive in to mark</ a>

Ez magyarul annyit tesz, hogy "Íme a http://data-vocabulary.org/

Person szótár url tulajdonsága. A tulajdonság értéke http://diveinto­

mark.org/."

Természetesen ha a leírókódunk némileg különbözik, az nem jelent gon­dot. Mikroadat-tulajdonságokat és -értékeket tetszőleges HTML-kódhoz hozzáadhatunk, még az igazán durva, XX. századi, táblázatokkal formázott, "Ó, istenem, miért is vállaltam el a karbantartását?

" sóhajt kiváltó HTML­

oldalakhoz is. Én ugyan nem ajánlom, hogy az alábbihoz hasonló kódot használjunk, de attól még mindig meglehetősen elterjedt - és nyugodtan ki­egészíthetjük mikroadatokkal:

<TABLE>

<TR><TD>Name<TD>Mark Pilgrim

<TR><TD>Link<TD>

<A href=# onclick=goExternalLink () >http: l /diveintomark. org/</A>

</TABLE>

A name tulajdonság megjelöléséhez csak annyit kell tennünk, hogy hozzá­adunk egy i temprop jellemzőt a nevet tartalmazó táblázatcellához. A táb-

234 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 228: HTML5 - Az új Szabvány

lázatcellákra nem vonatkoznak különleges szabályok, ezért a mikroadatok az alapértelmezett értéket kapják, tehát a mikroadat értéke az elem szövegtar­talma lesz:

<TR><TD>Name<TD itemprop="name">Mark Pilgrim

Az url tulajdonság hozzáadása bonyolulrabbnak látszik, a kódunk ugyanis nem megfelelően használja az <a> elemet: ahelyett, hogy a hivatkozás célját a href jellemzőben helyezné el, a href jellemzőben semmi hasznosat nem tartalmaz, inkább az onclick jellemzőbe tett JavaScript-kód segítségével hív meg egy függvényt (ami itt nem szerepel), amely kinyeri az URL-t, és a benne levő címre ugrik. "Ó, a francba, ne már!" bónuszpontokért tegyünk úgy, mintha a függvény a hivatkozott oldalt ráadásul egy apró, gördítősávok nélküli előugró ablakban nyitná meg. Ugye milyen vicces volt az Internet a múlt században?

Ettől függetlenül azért mikroadat-rulajdonsággá alakíthatjuk a kódunkat, csak egy kicsit kreatívnak kell lennünk. Az <a> elem közvetlen használatát kizárhatjuk A hivatkozás célja nem a href jellemzőben található, és nincs rá mód, hogy felülbíráljuk a szabályt, amely kimondja, hogy

"egy <a> elem­

ben a mikroadat-tulajdonság értéket a href jellemzőben kell keresni". Vi­szont azt megtehetjük, hogy egy burkolóelembe ágyazzuk az egész katyvaszt, és ennek a segítségével adjuk meg az url mikroadat-tulajdonságot:

<TABLE i temscope i temtype= "http: l ldata-vocabulary. orgiPerson ">

<TR><TD>Name<TD>Mark Pilgrim

<TR><TD>Link<TD>

<span itemprop= "url">

<A href=# onclick=goExternalLink () >http: l ldi veintomark. orgi<IA>

<lspan>

<ITABLE>

Mivel a <span> elem nem igényel semmilyen különleges feldolgozást, az alapértelmezett szabály vonatkozik rá, amely szerint

"a mikroadat-tulajdonság

értéke a szövegtartalom". A "

szövegtartalom" ugyanakkor nem "

az adott ele­men belül található összes leírókódot" jelenti (mint mondjuk az innerHTML

DOM-tulajdonság esetében), hanem csupán annyit tesz: "

csak a szöveget, asszonyom". Esetünkben a <span> elemen belül található <a> elem szöveg­tartalma a http://diveintomark.org/ cím.

Összefoglalva: mikroadat-tulajdonságokat bármilyen leírókódhoz hozzá­adhatunk, de könnyebbnek fogjuk találni, ha helyesen használjuk a HTML-r.

10. fejezet .,Elosztott", .,bővíthetőség"... l 235

Page 229: HTML5 - Az új Szabvány

Személyek felcímkézése

Az előző részben szereplő bevezető példák nem voltak teljesen légből kapot­tak: valóban létezik mikroadat-szórár a személyekhez kapcsolódó adatok meg­jelölésére, és valóban ilyen egyszerű a használata. Nézzük meg közelebbről!

Mikroadatokat a legkönnyebben a "névjegyoldalunkon" ("About") ágyaz­harunk be a személyes webhelyünkbe. Ugye van "About" oldalunk? Ha nincs,

kövessük azt, ahogy a http:!ldiveintohtml5.orglexampleslperson.html címen található mintaoldalt bővítettem jelentéstükröző elemekkeL A végered­

mény a http://diveintohtml5.orglexampleslperson-plus-microdata.html címen

tekinthető meg. Először vessünk egy pillantást a nyers leírókódra, bármilyen mikroadat­

rulajdonság hozzáadása előtt:

<section>

<img wid th= "204" height= "250"

src="http://diveintohtml 5.org/examples/2000_05_mark.jpg "

alt=" [Mark Pilgrim, ci r ca 200 0 l ">

<hl>Contact Information</hl>

<dl>

<dt>Name</dt>

<dd>Mark Pilgrim</ dd>

<dt>Position</dt>

<dd>Developer advocate for Google, Inc. <Idd>

<dt>Mailing address</dt>

<dd>

1 00Main Street<br>

Anytown, PA 19999<br>

USA

</dd>

</dl>

<hl>My Digital Footprints</hl>

<ul>

<li><a href= "http: l /diveintomark. org/ ">weblog</a></li>

<li>< a href= "h t tp: l /www. google. com/profiles/pilgrim ">Google prof ile</

a></li>

<li><a href= "h t tp: l /www. reddit. com/user/MarkPilgrim ">Reddit. com

profile</a></li>

<li><a href= "http: l /www. twitter. com/diveintomark ">Twitter</a></li>

</ul>

</section>

236 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 230: HTML5 - Az új Szabvány

Az első teendőnk minden esetben az, hogy bejelentjük, hogy milyen szótárat használunk, és megadjuk a hozzáadni kívánt tulajdonságok hatókörét. Ezt úgy tehetjük meg, hogy hozzáadjuk az itemtype és itemscope jellemző­ket a tényleges adatokat tartalmazó elemeket magába foglaló legkülső elem­hez. Ez a mi esetünkben egy <section> elem:

<section i temscope itemtype="http: l /data-vocabulary. org/Person">

� � Az itt végrehajtott változtatásokat az Interneten is nyomon kö­vethetjük. Előtte: http:!ldiveintohtml5.orglexampleslperson.html. Utána: http://diveintohtmi5. orglexampleslperson-plus-microdata. h tm l.

Most már nekiállhatunk meghatározni a http://data-vocabulary.org/

Person szótár mikroadat-tulajdonságait. De mik is ezek a tulajdonságok? Nos, a tulajdonságok listáját történetesen megtekinrhetjük, ha ellátogarunk a http:!ldata-vocabulary.org/Person címre. A mikroadatok szabványleírása ezt nem követeli meg, de én feltétlenül "ajánlott eljárásnak" tekintem. Végtére is, ha azt szeretnénk, hogy a fejlesztök valóban használják is a mikroadat-szótárunkat, akkor valahogy dokumentálnunk kell azt. És hol lenne jobb helye ennek a dokumentációnak, mint magának a szótárnak az URL-címén? A Person (Sze­mély) szótár tulajdonságait a 10.2. táblázatban láthatjuk.

1 0.2. táblázat A Person szótár

Leírás

name Név

nickname Becenév

photo Képhivatkozás

ti tle A személy beosztása (például .gazdasági igazgató")

ro le A személy munkaköre (például.könyvelö")

url Weboldal ra, például az illetö honlapjára mutató hivatkozás

af fi l i a t ion Annak a szervezetnek!cégnek a neve, ahová az ille tó tartozik (például alkalmazottként)

fr i end Egy társas kapcsolatot azonosít az adott és egy másik személy között (barát)

con t act Egy társas kapcsolatot azonosít az adott és egy másik személy között (üzletfél)

acquaintance Egy társas kapcsolatot azonosít az adott és egy másik személy között (ismerös)

address Az illetö címe (olyan résztulajdonságai lehetnek, mint a street-address, a loea­

li ty, a reg ion, a postal-code és a country-name, vagyis utca, helység,

körzet!állam/megye, postai irányítószám és ország)

10. fejezet "Elosztott", "

bővíthetőség" ... l 237

Page 231: HTML5 - Az új Szabvány

A személyes adatoknak ezen a mintaoldalán elsőként egy kép szerepel rólam, amit természetesen egy <img> elemmel címkéztem fel. Ahhoz, hogy beje­lentsem, hogy ez az <img> elem az én profilképem, csak annyit kellett ten­nem, hogy hozzáadtam az i temprop= "photo" jellemzőt:

<img itemprop="photo" width= "204" height= "250" src="http:/ /diveintohtml5.org/examples/2000_05_mark.jpg" alt=" [Mark Pilgrim, circa 200 0] ">

Hol találjuk a mikroadat-tulajdonság értékér? Már ott van, az src jellemző­ben. A 10.1. táblázatból emlékezhetünk rá, hogy az <img> elemek "értékér"

az src jellemzőjük adja meg. Minden <img> elemnek van src (forrás) jel­

lemzője - különben a képet nem lehetne megjeleníteni -, és a forrás mindig egy URL. Látjuk? Ha a HTML-t helyesen használjuk, a mikroadatok hasz­nálata is egyszerű.

Ezenkívül az említett <img> elem nem önmagában árválkodik az olda­lon, hanem annak a <section> elemnek a gyermeke, amelyet az imént az itemscope jellemzővel vezettünk be. A mikroadatok az oldal elemeinek

szülő-gyermek kapcsolatait hasznosítják újra a mikroadat-tulajdonságok hatókörének meghatározásához. Hétköznapi nyelven, ezt mondjuk: "Ez a <section> elem egy személye ábrázol. Minden mikroadat-tulajdonság, amelyet a <section> elem gyermekeiben találunk, ennek a személynek egy­

egy tulajdonsága.". Ha az segít, a <section> elemre gondolhatunk úgy is,

mint egy mondat alanyára. Az i temprop jellemző a mondat állítmánya­valami olyasmi, mint az alábbi példában a "látható" - a mondat tárgya pedig

a mikroadat-tulajdonság értéke:

Ez a személy [közvetlenül a <sect ion item s cope itemtype=" ... ">-ból] ezen a képen látható: [közvetlenül az <img itemprop="photo">-ból] http: l /diveintohtml5 .org/ex a mples/2000 05 m ark .jpg [közvetve, az <img src> jellemzőből]

Az alanye csak egyszer kell meghatározni, az itemscope és i temtype jel­lemzőket a legkülső <section> elemhez adva, az állítmányt pedig az i temprop= "photo" jellemzőt az <img> elemhez adva határozzuk meg.

A mondat tárgya nem igényel semmilyen különleges leírókódot, mert a 10.1.

táblázat azt mondja, hogy egy <img> elem tulajdonságértéke az elem src

jellemző je.

238 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 232: HTML5 - Az új Szabvány

A kódban tovább haladva egy <hl> címsort láthatunk, valamint egy <dl>

lista elejét. Sem a <hl>, sem a <dl> elemet nem szükséges mikroadatokkal kiegészítenünk. Nem minden HTML-részlemek kell mikroadat-tulajdonság­nak lennie. A mikroadatok lényegér maguk a tulajdonságok jelentik, nem az

azokat körülvevő Ieírókóclok vagy címsorok. Az említett <hl> elem nem tu­lajdonság, csupán egy címsor, és ugyanígy a "Name

" <dt> elem is csak egy

szövegcímke:

<hl>Contactinformation</hl> <dl>

<dt>Name</dt>

<dd>Mark Pilgrim</ dd>

Hol van tehát az igazi információ? A <dd> elemben, tehát ide kell tennünk

az i temprop jellemzőt. Melyik tulajdonságról van szó? A name tulajdon­ságróL Mi ennek a tulajdonságnak az értéke? A <dd> elemben található szö­

veg. Kell külön jelölnünk valamit? A 10.1. táblázat azt mondja, hogy nem:

a <dd> elemek nem igényelnek különleges feldolgozást, tehát a tulajdonság értéke egyszerűen az elemben található szöveg:

<dd itemprop="name">Mark Pilgrim</ dd>

Ezt hogyan is fogalmazhatjuk meg hétköznapi nyelven? "Ennek a személynek a neve Mark Pilgrim.

" Akkor jó. Tovább.

A következő két tulajdonság kicsit nehezebb. A kód ez volt a mikroadatok

hozzáadása előtt:

<dt>Position</dt>

<dd>Developer advocate for Google, Inc.</dd>

Ha megnézzük a Person szótár meghatározását, a "Developer advocate for

Google, Inc."

szöveg valójában két tulajdonságból áll: a beosztásból (title:

"Developer advocate") és a szervezet nevéből (affiliation: "Google, Inc.

").

Hogyan fejezhetjük ki ezt mikroadatokkal? A válasz röviden: sehogy. A mikro­

adatok nem adnak módot arra, hogy szövegfolyamokat önálló tulajdonsá­gokra bomsunk fel. Nem mondhatjuk azt, hogy "ennek a szövegnek az első

18 karaktere egy mikroadat-tulajdonság, az utolsó 12 karaktere pedig egy másik mikroadat-tulajdonság

".

Mindazonáltal nincs minden veszve. Tegyük fel, hogy a "Developer advocate

" szöveget más betűtípussal szeretnénk formázni, mint a "Google,

10. fejezet "Elosztott", "bővíthetőség"... l 239

Page 233: HTML5 - Az új Szabvány

Inc." szövegrészt. Erre a CSS sem képes. Mit tehetünk hát? Először olyan

álelemekbe kell burkolnunk az egyes szövegrészeket, mint a <span>, majd

különböző CSS-stílusokat kell alkalmaznunk az egyes <span> elemekre. Ez a módszer a mikroadatoknál is működik. A példánkban kétféle infor­

mációt kell kezelnünk: a title és az affiliation tulajdonságokat. Ha

mindkettőt egy-egy <span> álelembe burkoljuk, megadhatjuk, hogy az egyes

<span> elemek önálló mikroadat-tulajdonságok:

<dt>Position</dt> <dd><span itemprop="title">Developer advocate</span> for

<span i temprop="affiliation">Google, Inc. <span>< l dd>

Csiribú-csiribá! A fenti kód magyarul annyit tesz, hogy "

Ennek a személynek a beosztása

"Developer advocate". Ez a személy a

"Google, Inc." alkalmazásában

áll." Két mondat, két mikroadat-tulajdonság. Egy kicsivel több kód, de megéri.

Ugyanezt a megoldást a postai címeknél is alkalmazhatjuk. A Person szó­tár meghatároz egy address (cím) tulajdonságot, amely maga is egy mikro­

adat. Ez azt jelenti, hogy a címnek is megvan a saját szótára (http:!ldata-voca­bulary.org!Address), és saját tulajdonságokat- street-address, local it y,

region, postal-code és country-name- határoz meg.

Ha programozók vagyunk, valószínűleg ismerjük az objektumok és azok

tulajdonságainak "

pont jelöléssel" történő meghatározását. Az objektumok

közötti kapcsolatokra gondoljunk így:

• Person

• Person.address

• Person.address.street-address

• Person.address.locality

• Person.address.region

• Person.address.postal-code

• Person.address.country-name

Ebben a példában az utcát és a házszámot (street-address) egyetlen <dd>

elem tartalmazza. (Még egyszer: a <d t> elem csak egy címke, így nem játszik

szerepet a kód jelentésének mikroadatokkal történő bővítésében.) Az address

tulajdonság megadása egyszerű: csak hozzá kell adnunk egy i temprop jellem­

zőt a <dd> elemhez:

<dt>Mailing address</dt> <dd itemprop="address">

240 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 234: HTML5 - Az új Szabvány

Ne feledjük azonban, hogy maga az address tulajdonság is egy mikroadat.

Ez azt jelenti, hogy az itemscope és itemtype jellemzőket is hozzá kell adnunk:

<dt>Mailing address</dt>

<dd itemprop= "address" i temscope

itemtype="http://data-vocabulary.org/Address">

Mindezt már korábban is láttuk, de csak a legfelső szintű elemeknéL Egy

<section> elem határozza meg az itemscope és i temtype jellemzőket, és a <section> elemben található minden mikroadat-tulajdonságokat meg­

határozó elem a megadott szótár "hatókörébe"

tartozik. Ez az első eset azon­

ban, hogy egymásba ágyazott hatóköröket látunk: egy új elemtípust és -hatókört (itemscope és itemtype) határozunk meg (a <dd> elemre) egy meglevő elemtípuson és -hatókörön (a <section> elemén) belül. Az egymásba ágya­

zott hatákörök pontosan ugyanúgy működnek, mint a HTML DOM. A <dd>

elem mindegyik gyermekeleme a <dd> elemnél megadott szótár hatókörébe

tartozik. Amint a <dd> elemet lezárjuk a hozzá tartozó </dd> címkével,

visszatérünk a szülőelem (esetünkben a <section>) szótárához. Az Address (Cím) szótár tulajdonságai ugyanazt a problémát vetik fel,

mint amit a tit le és a ff iliation tulajdonságok: csak egy hosszú szöveg­

folyamunk van, amit viszont több önálló mikroadat-tulajdonságra szeretnénk

felbontani. A megoldás is ugyanaz: az egyes információkat egy-egy <span>

áldembe burkoljuk, majd ezekben a <span> elemekben egyesével bevezet­

jük a mikroadat-tulajdonságokat:

<dd i temprop= "address " i t emseope

itemtype="http://data-vocabulary.org/Address">

<span itemprop="street-adclress">lOO Main Street</span><br>

<span itemprop="locality" >Anytown</span>,

<span i temprop=" reg ion"> PA< l span>

<span itemprop="postal-code" >19999</span>

<span i temprop=" country-name">USA</ span>

</dd>

</dl>

Ez magyarul annyit tesz, hogy "Ennek a személynek van egy levelezési címe. A levelezési címben az utca és a házszám "100 Main Street

", a helység

" Anytown", az állam "PA'', a postai irányítószám "19999'', az országnév pedig

"USA''. Egyszerűbb már nem is lehetne.

10. fejezet "Elosztott", "bővíthetőség" ... l 241

Page 235: HTML5 - Az új Szabvány

Kérdezzük meg Leírókód professzort!

Kérdés: A fenti címformdtum csak az Egyesült Államokra vonatkozik? Válasz: Nem. Az Address szótár tulajdonságai elég általánosak ahhoz, hogy a legtöbb címer képesek legyenek leírni a világon. Nem minden címben lesz értéke minden egyes tulajdonságnak, de ezzel nincs gond. Egyes címek megkövetel hetik, hogy egyetlen tulajdonságba egynél több "sort" gyömöszöljünk, de ez is rendben van. Ha a levelezési címben például utca, házszám és lakásszám is található, mindhárom a street­

address résztulajdonságba kerül: <p i temprop=" address" i t emseope

itemtype="http://data-vocabulary.org/Address">

<span i temprop=" street -address">

100Main Street Sui te 415

</span>

</p>

A minta-névjegyoldalunkon még egy dolog található: egy URL-lista. A Person szótár erre is tartalmaz egy tulajdonságot: az url-t. Az url tulajdonság bármi lehetne (persze egy URL-nek kell lennie, de ezt valószínűleg kitalál­tuk)- úgy értem, az url tulajdonság meghatározása nagyon tág. A tulajdon­ság értéke bármilyen fajta URL lehet, amit egy személyhez társíthatunk: egy webnapló vagy egy fotógaléria címe, vagy egy profilé egy másik webhelyen, például a Facebookon vagy a T witteren.

A másik lényeges dolog, amit meg kell jegyeznünk, hogy egyeden személynek több url tulajdonsága is lehet. Elvileg bármelyik tulajdonság szerepelhet több­ször, de ennek eddig nem használtuk ki az előnyeit. Lehet például két photo

tulajdonságunk, amelyek különböző képek URL-jére mutatnak. Itt négy URL­címer szeretnék felsorolni: a webnaplómét, a Google-profiloldalamét, a Reddit­felhasználói profilomét és a T witter-fiókomét. A HTML-ben ez egy hivatko­záslis ra: négy <a> elem, amelyek egy-egy önálló <li> elemben találhatók. Mikroadatként mindegyik <a> elem egy itemprop="url" jellemzőt kap:

<hl>My Digital Footprints</hl>

<ul>

<li><a href= "http: l /diveintomark. org/"

itemprop="url">weblog</a></li>

<li><a href= "http: l /www. google. com/profiles/pilgrim"

242 l "

Elosztott", "bővíthetőség" ... 10. fejezet

Page 236: HTML5 - Az új Szabvány

itemprop="url">Google profile</a></li>

<li><a href; "http: l /www. reddit. com/user/MarkPilgrim"

i temprop="url">Reddi t. com profile</a></ li>

<li><ahref;"http://www.twitter.com/diveintomark"

itemprop="url">Twitter</a></li>

</ul>

A 10.1. táblázat szerint az <a> elemek különleges feldolgozást igényelnek. A mikroadat-tulajdonság értéke a href jellemző, nem a szövegtartalom. Az egyes hivatkozások szövegét a mikroadat-feldolgozó valójában figyelmen kí­vül hagyja. A fenti kód tehát magyarul annyit tesz, hogy "Ehhez a személyhez kapcsolódik a http://diveintomark.org/ URL, valamint a http://www.google. comlpro.fileslpilgrim/ URL, valamint a http:llwww.reddit.com/user/MarkPilgrim URL, illetve a http://www.twitter.com/diveintomark URL.

Bemutatkozik a Google Rich Snippets

Egy pillanatra szeretnénk visszalépni egy kicsit, és feltenni a kérdést: "Miért is csináljuk ezt?". Csak azért adunk jelentéstükröző elemeket a kódhoz, hogy legyenek benne ilyen elemek? Nem szeretném, ha bárki félreértene: mint minden webfejlesztő, én is szeretek csúcsos zárójelekkel játszani. De miért pont mikroadarokkal? Miért fontos ez?

Két fő alkalmazástípus létezik, amely HTML-t és így HTMLS-mikro­adatokat is fogyaszt:

• a webböngészők és • a keresőmotorok.

A böngészők számára a HTMLS különféle DOM-függvényeket határoz meg a mikroadatok, tulajdonságok és tulajdonságértékek kinyerésére a webolda­lakbóL Jelen könyv írása idején azonban még egyetlen böngésző sem támo­gatja ezt az API-t. Egyetlen egy sem. Így ez egyfajta zsákutca, legalábbis amíg a böngészők fel nem zárkóznak, és meg nem valósítják az ügyféloldali API-t.

A HTML-fogyasztók másik nagy csoportját a keresőmororok jelentik. Mit tehet egy kereső egy személyhez kapcsolódó mikroadat-tulajdonságokkal? Képzeljük magunk elé ezt: a kereső ahelyett, hogy egyszerűen az oldal címét és egy részletet jelenítene meg az oldal szövegéből, beágyaz néhányat ezek közül a strukturált információk közül is: a személy reljes nevét, beosztását,

10. fejezet "Elosztott", "bővíthetőség" ... \ 243

Page 237: HTML5 - Az új Szabvány

munkálrarójár, címér, esetleg a profilforója miniarűrjér. Ez felkeltené az ér­deklődésünket? Az enyémet biztosan.

A Google a Rich Snippers programja részekém támogatja a mikroadarokar

(http:llwww.google.com/supportlwebmasterslbin/answers.py?hl=en&answer= 99170).

Amikor a Google webes keresőpókja feldolgozza az oldalunkar, és olyan mikroadar-rulajdonságokar talál, amelyek megfelelnek a h t t p: l l da ta­

vocabulary. or g /Person szórárnak, kigyűjri ezeker a tulajdonságokat, és elrakrározza azokar az oldal többi adarával együtt. A Google még egy olyan hasznos eszközt is biztosít, amely megmutatja, hogy a Google hogyan "látja"

a mikroadar-rulajdonságainkar. Ha kipróbáljuk a mikroadarokkal ellátorr minra-névjegyoldalunkon (http:lldiveintohtml5.o rglexampleslperso n-plus­microdata.htmf), ezt a kimeneter kapjuk:

It em

Type: http://data-vocabulary.org/person photo� http: l /dlvelntohtml5 .org/examples/2000 _0 5_ mark. jpg

name� Mark Pilgrim title � Developer advocate

affiliation � Google, Inc. address � Item ( l )

url� http: l /diveintomark. org/

url � http: l /www. google. com/profiles/pilgrim

url� h t tp: l /www. reddit. com/user/MarkPilgrim

url� h t tp: l /www. twitter. com/diveintemark

Item l

Type: http://data-vocabulary.org/address

street-address� 100Main Street

locality � Anytown

region �PA

postal-code � 19999 country-name �USA

Orr van minden: a photo tulajdonság az <img src> jellemzőből, mind a négy URL az <a href> jellemzők lisrájából, sőt még a címobjektum (minr

"Irem l") és annak mind az öt résztulajdonsága is. Hogyan hasznosítja a Google ezeker az információkat? Arról függ. Nin­

csenek kőbe véserr szabályok arra nézve, hogy mikénr kell megjeleníteni a mikroadat-rulajdonságokat, hogy mely tulajdonságokar kell megjeleníteni, vagy hogy egyáltalán meg kell-e jeleníteni őket. Ha valaki a "Mark Pilgrim"

nevet keresi, és a Google arra a következtetésre jut, hogy a névjegyoldalunk­nak szerepelnie kell az eredmények között, és a Google úgy dönt, hogy az

244 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 238: HTML5 - Az új Szabvány

oldalon talált mikroadat-tulajdonságokat érdemes megjeleníteni, akkor a ke­

resés eredménye valahogy úgy fog kinézni, mint a 10.1. ábrán.

About Mark Pilgrim Anytown PA- Developer advocate- Google, Inc. Excerpt from the page will show up here. Excerpt from the page will show up here. diveintohtml5.org/examples/person-plus-microdata.html - Cached - Similar pages

l O. l. ábra Példa egy mikroadatokkal kiegészített személyes oldal keresésének eredményére

Az első sor-"

About Mark Pilgrim"- igazából az oldal címe, amit a <ti tle>

elem ad meg. Ez nem túl izgalmas - a Google minden oldal címét megjele­

níti. A második sor azonban már tele van olyan információkkal, amelyek

közvetlenül az oldalhoz fűzött mikroadatokból származnak. Az "

Anytown

PA" az oldalon a levelezési cím részeként szerepelt, amelyet a h t tp: l ldata­

vocabulary. orgiAddress szótár segítségével jelöltünk meg, a "

Developer

advocate" és a "

Google, Inc." pedig a http:lldata-vocabulary.orgl

Person szótár két tulajdonsága (title és aff iliation) .

Ez az, ami igazán lenyűgöző: nem kell tekintélyes, a keresőprogramok

gyártóival egyedi szerződésben álló cégnek lennünk ahhoz, hogy testreszabjuk

a keresési eredményeket- elég rászánnunk tíz percer, és hozzáadnunk néhány

HTML-jellemzőt az egyébkém is közzérenni kívánt adarokhoz.

Kérdezzük meg Leírókód professzort!

Kérdés: Mindent úgy csináltam, ahogy itt szerepelt, a Google-ben mégis ugyanazt az eredményoldalt kaptam kereséskor, mint korábban. Mit csi­nálok rosszul? Válasz: "A Google nem garantálja az adott oldalakon vagy webhelyeken

szereplő Ieírókóclok felhasználását a keresési eredményekben" (http:/1 www.google.com/supportlwebmasterslbinlanswer.py?hl=en&answer=99170). Mindazonáltal az, hogy a Google nem használja fel az oldalunkhoz fű­

zött mikroadarokat, még nem jelenti azt, hogy más keresők sem fog­

ják. A HTML5 többi részéhez hasonlóan a mikroadatok is nyílt szab­

ványnak számítanak, amelyet bárki megvalósírhar. A mi feladatunk az,

hogy annyi adatot adjunk meg, amennyit csak tudunk - a világ pedig

eldönrheti, hogy mit kezd velük. Csak meg ne lepődjünk!

10. fejezet "Elosztott", "bővíthetőség" . . . l 245

Page 239: HTML5 - Az új Szabvány

Szervezetek felcímkézése

A mikroadatok nem korlátozódnak egyetlen szótárra. Egy "névjegyoldal"

hasznos, de valószínűleg csak eggyel rendelkezünk belőle. T öbbet szeretnénk? Tanuljuk meg, hogy címkézhetünk fel cégeket és szervezeteket!

Készítettem egy üzleti mintaoldalt (http:lldiveintohtml5.orglexampleslorga­nization.html); nézzük is meg az eredeti HTML-kódot, mikroadatok nélkül:

<article>

<hl>Google, Inc.</hl>

<p>

1600 Amphitheatre Parkway<br>

Mountain View, CA 94043<br>

USA

</p>

<p>650-253-0000</p>

<p><a href="http://www.google.com/">Google.com</a></p>

</article>

�Az itt végrehajtott változtatásokat az Interneten is nyomon kö­

vethetjük. Előtte: http://diveintohtml5.orglexamples/organization.html. U tán a: h ttp:/1 diveintoh tm/5. orglexamples/ organization-plus -microdata.

h tm l.

A kód bájosan rövid. A szervezettel kapcsolatos összes információt az <article>

elem tartalmazza, ezért kezdjük itt:

<article i temscope i temtype= "http: l /data-vocabulary. org/Organization ">

Ahogy a személyek felcímkézésénél, itt is hozzá kell adnunk az itemtype

és itemscope jellemzőket a legkülső elemhez, ami a mi esetünkben egy <article> elem. Az itemtype jellemző a használt mikroadat-szótárat (http://data-vocabulary.org/Organization) adja meg, míg az itern­

scope jellemző azt, hogy a gyermekelemekre beállított minden tulajdon­ság ebből a szótárból származik.

De mi van az Organization (Szervezet) szótárban? Nos, ez a szótár nagyon

egyszerű, sőt egy részének már ismerősnek kell lenn ie. A lényeges tulajdonsá­gokat a 10.3. táblázatban láthatjuk.

246 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 240: HTML5 - Az új Szabvány

name A szervezet neve (például.,lnitech")

url A szervezet webhelyére mutató hivatkozás

address A szervezet címe. Olyan résztulajdonságokat tartalmazhat, mint a s tr ee t-

tel

g eo

address, a loeali ty, a regio n, a postal-code és a country-name.

A szervezet telefonszáma

A cím földrajzi koordinátái. Mindig két résztulajdonságot-lati tude és

longi tude, vagyis szélességi és hosszúsági fok- tartalmaz.

A legkülső <ar ticle> elemen belül az első kódcímke egy <hl> elem. Ez a <hl> elem egy cég nevét tartalmazza, ezért közvetlen ül egy i temprop= "name"

jellemzővel látjuk el:

<hl itemprop="name">Google, Inc. </hl>

A 10.1. táblázat szerint a <hl> elemek nem igényelnek semmilyen különleges feldolgozást. A mikroadat-tulajdonság értéke egyszerűen a <hl> elem szö­vegtartalma. Ez magyarul annyit tesz, hogy az imént ennyit mondtunk:

"A szervezet neve Google, Inc." A következő elem a cím. Egy szervezet címét pontosan ugyanúgy jelölhet­

jük meg, mint egy személyér. Először egy itemprop="address" jellemzőt adunk a cím legkülső eleméhez (ami ebben az esetben egy <p> elem). Ez jelzi, hogy ez a szervezet address tulajdonsága. De mi a helyzet magának a cím­nek a tulajdonságaival? Ahhoz, hogy jelezzük, hogy ez egy olyan Address elem, amelynek saját tulajdonságai vannak, meg kell határoznunk az i tem type és item scope jellemzőket is:

<p itemprop="address" itemscope itemtype="http://data-vocabulary.org/Address">

Végül, minden információegységet egy-egy <span> áldembe kell burkolnunk, hogy hozzájuk adhassuk a megfelelő mikroadar-tulajdonságneveket (st reet­

address, lo cality, region, postal-co de és count ry-name):

<p itemprop= "address" itemscope

itemtype="http://data-vocabulary.org/Address">

<span itemprop="street-address"> 1600 Amphitheatre Parkway</ span><br>

10. fejezet ,.Elosztott", "bővíthetőség"... l 247

Page 241: HTML5 - Az új Szabvány

<span itemprop="locality" >Mountain View</span>,

<span itemprop="region">CA</span>

<span i temprop="postal-code">94 0 43</ span><br>

<span i temprop=" country-name">USA</ span>

</p>

Magyarul, az előbb ezt mondtuk: "Ennek a szervezernek van egy címe. Az utca és házszám »1600 Amphitheatre Parkway«, a helység »Mountain View«, az állam »CA«, a postai irányítószám »94043«, az országnév pedig »USA«".

Most a szervezet telefonszáma következik. A telefonszámok kezelése hír­hedten nehéz, és a telefonszámok formátuma országonként különbözik. (Ha másik országba szerernénk telefonálni, még rosszabb a helyzet.) A példánk­ban Egyesült Államokbeli telefonszám szerepel, az USA-n belüli hívásra al­kalmas alakban:

<p itemprop="tel">650-253-0000</p>

(Ha esetleg nem vettük észre, kikerültünk az Address szótár hatóköréből, amikor a <p> elemet lezártuk, és visszatértünk az Organization szótár tulaj­donságainak meghatározásához.)

Ha több telefonszámot szerernénk felsorolni - mondjuk egyet az ameri­kai, egyet pedig a más országbeli ügyfelek számára -, azt is megtehetjük. Bármelyik mikroadat-tulajdonság ismétlődhet. Csak arra kell ügyelnünk, hogy mindegyik telefonszám a saját HTML-elemében szerepeljen, a hozzájuk fűzött esetleges szövegcímkéktől függetlenül:

<p>

US customers: <span itemprop="tel">650-253-0000</ span><br>

UK customers: <span itemprop="tel">OO +l*+ 6502530000</span>

</p>

A 10.1. táblázat szerint sem a <p>, sem a <span> elem nem igényel különle­ges feldolgozást. A tel mikroadat-tulajdonság értéke egyszerűen a szövegtar­talom. Az Organization mikroadat-szótár nem tesz kísérletet arra, hogy ré­szeikre bontsa a telefonszámokat; az egész tel tulajdonság csupán szabad formátumú szöveg. Ha a körzetszámot zárójelbe szeretnénk tenni, vagy a számokar kötőjelek helyett szóközökkel választanánk el, azt is megtehetjük. Ha egy ügyfélprogram elemekre szeretné bontani a relefonszámot, ezt reljes egészében magának kell megoldania.

248 l .,Elosztott", .,bővíthetőség" ... 10. fejezet

Page 242: HTML5 - Az új Szabvány

Ismét egy ismerős tulajdonság következik: az url. Ugyanúgy, ahogy az előző részben egy személyhez társítottunk UR L-t, egy szervezethez is rendel­hetünk URL-t. Ez lehet a cég honlapjának, egy kapcsolati oldalnak, egy ter­mékoldalnak vagy bármi másnak a címe. Ha az adott URL-címen található oldal a szervezetről szól vagy a szervezethez tartozik, címkézzük fel egy itemprop="url" jellemzővel:

<p><a itemprop="url" href= "http: l /www .google. com/ ">Google .com</ a></ p>

A 10.1. táblázat szerint az <a> elem nem igényel különleges feldolgozást. A mikroadat-tulajdonság értéke a href jellemző értéke, nem pedig a hivatko­zás szövege. A fenti kód tehát ennyit tesz: "Ehhez a szervezethez a http://www. google.coml URL kapcsolódik.". A kapcsolatról ennél nem mond több konkré­tumor, és nem szerepel benne a hivatkozás szövege, vagyis a "Google.com".

Utolsóként a helymeghatározásról szeretnék szót ejteni. Nem, nem a W3C Geolocation API-járól (lásd a 6. fejezetben), hanem arról, hogy miként jelöl­hetjük meg egy szervezet földrajzi helyét mikroadatok segítségéveL

Eddig minden példában látható adatok felcímkézéséről volt szó. Az egyik esetben volt egy <hl> elemünk a cég nevével, ezért hozzáadtunk egy i temprop jellemzőt ehhez a <hl> elemhez, hogy jelezzük, hogy a (látható) címsorszöveg egy cég neve. A másik esetben egy <img> elemmel rendelkez­tünk, amely egy fényképre muratott, így hozzáadtunk egy i temprop jellem­

zőt ehhez az <img> elemhez, hogy jelezzük, hogy a (látható) kép egy sze­mélyt ábrázol.

Ebben a példában a helymeghatározási információk nem ilyenek. Nincs látható szöveg, ami megadja a szervezet helyének pontos szélességi és hosszú­sági fokát (négy tizedesjegy pontossággal!). Valójában a mikroadatok nélküli szervezeti mintaoldalunk egyáltalán nem tartalmaz helymeghatározással kap­csolatos információkat. Csupán egy hivatkozással murat a Google Maps-re, de még ennek a hivatkozásnak az URL-jében sincsenek hosszúsági és szélességi koordináták (csak hasonló adatok, a Google-nek megfelelő formátumban). De még ha lenne is egy olyan képzeletbeli internetes térképszolgáltatásra mu­tató hivatkozásunk, amely URL-paraméterekként hosszúsági és szélességi koordinátákat fogad, a mikroadatok nem adnak módot arra, hogy egy URL-t a részeire bontsunk. Nem jelenthetjük be, hogy az első URL-paraméter a hosz­szúsági, a második a szélességi fok, a maradék pedig nem érdekes.

10. fejezet "Elosztott", "bővíthetőség" ... l 249

Page 243: HTML5 - Az új Szabvány

Az ilyen szélsőséges esetek kezelése érdekében a HTML5 arra is módot ad, hogy megjelöljük a láthatatlan adatokat, ezt azonban csak végszükség esetére

tartogassuk. Ha van rá lehetőség, hogy megjelenítsük a fontosnak vélt adato­kat, tegyük is meg. Az olyan láthatatlan adatok, amelyeket csak a számítógé­pek képesek elolvasni, hajlamosak gyorsan "megpenészedni", vagyis valószínű, hogy később jön valaki, aki módosítja a látható szöveget, de megfeledkezik

a láthatatlan adatok frissítésérőL Ez gyakrabban megesik, mint gondolnánk - és velünk is biztosan meg fog.

Mindazonáltal vannak helyzetek, amikor elkerülhetetlen, hogy láthatat­lan adatokat használjunk. Megeshet például, hogy a főnökünk nagyon sze­

retné, ha egy oldalon gép által olvasható helymeghatározási információk

szerepelnének, de nem akarja áttekinthetetlen hatjegyű számpárokkal tele­

zsúfolni a felületet. Ilyenkor a láthatatlan adatok használata jelenti az egyet­len megoldást. Csak az enyhíti némileg a helyzetet, hogy a láthatatlan ada­tokat közvetlenül az után a látható szöveg után helyezhetjük el, amelyhez

kapcsolódnak, így talán emlékeztethetjük azt a személyt, aki később módo­

sítja a látható szöveget, hogy a rögtön utána következő láthatatlan adatokat is frissítenie kell.

A példánkban létrehozhatunk egy <span> áldemet ugyanazon az <article>

elemen belül, amelyben az összes többi szervezeti tulajdonság is található, majd

a láthatatlan helymeghatározási adatokat ebbe a <span> elembe tehetjük:

<span itemprop="geo" itemscope

itemtype="http://data-vocabulary.org/Geo">

<meta itemprop= "latitude" content= "37. 414 9"/>

<me ta i temprop= "longitude" content= "-122. 07 8" l>

</span>

</article>

A helymeghatározási információkhoz is saját szótár tartozik, ugyanúgy, mint egy személy vagy szervezet címéhez. Az említett <span> elemnek tehát há­

rom jellemzőre van szüksége: i temprop= "ge o"

Ez a jellemző azt mondja, hogy az elem a kapcsolódó szervezet ge o tulaj­donságát jelképezi.

i tem type="http://data-vocabulary.org/Geo"

Ez a jellemző azt adja meg, hogy az elem tulajdonságai melyik mikroadat­szótárnak felelnek meg.

250 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 244: HTML5 - Az új Szabvány

itemscope

Ez a jellemző azt mondja, hogy az elem egy saját (az itemtype jellemző­

ben megadott) szótárral rendelkező mikroadat-elem befoglaló eleme. Az eb­ben az elemben található összes tulajdonság a Geo szótár (http://data­

vocabulary.org/Geo) tulajdonsága, nem a kapcsolódó szervezeti szótáré (http: l /data-vocabulary .org/Organization).

A következő nagy kérdés, amelyre ez a példát választ ad, hogy "Miként cím­

kézhetjük fel a láthatatlan adatokat?". Nos, ezt a <meta> elemmel tehetjük

meg. A HTML korábbi változataiban a <me ta> elemet csak az oldal <he ad>

részében használhattuk ( lásd a 3. fejezet "A <head> elem" című részét),

a HTML5-ben azonban a <meta> elemet bárhol alkalmazhatjuk. Pontosan így teszünk itt is:

<meta itemprop= "latitude" content= "37. 414 9"/>

A 10.1. táblázat szerint a <meta> elem különleges feldolgozást igényel.

A mikroadat-tulajdonság értéke a content jellemző. Mivel ez a jellemző

soha nem jelenik meg, tökéletesen alkalmas korlátlan mennyiségű láthatatlan adat tárolására. A nagy hatalom nagy felelősséggel jár. Ez esetben a miénk a felelősség, hogy gondoskodjunk róla, hogy ezek a láthatatlan adatok össz­hangban maradjanak az őket körülvevő látható szöveggel.

Az Organization szótárat a Google Rich Snippets nem támogatja közvet­

lenül, így nem tudok semmilyen tetszetős mintát mutatni a keresési eredmé­nyekre. Mindazonáltal a szervezetek nagy szerepet kapnak a következő két

-az eseményekkel és a kritikákkal kapcsolatos- esettanulmányban, és ezeket a Google Rich Snippets már támogatja.

Események felcímkézése

Mindig történik valami. Egyes dolgok pedig előre meghatározott időpon­

tokban történnek. Nem lenne klassz, ha pontosan megmondharnánk a kere­

sőknek, hogy egy adott dologra mikor kerül sor? Nos, van erre egy csúcsos zárójel.

Induljunk ki egy minta-ütemtervből, amely az én előadásaimat sorolja fel

(http:!ldiveintohtml5.orglexamples/event.htmf):

10. fejezet "Elosztott", "bővíthetőség" . . . l 251

Page 245: HTML5 - Az új Szabvány

<article>

<hl>Google Developer Da y 2009</hl>

<img wid th= "300" height= "200"

src="http://diveintohtmlS.org/examples/gdd-2009-prague-pilgrim.jpg"

alt=" [Mark Pilgrim at podium] ">

<p>

Google Developer Days are a chance to learn about Google

developer products from the engineers who built them. This

one-da y conference incluctes seminars and "office hours"

on web technologies like Google Maps, OpenSocial, Android,

AJAXAPis, Chrome, and GoogleWeb Toolkit.

</p>

<p>

<time datetime= "2009-ll-06T08: 30+01: 00 ">2009 November 6, 8: 30</time>

&ndash;

<time datetime= "2009-ll-06T20: 30+01: 00 ">20: 30</time>

</p>

<p>

Congress Center<br>

5th kvetna 65<br>

140 21 Praha 4<br>

Czech Republic

</p>

<p><a href="http://code.google.com/intl/cs/events/developerday/2009/

home. html ">GDD/Prague home page</ a></p>

</article>

�Az itt végrehajtott változtatásokat az Interneten is nyomon kö­

vethetjük. Előtte: http:l!diveintohtml5.orglexampleslevent.html. Utána: http:lldiveintohtml5. orglexamples/event-plus-microdata. h tm l.

Az eseménnyel kapcsolatos minden információt az <article> elem tartal­maz, ezért oda kell tennünk az i temtype és itemscope jellemzőket:

<article i temscope i temtype="http: l l data-vocabulary. org/Event">

Az Event (Esemény) szótár URL-je a http:/ /data-vocabulary.org/

Event, és ezen a címen történetesen egy csinos kis táblázat is található a szótár tulajdonságairól. Hogy mik ezek a tulajdonságok? Tekintsük meg a

10.4. táblázatban!

252 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 246: HTML5 - Az új Szabvány

surrunary

url

location

Az esemény címe

Az esemény részleteit tartalmazó oldalra mutató hivatkozás

Az esemény színhelye. Egy beágyazott Szervezet (lásd a fejezet.,Szervezetek felcímkézése"

cím ü részét) vagy Cím (lásd a fejezet.Személyek felcímkézése" cím ü részét) is jelöl heti.

description Az esemény leírása

startDate Az esemény kezdetének dátuma és ideje ISO-dátumformátumban

end Da te Az esemény végének dátuma és ideje ISO-dátumformátumban

duratien Az esemény időtartama ISO-dátumformátumban

eventType Az esemény besorolása (például.,koncert" vagy .,előadás"). Nem felsorolt jellemző, tehát

tetszőleges karakterlánc lehet.

g eo A helyszín földrajzi koordinátái. Mindig két résztulajdonságot -la ti tu de és

long i tu de, vagyis szélességi és hosszúsági fok- tartalmaz.

fl. hO tO Az eseményhez kapcsolódó fotóra vagy más képre mutató hivatkozás.

Az esemény címe egy <hl> elemben található. A 10.1. táblázat szerint a <hl>

elemek nem igényelnek semmilyen különleges feldolgozást. A mikroadat­tulajdonság értéke egyszerűen a <hl> elem szövegtartalma. Tehát csak any­nyit kell tennünk, hogy hozzáadjuk az itemprop jellemzőt, hogy bejelent­sük, hogy ez a <hl> elem tartalmazza az esemény címét:

<hl i�rop="slll!lllarY">Google Developer Day 2009</hl>

Ez magyarul annyit tesz, hogy "Az esemény címe »Google Developer Day 200 9«."

Ehhez az eseményhez tartozik egy fénykép is, amelyet a photo tulajdon­sággal jelölhetünk meg. Ahogy azonban azt várhatjuk, a fotónak már van egy címkéje: egy <img> elem. A Person szótár (lásd a fejezet korábbi, "A mikro­adatok adatmodellje

" című részét) photo tulajdonságához hasonlóan az Event

szótár photo tulajdonsága is egy URL. Mivel a 10.1. táblázat azt mondja, hogy egy <img> elem tulajdonságértéke az elem src jellemzője, csak annyit kell tennünk, hogy hozzáadjuk az itemprop jellemzőt az <img> elemhez:

<img itemprop= "photo" wid th= "300 • height= "200"

src="http://diveintohtmlS.org/examples/gdd-2009-prague-pilgrim.jpg"

alt=" [Mark Pilgrim at podium] ">

10. fejezet "Elosztott", "bővíthetőség"... l 253

Page 247: HTML5 - Az új Szabvány

Ez magyarul annyit tesz, hogy "Az ehhez az eseményhez tartozó fénykép a http:/1 diveintohtm/5. orglexamples/gdd-2009-prague-pilgrimjpg címen található".

Ezt egy hosszabb leírás (description) követi az eseményről, ami csupán egy bekezdésnyi tetszőleges szöveg:

<p itemprop= "description ">Google Developer Days are a chance to

learn about Google developer products from the engineers who buil t

them. This one-day conference incluctes seminars and "office

hours" on web technologies like Google Maps, OpenSocial,

Android, AJAX AP Is, Chrome, and Google Web Toolkit. </p>

A következő elem valami új. Az eseményekre általában konkrét napokon kerül sor, és adott időben kezdődnek, illetve végződnek. A HTML5-ben azonban a dátumokat és időpontokar a <time> elemmel kell megjelölni

(lásd a 3. fejezet "Dátumok és időpontok" című részét), és ezt már meg is tettük itt. A kérdés tehát az, hogy miként adhatunk mikroadat-tulajdonságokat ezekhez a <time> elemekhez? Ha visszalapozunk a 10.1. táblázathoz, láthat­juk, hogy a <time> elem különleges feldolgozást igényel. Egy <time> elem mikroadat-tulajdonságainak értéke a datetime jellemző értéke. Az Event szótár startDate és endDate tulajdonságai ráadásul ugyanúgy ISO for­mátumú dátumot várnak, mint egy <time> elem datetime tulajdonsága. A HTML alapszótára tehát itt is szépen illeszkedik az egyéni mikroadat­

szótárunk elemeinek jelentéséhez. A kezdő- és záródárumok mikroadatokkal történő felcímkézése ilyen egyszerű:

l. Először is, használjuk helyesen a HTML-t (a dátumokat és időpontokat címkézzük fel <time> elemekkel).

2. Adjunk a kódhoz egyetlen i temprop jellemzőt:

<p>

<time itemprop="startDate" date time= "2009-ll-06T08: 30+01: 00 ">200 9

November 6, 8: 30</ time>

&ndash;

<time itemprop="endDate" date time= "2009-ll-06T20: 30+01: 00 ">20: 30</

time>

</p>

Ez magyarul annyit tesz, hogy "Ez az esemény 2009. november 6-án, reggel 8:30-kor kezdődik, és 2009. november 6-án 20:30-ig tart (prágai idő, tehát GMT+l szerint).".

254 J "Elosztott", "bővíthetőség" ... 10. fejezet

Page 248: HTML5 - Az új Szabvány

Következzen a location tulajdonság. Az Event szótár meghatározása azt

mondja, hogy a helyszín egy szervezet és egy cím is lehet. Ebben az esetben az eseményt egy konferenciateremben tartják, a prágai Kongresszusi Köz­pontban. Ha a helyszínt egy szervezettel (Organization) címkézzük fel, nem csak a helyszín címét, hanem a nevét is megadhatjuk.

Először is, jelentsük be, hogy a címet tartalmazó <p> elem az esemény location tulajdonsága, és hogy ez az elem egyben önmaga is egy mikroadat­

elem, amely a http://data-vocabulary.org/Organization szótár­nak felel meg:

<p itemprop="location" itemscope

itemtype="http://data-vocabulary.org/Organization">

Ez urán címkézzük fel a szervezet nevét, a nevet egy <span> áldembe bur­kolva, majd egy i temprop jellemzőt adva a <span> elemhez:

<span i temprop="name">Congress Center</ span><br>

A "name" az Organization, és nem az Event szótár egy tulajdonságát hatá­rozza meg. A <p> elemet ugyanis, amellyel megjelöltük a szervezeti tulajdon­ságok hatókörének elejét, még nem zártuk le egy </p> címkével. Minden mikroadat-tulajdonság, amit itt meghatározunk, az utoljára megnyitott ható­körű szótár tulajdonsága. Az egymásba ágyazott szótárak olyanok, mint egy

verem. A verem tetejéről még nem emeltük le a később berakott elemet, tehát még mindig a szervezet tulajdonságairól beszélünk.

Sőt, egy harmadik szótárat is a veremre fogunk helyezni: az esemény (Event) helyszínét biztosító szervezet (Organization) címét (Address):

<span itemprop="acldress" itemscope

itemtype="http://data-vocabulary.org/Address">

A cím egyes részeit ezúttal is önálló mikroadat-tulajdonságként szetetnénk megjelölni, ezért szükségünk lesz néhány <span> álelemre, amelyekre felag­gathatjuk az i temprop jellemzőinket. (Ha túl gyorsan haladnék, lapozzunk vissza, és olvassuk el még egyszer a fejezet "Személyek felcímkézése", illetve

"Szervezetek felcímkézése" című részeit.) <span itemprop="street-acldress">Sth kvetna 65</span><br> <span itemprop="postal-code">l40 21</span> <span itemprop="locality">Praha 4</span><br> <span i temprop=" country-name">Czech Republic</ span>

10. fejezet "Elosztott", "bővíthetőség"... l 255

Page 249: HTML5 - Az új Szabvány

A címnek nincs több tulajdonsága, ezért bezárjuk az Address szótár hatókörét megnyitó <span> elemet, és ezzel leemeljük a legfelső elemet a veremről:

</span>

A szervezernek sincs több tulajdonsága, tehát az Organization szótár ha­tókörét megnyitó <p> elemet is bezárjuk, és ismét leemeljük a legfelső elemet a veremről:

</p>

Ezzel visszatértünk az esemény tulajdonságainak meghatározásához. A kö­vetkező tulajdonság a geo, amely az esemény fizikai helyszínét jelképezi. Ez a tulajdonság ugyanazt a Geo szótárat használja, mint amelyet az előző részben egy szervezet foldrajzi helyének megjelölésére alkalmaztunk. Tárolóként szük­ségünk van egy <span> elemre; ebbe tesszük az i temtype és itemscope

jellemzőket. Ezen a <span> elemen belül két <meta> elemet kell megadnunk -egyet a latitude, és egyet a longitude tulajdonság számára:

<span itemprop="geo" itemscope itemtype="http: //data-vocabulary .org/Geo">

<me ta itemprop="latitude" content= "50. 047893" />

<meta itemprop="longitude" content= "14. 4 491"/>

</span>

Mivel a Geo tulajdonságokat tartalmazó <span> elemet lezártuk, ismét az esemény tulajdonságait határozzuk meg. Az utolsó tulajdonság az url, amely­

nek már ismerősnek kell lennie. Egy eseményhez ugyanúgy társíthatunk egy URL-t, mint egy személyhez (lásd a "Személyek felcímkézése" részt) vagy egy szervezethez (lásd a "Szervezetek felcímkézése" részt). Ha a HTML-t he­

lyesen használjuk (a hiperhivatkozásokat <a href> címkékkel jelöljük meg), egy hiperhivatkozásról bejelenteni, hogy url mikroadat-tulajdonság, csupán annyiból áll, hogy hozzáadjuk az i temprop jellemzőt:

<p>

<a itemprop="url"

href='http://code.goog1e.com/intl/cs/events/developerday/2009/home.html">

GDD/Prague home page

</a>

</p>

</article>

Az esemény-mimaoldalunk (http:lldiveintohtmf5.orglexampleslevent.htmf) egy második eseményt is felsorol: a montreali ConFoo konferencián tartandó előadásomaL A rövidség kedvéért ennek a kódján nem megyek végig sorról sorra. Lényegében úgyis megegyezik a prágai eseményével: egy Event elem

256 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 250: HTML5 - Az új Szabvány

beágyazott G eo és Address elem ekkel. Csak azért ernlitern meg futólag, hogy emlékeztessek rá, hogy egy oldalon több esemény is lehet, amelyek mindegyi­két felcímkézhetjük mikroadatokkal.

A Google Rich Snippets visszatér

A Google Rich Snippets Testing Tool nevű tesztelőeszköze szerint a Google keresőpókjai az alábbi információkat nyerik ki az esemény-mintaoldalunkból (http:!/diveintohtm/5. orglexampleslevent-plus -microdata. h tm l):

I tem

Type: http://data-vocabulary.org/Event

summary = Google Developer Da y 200 9

eventType = conference

photo= h t tp: l /diveintohtmlS. org/examples/gdd-2009-prague-pilgrim. jpg

description= Google Developer Days a re a chance to learn about Google

developer products from the engineers who built them. This

one-da y conference incluctes seminars and office hours on web

technologies li ke Goo ...

startDate = 2009-11-06T08: 30+01: 00

endDate = 2009-11-06T20: 30+01: 00

location = Item(_l)

geo = Item(_3)

url= http: l /code .google. com/intl/cs/events/developerday/2009/home. html

I tem

Id: l

Type: http://data-vocabulary.org/Organization

name= Congress Center

address = Item (_2)

I tem

Id: 2

Type: http://data-vocabulary.org/Address

street-address= Sth kvetna 65

postal-code = 140 21

locality = Praha 4

country-name =Czech Republic

It em

Id: 3

Type: http://data-vocabulary.org/Geo

latitude =50. 04 789 3

longitude = 14.4 491

10. fejezet ,.Elosztott", ,.bővíthetőség" ... l 257

Page 251: HTML5 - Az új Szabvány

Amint láthatjuk, itt van minden információ, amit mikroadatokkal adtunk meg. Azok a tulajdonságok, amelyek önálló mikroadat-elemek, belső azono­sítókat kaptak- Item( _ 1), Item( _2 ) stb.-, de ez nem része a mikroadatok

szabványának, csupán a Google resztelőeszközének egyezményes módszere, amellyel lineárissá teszi a kimenetet, és megmutatja a beágyazott elemek és

azok tulajdonságai csoportosítását. Hogyan jelenítheti meg a Google a mintaoldalunkar a keresési eredmé­

nyek között? (Megint csak hangsúlyoznom kell, hogy ez csupán egy példa- a Google bármikor megváltoztathatja a ralálati oldalak formátumát, és semmi

sem garantálja, hogy figyelembe veszik a mikroadat-értékeket.) Az eredmény valahogy úgy festhet, mint a 10.2. ábrán.

Mark Pilgdm's event calendar Excerpt from the page will show up here. Excerpt from the page will show up here. Google Deyeloper Pay 2009 Fd, Nov 6 Congress Center. Praha 4, Czech Republic

ConFoo.ca 2010 Wed, Mar 10 Hilton Montreal Bonaventura, Montréal, Québec, Canada diveintohtrn15.org/examples/event-plus-microdata.htrnl - Cached - Similar pages

1 0.2. ábra Példa egy mikroadatokkal kiegészített eseményoldal keresésének eredményére

Az oldal címe és az automatikusan előállított szövegkivonat után a Google az oldalhoz adott mikroadatok felhasználásával egy kis táblázatot jelenít meg az eseményekről. Figyeljük meg a dátum formátumát: "Fri, Nov 6". Ez nem egy

olyan karakterlánc, amely bárhol is szerepelt volna a HTML- vagy mikroadat­kódunkban. Mi két teljesen minősített, ISO formátumú karakterláncot -

2009-11-06T08:30+01:00 és 2009-11-06T20:30+01:00- használtunk

A Google fogta ezt a két dátumot, rájött, hogy ugyanarra a napra esnek, és

úgy döntött, hogy egyetlen dátumot jelenít meg, barátságosabb alakban.

Most nézzük meg a földrajzi címeket. A Google csak a színhely nevét, a helységet és az országot jelenítette meg, az utcát és a házszámot nem. Ezt az

tette lehetövé, hogy a címer öt résztulajdonságra- name, street-address,

region, locality és country-name - bonrottuk, és mindegyik részr

külön mikroadat-tulajdonsággal jelöltük meg. A Google ezt kihasználva jele­

nít meg rövidített címet. Ugyanezt a mikroadatkódot más "fogyasztók" más­képp is feldolgozhatják, és más elemek megjelenítése vagy más formázás mel­

lert dönthetnek. Nincs helyes és helytelen módszer: a mi feladatunk az, hogy

annyi adatot adjunk meg, amennyit csak tudunk, és olyan pontosan, ameny­nyire csak tudjuk. A világ majd eldönti, hogy mit kezd velük.

258 J "Elosztott", "bővíthetőség" ... 10. fejezet

Page 252: HTML5 - Az új Szabvány

Kritikák felcímkézése

Az üzlet- és termékismertetők újabb példát szolgáltatnak arra, hogy miként tehetjük jobbá a Világhálót (és a keresők találari oldalait) a leírókádon keresz­tül. Az alábbiakban egy rövid kritika látható, amelyet a lakhelyem közelében található kedvenc pizzázómról írtam. (Mellesleg egy létező étteremről van szó. Ha bármikor az észak-karolinai Apexben járunk, érdemes betérni.) Néz­zük meg az eredeti kódot (http:lldiveintohtml5.orglexampleslreview.html):

<article> <hl>Anna' s Pizzeria</hl>

<p>***** (4 csillag 5-ből) </p> <p>New York-i stílusú pizza itt, Apex történelmi belvárosában</p> <p>

Az étel elsőrangú, a hangulat pedig éppen olyan, rnint a "sarki családi pizzázóban ". Maga az étterem vállban kissé szük; ha túlsúlyosak vagyunk, nehézséget okozhat leülni vagy felállni a székből, illetve lavírozni az asztalok között. Régebben ajándék fokhagymás batyuval kedveskedtek az újonnan betérőknek; rnost már csak sima kenyeret adnak, a finomságokért fizetni kell. De rnindent egybevéve szuper hely.

</p> <p>

100 North Salern Street<br> Apex, NC 27502<br> USA

</p> <p>- írta: Mark Pilgrim, utolsó frissítés: 2010. március 31. </p>

</article>

i''IAz itt végrehajtott változtatásokat az Interneten is nyomon kö­vethetjük. Előtte: http:l/diveintohtm/5. orglexampleslreview.html. Utána: http:l/diveintohtm/5. orglexampleslreview-plus-microdata. h trni.

Az ismertetőt egy <article> elem tartalmazza, ezért ide kell tennünk az i tem t y pe és i t ems c ope jellemzőket. Íme ennek a szótárnak a névrerét megadó URL:

<article i temscope i temtype="http: l /data-vocabulary. org/Review">

Milyen tulajdonságok állnak rendelkezésre a Review (Kritika/Ismertető) szó­tárban? Örülök a kérdésnek- tessék megnézni a 10.5. táblázatot.

10. fejezet "Elosztott", "bővíthetőség"... l 259

Page 253: HTML5 - Az új Szabvány

1 0.5. táblázat A kritikák szótára

itemreviewed A kritika tárgyának megnevezése. A kritika tárgya lehet egy termék, egy

szolgáltatás, egy üzleti vállalkozás stb.

rating A kritika tárgyának számszerü minősítése egy l-től 5-ig terjedő skálán. Beágyazott,

a http: l /data-vocabulary. erg/Rating címen található szótárat használó

értékelés is lehet, ha nem szabványos skálát szerelnénk használni.

reviewer

dtreviewed

summary

description

A krítika szerzőjének neve

A kritikai vizsgálat dátuma ISO-dátumformátumban

A kritika rövid összegzése

A kritika szövegtörzse

Az első tulajdonság egyszerű: az itemreviewed csupán egy szöveg, amelyet itt egy <hl> elem tartalmaz, ezért az i temprop jellemzőt itt kell elhelyeznünk

<hl itemprop="itemreviewed">Anna' s Pizzeria</hl>

Magát az értékelést most átugrom; majd a végén visszatérek rá.

A következő két tulajdonság szintén önmagáért beszél. A summary tulajdon­ság a kritika tárgyának rövid leírása, a description tulajdonság pedig a kritika szövegtörzse:

<p itemprop="sl.llllllélry">New York-i stílusú pizza itt, Apex történelmi belvá­

rosában</p>

<p itemprop="clescription">

Az étel elsőrangú, a hangulat pedig éppen olyan, mint a "sarki családi

pizzázóban ". Maga az étterem vállban kissé szük; ha túlsúlyosak

vagyunk, nehézséget okozhat leülni vagy felállni a székből,

illetve lavírozni az asztalok között. Régebben ajándék fokhagymás

batyuval kedveskedtek az újonnan betérőknek; most már csak sima

kenyeret adnak, a finomságokért fizetni kell. De mindent egybevéve

szuper hely.

</p>

A location és geo tulajdonságokkal már találkoztunk korábban (lapoz­zunk vissza a személyek, szervezetek, illetve helymeghatározási információk felcímkézéséről szóló korábbi részekhez):

<p itemprop="location" itemscope

itemtype="http://data-vocabulary.org/Address">

<span itemprop="street-address">lOO North Salem Street</span><br>

<span i temprop="locali ty">Apex</ span>,

<span i temprop="region">NC</ span>

260 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 254: HTML5 - Az új Szabvány

<span itemprop="postal-code">27502</span><br> <span i temprop=" country-name">USA</ span>

</p> <span itemprop="geo" itemscope

itemtype="http://data-vocabulary.org/Geo">

<me ta itemprop="latitude" content� '35. 730796' /> <meta itemprop="longitude" content�"-78.851426" />

</span>

Az utolsó sorban egy ismerős problémát találunk: két információ szerepel egyetlen elemben. A kritika szerzőjének neve Mark Pilgrim, a kritika szü­letésének dátuma pedig 2010. március 31. Hogyan címkézzük fel ezt

a két önálló tulajdonságot? Szokás szerint saját elemekbe csomagoljuk őket ( lásd a fejezet "Személyek felcímkézése" című részét), és mindkét elemet el­látjuk egy-egy i temprop jellemzőveL A példában szereplő dátumot egyéb­ként már eleve egy <time> elemmel kellett volna megjelölni, ami természe­tes "akasztó" lenne, amire felakaszthatjuk az itemprop jellemzőt. A szerző nevét egyszerűen egy <span> áldembe burkoljuk:

<p> <span itemprop="reviewer">Mark Pilgrim</ span>, utolsó frissítés: <time itemprop="dtreviewed" datetime="2010-03-31">

2010. március 31. </time>

</p> </article>

Rendben, akkor beszéljünk az értékelésrőL Egy kritika vagy ismertető felcím­kézésének legnehezebb része mindig az értékelés. A Review szótár osztályza­

tai alapértelmezés szerint l-től 5-ig terjednek, ahol az l a "szörnyű", az 5

pedig a " fantasztikus". Ha más skálát szeretnénk használni, természetesen megtehetjük. Először azonban vizsgáljuk meg az alapértelmezett skálát:

<p>***** ( <span itemprop� "rating ">4</ span> csillag 5-ből) </p>

Ha az l-től 5-ig terjedő alapértelmezett skálát használjuk, az egyeden tulaj­

donság, amelyet fel kell címkéznünk, maga az értékelés (tehát esetünkben a 4-es osztályzat). De mi a helyzet akkor, ha más skálát szeretnénk használni?

Ezt is megtehetjük, csak meg kell adnunk a választott skála határait. Például ha egy O-tól 10-ig terjedő skálát akarunk alkalmazni, ugyanúgy be kell ve­

zetnünk az i temprop= "rating" tulajdonságot, az osztályzat közvetlen megadása helyett azonban egy beágyazott, a http://data-vocabulary.

10. fejezet "Elosztott", "bővíthetőség" ... l 261

Page 255: HTML5 - Az új Szabvány

orgiRating szótáron alapuló értékelést használhatunk az egyéni skála leg­rosszabb (worst) és legjobb (best) osztályzatainak, illetve azon belül a tényle­ges értékelésnek a meghatározására:

<p itemprop= "rating" itemscope itemtype="http://data-vocabulary.org/Rating">

*********

(<span itemprop= "value ">9</span> egy <span i temprop= "wo r st ">0</ span>-tól

<span itemprop= "be st ">10</span>-ig terjedő skálán) </p>

Ez magyarul annyit tesz, hogy "Az értékelt termék egy O-tól 10-ig terjedő skálán 9-es osztályzatot ért el."

Említettem, hogy a kritikákhoz tartozó mikroadatok hatással lehetnek a keresők találari oldalaira? Úgy bizony! Íme a "nyers adatok", amelyeket a Google Rich Snippets eszköze kinyert a mikroadatokkal kiegészített kriti­kámból (http:llwww.google.com/webmastersltoolslrichsnippets?url=lldiveinto­html5. orglexampleslreview-plus-microdata. h tm!}:

I tem

Type: http://data-vocabulary.org/Review

itemreviewed =Anna' s Pizzeria

rating= 4

summary =New York-style pizza right in histor ic downtown Apex

description = Food is top-notch. Atmasphere is just right ...

address= Item( l)

geo = Item (_2)

reviewer =Mark Pilgrim

dtreviewed = 2010-03-31

I tem

Id: l

Type: http://data-vocabulary.org/Organization

street-address = 100 North Salem Street

locality = Apex

region = NC

postal-code = 27502

country-name =USA

I tem

Id: 2

Type: http://data-vocabulary.org/Geo

latitude =35. 730796

longitude =-78. 851426

262 l "Elosztott", "bővíthetőség" ... 10. fejezet

Page 256: HTML5 - Az új Szabvány

A 10.3. ábrán láthatjuk, hogy mikénr festene a kritikám egy kereső találari oldalán (a Google szeszélyeitől, a holdfázistól és egyebektől eltekintve).

Anna's Pizzeria: review *****Review by Mark Pilgrim- Mar 31, 2010 Excerpt from the page will show up here. Excerpt from the page will show up here. diveintohtml5.org/examples/review-plus-microdata.html - Cached - Similar pages

l 0.3. ábra Példa egy mikroadatokkal kiegészített kritikai oldal keresésének eredményére

A csúcsos zárójelek engem általában hidegen hagynak, de el kell ismernem, hogy ez elég klassz.

További olvasmányok

A mikroadatokkal kapcsolatos források:

• Live microdata játszótér (http:llfoolip.orglmicrodatajsllivel) • A HTMLS-mikroadatok szabványleírása (http:llbit.lylckt9Rj)

Google Rich Snippets-források: • "About rich snippets and structured data" (http://www.google.com/

supportlwebmasterslbin/answer.py?hl=en&answer=99170) • "People" (http:llwww.google.com/supportlwebmasterslbin/answer.py?hl=

en&answer=l46646) • "Businesses & organizations" (http:llwww.google.com/supportlwebmastersl

binlanswer.py?hl=en&answer=146861) • "Evenrs" (http://www.google. comlsupportlwebmasterslbinlanswer.

py?hl=en&answer=164506) • "Reviews" (http:llwww.google.com/supportlwebmasterslbinlanswer.

py?hl=en&answer=146645) • "Review ratings" (http://www.google. com/supportlwebmasterslbin/answer.

py?hl=en&answer=172705) • Google Rich Snippets tesztelőeszköz (http://www.google.com/webmastersl

tools/richsnippets) • Google Rich Snippets tippek és trükkök (http:llknol.google.comlklgoogle­

rich-snippets-tips-and-tricks)

Page 257: HTML5 - Az új Szabvány

Függelék

A "mindent egyben tartalmazó és majdnem ábécésorrendbe rendezett" útmutató,

amelyet követve bármit észlelhetünk

Összezavarodtunk? Bevezetésként olvassuk el a 2. fejezetet. Vagy inkább egy mindent egyben tartalmazó programkönyvtárra lenne szükségünk? Próbál­juk ki a Modernizr-t (http://www.modernizr.com)!

Az elemek listája

<audio> http:J /bit.ly/cZxl7k

return! !document.createElement('audio') .canPlayType;

<audio> MP3 formátumban http:/ /en.wiki pedia.org/wiki/MP3

var a= document. createElement ('audio' ) ;

return ! ! (a. canPlayType && a. canPlayType (' audio/mpeg;') . replace (/no/,

� "));

<audio> Verbis formátumban http://en.wikipedia.org/wikiNorbis

var a= document. createElement ('audio') ;

return ! ! (a. canPlayType && a. canPlayType (' audio/ogg; codecs= "vorbis "') . � replace(/no/, ''));

<audio> WAV formátumban http://en.wikipedia.org/wiki/WAV

var a= document. createElement ('audio' ) ;

return ! ! (a. canPlayType && a. canPlayType (' audio/wav; code cs= "l"') .

� replace(/no/, ''));

<a u d i o> AAC formátum ba n http:/ /en.wikipedia.org/wiki/ Advanced_Audio_Coding

var a= document. createElement ('audio') ;

return ! ! (a. canPlayType && a. canPlayType (' audio/mp4; codecs= "mp4a. 40.2 "') . � replace(/no/, ''));

Függelék l 265

Page 258: HTML5 - Az új Szabvány

<canvas> Lásd a 4. fejezetben

return! !document.createElement('canvas') .getContext;

<canvas> text API Lásd a"Szöveg" cím ű részt a 4. fejezetben

var c; document. createElement (' canvas');

return c. getContext && typeof c. getContext ('2 d' ) . fill Text= 'function' ;

<command> http://bit.ly/aQt2Fn

return 'type' in document. createElement ('command' ) ;

<datalist> http://bit.ly/9WVzSp

return 'options' in document. createElement (' datalist');

<details> http:/ /bit.ly/c08mQy

return 'open' in document. createElement (' details');

<device> http://bit.ly/aaBeUy

return ' type' in document. createElement ('device' ) ;

<form> megszorítás-ellenőrzés http:/ /bit.ly/cb9Wmj

return 'noValidate' in document .createElement ('form');

<iframe sandbox> http://blog.whatwg.org /whats-next-in-html-episode-2-sandbox

return 'sandbox' in document. createElement ('i frame');

<iframe srcdoc> http://blog.whatwg.org/whats-next-in-html-episode-2-sandbox

return 'srcdoc' in document. createElement ('i frame');

<input autofocus> Lásd az"Automatikus fókuszálásó mezők" cím ű részt a 9. fejezetben

return 'autofocus' in document. createElement ('input');

<input placeholder> Lásd a" Helyőrző szöveg" cím ű részt a 9. fejezetben

return 'placeholder' in document. createElement ('input' ) ;

<jn put type="color"> http:/ /bit.ly/9H keN n

var i; document. createElement ('input');

266 J Függelék

Page 259: HTML5 - Az új Szabvány

i.setAttribute('type', 'color');

return i. type ! =='text';

<input type="email"> Lásd az.E-mail címek" cím ú részt a 9. fejezetben

var i= document. createElement ('input');

i.setAttribute('type', 'email');

return i. type ! == 'text' ;

<input type="number"> Lásd a,.Számok léptetőmezőkben"címú részt a 9. fejezetben

var i = document. createElement ('input') ;

i.setAttribute('type', 'number');

return i. type ! == ' text' ;

<input type="range"> Lásd a .Számok csúszkákon" cím ú részt a 9. fejezetben

var i= document. createElement ('input');

i.setAttribute('type', 'range');

return i. type ! =='text';

<input type="search"> Lásd a ,.Keresőmezők" cím ű részt a 9. fejezetben

var i = document. createElement ('input' ) ;

i.setAttribute('type', 'search');

return i. type ! =='text';

<input type="tel">

var i = document. createElement ('input' ) ;

i.setAttribute('type', 'tel');

return i. type 1 == 'text' ;

http://bit.ly/bZmOQS

<input type=" url"> Lásd a ,.Webcímek" cím ű részt a 9. fejezetben

var i= document. createElement ('input');

i.setAttribute('type', 'url');

return i. type 1 == 'text' ;

<input type="date"> Lásd a ,.Dátumválasztók" cím ú részt a 9. fejezetben

var i = document. createElement ('input');

i. setAttribute ('type', 'date');

return i. type ! =='text';

<input type="time"> Lásd a,.Dátumválasztók" cím ú részt a 9. fejezetben

var i = document. createElement ('input');

i. setAttribute ('type' , 'time' ) ;

return i. type !=='text';

<input type="datetime"> Lásd a.Dátumválasztók" címú részt a 9. fejezetben

var i = document. createElement ('input' ) ;

Függelék l 267

Page 260: HTML5 - Az új Szabvány

i.setAttribute('type', 'datetime');

return i. type !=='text';

<input type="datetime-local"> Lásd a .,Dátumválasztók" cím ű részt a 9. fejezetben

var i = document. createElement ('input' ) ;

i.setAttribute('type', 'datetime-local);

return i. type 1 =='text';

<input type="month"> Lásd a.Dátumválasztók" cím ű részt a 9. fejezetben

var i= document. createElement ('input' ) ;

i. setAttribute ('type', 'month');

return i. type ! = 'text' ;

<input type="week"> Lásd a.,Dátumválasztók" cím ű részt a 9. fejezetben

var i = document. createElement ('input');

i. setAttribute ('type' , 'week') ;

return i. type ! == 'text' ;

<meter>

return 'value' in document. createElement ('me ter' ) ;

<output>

return 'value' in document .createElement ('output');

<progress>

return 'value' in document. createElement (' progre ss') ;

<time>

return 'valueAsDate' in document. createElement ('time');

<video>

return! !document.createElement('video') .canPlayType;

<video> feliratok

return 'sr c' in document. createElement ('track');

<video poster>

return 'pos ter' in document. createElement ('v ideo' ) ;

268 l Függelék

http:/ /bit.ly/cOpXOI

http://bit.ly/asJaqH

http:/ /bit.ly/bjDMy6

http:/ /bit.ly/bl62jp

Lásd az 5. fejezetben

http://bit.ly/9mliRr

http://bit.ly/b6RhzT

Page 261: HTML5 - Az új Szabvány

<video> WebM formátumban http://www.webmproject.org/

var v= document. createElement ('v ideo' ) ;

return ! ! (v. canPlayType && v. canPlayType (' video/webm; code cs= "vp8,

� varbis "' ) . replace (/no/, '' ) ) ;

<video> H.264 formátumban Lásd a .H.264" cin ű részt az 5. fejezetben

var v= document. createElement ('v ideo' ) ;

return 1 1 (v. canPlayType && v. canPlayType (' video/mp4; codecs= "avcl. 42E01E,

� mp4a. 4 O. 2 "' ) . replace (/no/, ' ' ) ) ;

<video> Theora formátumban Lásd a,,Theora"cínű részt az 5. fejezetben

var v= document. createElement ('v ideo' ) ;

return ! ! (v. canPlayType && v. canPlayType (' video/ogg; codecs= "theora "') . � replace (/no/, ''));

contentEditable http://bit.ly/alivbS

return 'isContentEditable' in document. createElement (' span');

Dokumentumok közötti üzenetküldés http://bit.ly/cUOqXd

return! 1window.postMessage;

Előzmények http:/ /bit.ly/9JGAGB

return 11 (window.history && window.history.pushState);

File API http:J /dev.w3.org/2006/webapi/FileAPI/

return typeof FileReader ! = 'undefined';

Helyi tárolás http://dev.w3.org/html5/webstorage/

return 'localStorage' in window && window [' localStorage' l 1== null;

Helymeghatározás Lásd a 6. fejezetben

return! 1navigator.geolocation;

"Húzd és ejtsd" http://bit.ly/aNORFQ

return 'draggable' in document. createElement (' span');

Kapcsolat nélküli webalkalmazások Lásd a 8. fejezetben

return ! !window.applicationCache;

Függelék l 269

Page 262: HTML5 - Az új Szabvány

Mikroadatok http:/ /bit.ly/dBGnqr

return ! !document.getitems;

Munkamenet-tárolás http:/ /dev.w3.org/html5/webstorage/

try {

return 'sessionStorage' in window && window [' sessionStorage' ] ! == null;

} catch(e) { return false;

Server-Sent Events http:/ /dev.w3.org/htm 15/eventsource/

(kiszolgáló által küldött események)

return typeof EventSource ! = 'undefined' ;

SVG http:/ /www.w3.org!TR/SVG/

return ! 1 (document. createElementNS && document. createElementNS ('h t tp: l l

� www.w3.org/2000/svg' , 'svg' ) .createSVGRect);

SVG text/html http://hacks.mozilla.org/201 0/05/

firefox-4-the-html5-parser-inline-svg-speed-and-more/

var e= document. createElement (' div');

e. innerHTML = '<svg></ svg>' ;

return ! ! (window. SVGSVGElement && e. firstChild instanceof window.

� SVGSVGElement);

Visszavonás http:/ /bit.ly/bs6JFR

return typeof UndoManager ! == 'undefined' ;

WebSimpleDB http:/ /dev.w3.org/2006/webapi/WebSim pl e DB/

return ! ! window. indexedDB;

Web Sockets http:/ /dev.w3.org/htm 15/websockets/

return ! 1 window. Web5ocket;

Web SQL Database http://dev.w3.org/html5/webdatabase/

return ! !window.openDatabase;

270 l Függelék

Page 263: HTML5 - Az új Szabvány

Web Workers (webmunkások) http:/ /bit.ly/9jheof

return 1 1 window. Wo r ker;

További olvasmányok

Szabványok és leírások: • HTML5 (http://bit.ly/bYiOQp) • Geolocation (http://www. w 3. org/TR/geolocation-APII) • Server-Sem Events (http:lldev. w 3. orglhtm/5/eventsourcel) • WebSimpleD B (http://dev. w 3. org/2006/webapi/WebSimpleD B/) • Web Sockets (http:lldev.w3.orglhtml5/websocketsl) • Web SQL Database (http://dev.w3.orglhtml5/webdatabasel) • Web Starage (http:lldev.w3.orglhtml5/webstoragel) • Web Workers (http://www. whatwg. orglspecslweb-workerslcurrent-workl)

J avaScri pr-könyvtárak: • Modernizr (),egy HTML5-észlelőkönyvtár

Page 264: HTML5 - Az új Szabvány

A

<article>, 71, 80 -

<aside>, 72

AAC, 130

addColorSrop, 107

addEventListener, 186

Add Type, 162

Advanced Audio Cod ing, 130

AJAX Massive Storage System, !82

alkalmazás-gyorstár, 199

állandó bitsebességű kódolás, 129

almost standards mode, 58

Andrew, 21

Apache, !62

appcache, 199

applicationCache, 47

application/xhtml+xml, 25, 27

arc(), 119

audiokodekek, 127

Audio Video Interleave, 123

aurofocus, 52, 211

auromatikus bemenetellenőrzés, 226

auromatikus fókuszálású mezők, 211

auromatikus hírfolyam-felderítés, 66

auromatikus lejátszás, 158

automatikus űrlapfókusz, 52

auroplay, 158

AVI, 123

azonos eredet elve, 45

Index

B

Basic quality and resolution control, !41

betűjellemzők, 102

betüméret, 103

beviteli elemek, 49

bitráta, 129

bitsebesség, 129

c

<canvas>, 37, 93

CACHE:, 198

Cache-Control, 203

cached, 201

cache manifest, 196

canPlayType(), 41, 42

Canvas text API, 38

ceruza-tagfüggvény, 98

checking, 201

cikkek, 80

címek, 242

címkék, 70

címsorcsoport, 72

címsorok, 77

clear(), 186

clearWatch(), 175

Closure Library, 221

code, 171

content sniffing, 14

Content-Type, 14, 63, 162

context.font, 103

Index J 273

Page 265: HTML5 - Az új Szabvány

comrols, 158 cookie, 181 coords, 170 createLinearGradiem, 106 createRadialGradiem, 106 csatorna, 128 CSS, 66 csúszka, 220

D

$(document).ready(), 213 datetime, 84 dátum, 83, 254 dárumválasztók, 221 DHTML Behaviors, 182 Display Postscript, 21 doctype, 57 Dojo, 221 dokumemum nyelve, 67 dokumentumobjektum-modell, 35 dokumemumtípus, 57 dokumemumvázlat, 78 DOM, 35 DOM-események, 201 DOM Srorage, 184 downloading, 201, 202 drawlmage(), 110

E

egyéni szótárak, 230 egymásba ágyazott hatókörök, 241 egymásba ágyazott szórárak, 231 e-mail címek, 213 em-négyzet, 102 enableHighAccuracy, 174 error, 202 értékelés, 261 események, 251 eseményfolyam, 201

274 l Index

eseménykezelő, 117 excanvas.js, 113 Expires, 203 explorercanvas, 38 ExplorerCanvas, 113

F

<footer>, 72, 87 <form>, 209 fa, 60 FAAC, 130 FairPlay, 130 fejléc, 14 ffmpeg, 154 ffmpeg2theora, 143 fillrect, 95 filiStyle, 95 filiText(), 39, 103 Firefogg, 136, 140 Firefox, 23 Flash-sütik, 182 Flash Video, 122 FlowPlayer, 163 fókusz, 213 font, 102 fordított hivatkozás, 69 függő alapvonal, 102

G

Gears, 49, 175, 183 gears_init.js, 176 geodéziai világrendszer, 172 geo.js, 176 geolocation, 48 Geolocation API, 167 geolokáció, 48, 167 getComext(), 37, 94 getCurrentPosition(), 169, 173 getltem(), 185

Page 266: HTML5 - Az új Szabvány

getitems(), 54 Google Rich Snippets, 243, 257 G PS, 170, 173 gradiem, 106 Greasemonkey, 159 gyermekelem, 60 gyökérelem, 60 gyorstár, 196 gyorstárjegyzék, 196

H

<a href>, 64 <head>, 61 <header>, 72, 78

<hgroup>, 72, 79 .htaccess, 162 H.264, 125, 145, 153 hálózati fehérlista szakasz, 198 hálózati szakasz, 198 HandBrake, 145 handle_srorage(), 187 hatókör, 231, 233 hártérszálak, 46 helyi megosztort objektumok, 182 helyi tárolás, 44, 181 helymeghatározás, 48, 167, 172

helyőrző szöveg, 51, 209 hibakeresés, 203 hiperhivatkozások, 65 hivatkozások, 64 hreflang, 67 HTML+, 20 HTML 4.0, 25 HTML5, 80 HTML5 Srorage, 183 HTML5-támogatás, 35 HTML5-tároló, 183, 185 HTML-munkacsopon, 26

HTML Working Group, 26 HTTP, 16

HTTP2, 17

httpd.conf, 162

HTTP-fejléc, 63, 203

HyTime, 22, 24

<img>, 109

<input type="color">, 226

<input type=" date">, 222

<input type="datetime">, 222

<input type="momh">, 222

<input type="search">, 225

<input type="time">, 223

<input type="url">, 215

<input type="week">, 223

időbélyeg, 170

időpont, 254

ikon, 68

lmage.onload, lll

img, 14

INCLUDE, 22

lndexed Database API, 192

IndexedDB, 192

információs sáv, 169

input type, 49

inpur.value, 218

Imermedia, 20

Internet Explorer, 23, 163

ismeretlen elemek, 73

itemscope, 233, 237, 246

itemtype, 233, 237, 246

i Tunes Plus, 130

J

jegyzékfájl, 195, 197

jelenréstükröző elemek, 71

jQuery Ul, 221

Index l 275

Page 267: HTML5 - Az új Szabvány

K

kapcsolat nélküli webalkalmazás, , 46, 195 karakterkódolás, 62, 64 kategória-kulcsszavak, 70 Képek, 109 képernyőolvasó, 86 képkocka, 124 keresés, 70 keresőmezők, 224 key(), 186 kifejezett szakasz, 198 kitőltési stílus, 95 kodek,41 kódolás, 143 koordináták, 170 kör, 119 korlátozott trükköző mód, 59 körvonalstílus, 95 kötegelt kódolás, 143, 153 kövér lábléc, 88 kritikák, 259 kulcs-érrék párok, 185 külső erőforrásra mutató hivatkozások, 65

L

<linb, 65 lábléc, 72, 87 LAME, 129 lang, 61 láthatatlan adatok, 250 latitude, 170 leképezési mód, 58 lépésköz, 218 léptetőmező, 217, 219 levélcsomópont, 60 libvp8, 155 limited quirks mode, 59 lineTo(), 98 Local Shared Objects, 182 localStorage, 45, 184, 185 Local Storage, 184

276 l Index

longitude, 170 LSO, 182

M

<mark>, 72 <meta>, 62, 251 <meta charset>, 64 <meta http-equiv>, 64 majdnem szabványkövető mód, 58 manifest, 195, 196 maximumAge, 174 metaadatok, 61 Midas, 17 mikroadatok, 53, 230 mikroadatok adatmodellje, 232 mikroformátumok, 229 MIME-típusok, 13, 161 mkclean, 155, 157 Modernizr, 36, 168, 184 Modernizr.inputtypes, 51 morzsaútvonal, 68 Mosaic, 16 MouseEvent, 117 moveTo(), 98 Mozilla, 23 MPEG-1 Audio Layer 3, 129 MPEG-4, 122

N

<nav>, 71 navigációs sáv, 85, 86 navigator, 48, 168 navigator.geolocation, 168 nem trükköző mód, 58 Netscape Navigator, 23 NE TWORK:, 198 név-érték párok, 230, 232 nevesített kulcs, 185 nevesített tulajdonságok, 231 névtér, 232

Page 268: HTML5 - Az új Szabvány

no quirks mode, 58

noupdare, 202

nyelv, 61, 66

o

objekrumrároló, 192

offiine, 47, 195

Ogg, 122, 136, 143

oldalsáv, 72

OpenSearch, 70

p

parh, 98

pingback, 69

placeholder, 51, 210

pont jelölés, 240

pontosság, 174

posirion, 170

PosirionError, 171

PosirionOprions, 173, 175

preload, 158

progress, 201, 202

pubdare, 83

Q

QuickTime, 122

quirks mode, 58

QUOTA_EXCEEDED_ERR, 188

R

rajzkörnyezer, 94

rajzvászon, 37, 93

rajzvászon-koordinárák, 96

rajzvászonra írr szöveg, 38

RDFa, 229

rel, 65

rel = alrernare, 66

rel = "archives", 67

rel = "aurhor", 67

rel= "exrernal", 67

rel = "icon", 68

rel= "license", 68

rel="nexr", 67

rel = "nofollow", 68

rel = "noreferrer", 69

rel = "pingback", 69

rel = "prefetch ", 69

rel="prev", 67

rel = "search", 70

rel = "sidebar", 70

rel = "starr", 67

rel="srylesheer", 65

rel = "tag", 70

rel="up", 68

removeltem(), 186

Rich Snippets, 244

s

<section>, 71

<source>, 160

setltem(), 185

sizes, 68

skip link, 87

SLAC, 17

slider, 220

spinbox, 219

SQL, 191

standards mode, 58

step, 218

srepDown, 218

srepUp, 218

stíluslap, 66

starage esemény, 186

SrorageEvent, 187

stroke(), 99

strokeStyle, 95, 99

supporcs_canvas(), 37, 39

supporcs_geolocation(), 48

Index l 277

Page 269: HTML5 - Az új Szabvány

suppons_inpur_aurofocus(), 53 supports_input_placeholder(), 52 suppons_local_storage(), 45 supports_microdata_api(), 54 supports_offiine(), 47 supports_video(), 41 supports_web_workers(), 46 surround, 128 süti, 181 szabványkövető mód, 58 szakasz, 71 szakaszfejlécek, I 98 szál, 46 számok, 217 személyek, 236 szervezetek, 246 színállomás, 107 színátmenetek, 106 színválasztók, 226 szótár, 230 szöveg, 102 szöveg-alapvonal, 102 szülőcsomópont, 60

T

<rime>, 72, 83, 254 tanalék szakasz, 199 tanalomszimatolás, 14 tartalomrípus, 14 tartomány-utótag, 215 Technorati-címkék, 70 telefonszámok, 248 testvér, 60 textAlign, I 02 textBaseline, 102, 103 text/cache-manifest, 196 text/html, 26 Theora, 126 timeour, 174 timestamp, 170 rolltagfüggvény, 98 rrükköző mód, 58

278 l Index

type, 66, 160 rype="number", 217

u

ugróhivatkozás, 87 updateready, 202 URI, 215 URL, 215, 242 űrlap, 49 űrlapellenőrzés, 227 űrlapok,26,209 URL-minta, 200

userData, 182 útvonal, 98

v

-vcodec, 155 <video>, 40, 121, 131, 157 változó birsebességű kódolás, 129 value, 218 valueAsNumber, 218 videó, 40 Video for Everybody!, 40 videoformárumok, 41, 42 videokodekek, 123 videorárolók, 122 viszonyított betűmérer, 103 visszhangérresírés, 69 viszonyleíró elemek, 64 VML, 113 Vorbis, 130 VP8, 126

w

watchPosition(), 175 webcímek, 215 WebDB, 191 webes űrlapok, 26, 49, 209

Page 270: HTML5 - Az új Szabvány

WebM, 43, 123, 154 webmunkások, 45 WebSimpleDB, 192 Web SQL Database, 191 Web Srorage, 183 Web Worker API, 45 WGS84, 172 window.applicationCache, 201 window.applicationCache.

�swapCache(), 202 window.evenr, 187 window.onload, 110, 213 Worker, 46 World.Geodetic System, !72

x

x264, 126 XHTML,27 XHTML 1.0, 25 XHTML Extended Fo rrns, 26 XHTML névtér, 60 xml:lang, 61 xmlns jellemző, 60 XMosaic, 16

y

YUI, 221

Page 271: HTML5 - Az új Szabvány

A szerzőről

Mark Pilgrim fejlesztési tanácsadóként dolgozik a Google-nél; a szakterü­letét a nyílt forrás és a nyílt szabványok jelentik. Mark szám os műszaki témájú könyv szerzője; eddig megjelent kötetei között olyanok találhatók, mint a Greasemonkey Hacks (O'Reilly) a Dive lnto Python (APress) vagy a Dive lnto Accessibility. (Ez utóbbi egy szabadon hozzáférhető elektronikus tanfo­lyam a webes tartalmak akadálymentesítéséről.) Mark Észak-Karotinában él feleségével, két fiával és nagy, nyáladzó kutyájával.