Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00060 005297 14475225 na godz. na dobę w sumie
HTML5. Programowanie aplikacji - książka
HTML5. Programowanie aplikacji - książka
Autor: Liczba stron: 168
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-4897-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> javascript - programowanie
Porównaj ceny (książka, ebook (-20%), audiobook).

W sieci trwa właśnie rewolucja! Do władzy dochodzi język HTML5!

Jego potencjał jest nieograniczony - ścisła integracja z przeglądarką internetową, wydajna obsługa grafiki czy wsparcie dla geolokalizacji to tylko niektóre z jego atutów. Korzystając z jego możliwości, możesz stworzyć świetną grę lub przydatną aplikację internetową.

Poznaj pełne możliwości języka HTML5 i dowiedz się, jak budować kompletne i autonomiczne aplikacje, działające na urządzeniach przenośnych i konkurujące z tradycyjnymi aplikacjami. Dzięki temu praktycznemu przewodnikowi odkryjesz skuteczne metody pracy z językiem HTML5, takie jak lokalne magazynowanie danych i przetwarzanie wielowątkowe. Zaznajomisz się również z zaawansowanymi narzędziami JavaScriptu, które ułatwiają korzystanie z całej gamy elementów języka HTML5. Jeśli jesteś doświadczonym programistą JavaScriptu, umieszczone w książce przykładowe kody pokażą Ci, jak język HTML5 zamienia sieć WWW w pierwszorzędne środowisko programistyczne.

Zobacz, jak:

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

• Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treļci Przedmowa .................................................................................................7 1. Sieë WWW jako platforma aplikacji ..............................................11 12 13 15 Zwiökszanie moĔliwoĈci aplikacji internetowych Projektowanie aplikacji internetowych Triumf jözyka JavaScript 2. MoŜliwoļci jýzyka JavaScript ....................................................... 19 20 22 24 27 30 33 36 37 41 Nieblokujñce operacje wejĈcia-wyjĈcia i wywoäania zwrotne Funkcje lambda oferujñ duĔe moĔliwoĈci Domkniöcia Programowanie funkcyjne Prototypy i sposób rozszerzania obiektów Rozszerzanie funkcji przy uĔyciu prototypów Rozwijanie i parametry obiektów Operacje iteracji dotyczñce tablicy Obiekty równieĔ mogñ byè rozwijane 3. Testowanie aplikacji JavaScript ....................................................43 47 50 QUnit Selenium 4. Lokalne magazynowanie danych ................................................. 71 73 82 Obiekty localStorage i sessionStorage Dodatki biblioteki jQuery 3 5. Interfejs IndexedDB .......................................................................85 89 Dodawanie i aktualizowanie rekordów Dodawanie indeksów 90 91 Pobieranie danych Usuwanie danych 92 6. Pliki .................................................................................................93 94 95 97 98 99 101 Obiekty blob Praca z plikami Wysyäanie plików Przeciñganie i upuszczanie Poäñczenie wszystkiego ze sobñ System plików 7. Praca w trybie bez poĥéczenia .................................................... 103 104 108 109 Plik manifestu — wprowadzenie Zdarzenia Debugowanie plików manifestu 8. Podziaĥ pracy za pomocé technologii Web Workers ...................113 115 117 119 127 Przypadki zastosowania wñtku roboczego Web Worker Zastosowanie technologii Web Workers Przykäad fraktala bazujñcego na wñtku roboczym Testowanie i debugowanie wñtków roboczych Web Worker Wzorzec ponownego wykorzystania przetwarzania wielowñtkowego Biblioteki dla technologii Web Workers 127 132 9. Gniazda WWW ............................................................................ 133 135 136 136 139 Interfejs gniazd WWW Konfigurowanie gniazda WWW Przykäad gniazda WWW Protokóä gniazd WWW 4 _ Spis treļci 10. Nowe znaczniki ........................................................................... 143 143 145 146 147 149 149 150 150 Znaczniki dla aplikacji Uäatwienie dostöpu za pomocñ aplikacji WAI-ARIA Mikrodane Nowe typy formularzy DĒwiök i wideo Element canvas i format SVG Geolokacja Nowy kod CSS A Narzýdzia JavaScript, które warto znaë ..................................... 153 Skorowidz ............................................................................................... 157 Spis treļci _ 5 6 _ Spis treļci ROZDZIAĤ 4. Lokalne magazynowanie danych Przeglñdarka internetowa oferuje uĔytkownikom skryptów JavaScript zna- komite Ĉrodowisko säuĔñce do budowania aplikacji uruchamianych w prze- glñdarce. Gdy uĔywa siö biblioteki ExtJS lub jQuery, moĔliwe jest utwo- rzenie aplikacji, która w opinii wielu uĔytkowników moĔe rywalizowaè z tym, co oferuje tradycyjna aplikacja. Ponadto moĔna skorzystaè z wyjñt- kowo prostej metody dystrybucji. Choè przeglñdarka Ĉwietnie wypada pod wzglödem komfortu obsäugi interfejsu uĔytkownika, nie moĔe siö juĔ jednak pochwaliè tym samym w odniesieniu do magazynowania danych. Dawniej przeglñdarki nie potrafiäy w Ĕaden sposób magazynowaè danych. Praktycznie byäy one jedynym w swoim rodzaju „cienkim” klientem. To, co pojawiäo siö jako pierwsze, byä to mechanizm obsäugi informacji cookie pro- tokoäu HTTP, który umoĔliwia powiñzanie porcji danych z kaĔdym Ĕñda- niem HTTP. JednakĔe w przypadku informacji cookie pojawia siö kilka problemów. Po pierwsze, kaĔda taka informacja jest odsyäana z kaĔdym Ĕñdaniem. A zatem przeglñdarka wysyäa informacjö cookie dla kaĔdego pliku JavaScript, obrazu, Ĕñdania Ajax itp. Bez Ĕadnego uzasadnionego po- wodu moĔe to spowodowaè znaczne wykorzystanie przepustowoĈci poäñ- czenia. Po drugie, w specyfikacji informacji cookie tak jñ zdefiniowano, aby mogäa byè wspóäuĔytkowana w wielu róĔnych domenach. JeĈli do firmy naleĔaäy domeny app.test.com i images.test.com, informacja cookie mogäa zostaè ustawiona dla obu jako widoczna. Problem polega na tym, Ĕe poza Stanami Zjednoczonymi powszechne stajñ siö nazwy domen zäoĔone z trzech czöĈci. Na przykäad moĔliwe byäoby ustawienie informacji cookie dla wszystkich hostów w domenie .co.il. W efekcie informacja cookie mogäaby trafiè do niemal kaĔdego hosta w Izraelu. Ponadto nie jest moĔliwe wymaganie trzyczöĈcio- wej nazwy domeny kaĔdorazowo, gdy nazwa zawiera przyrostek kraju, poniewaĔ niektóre paþstwa, takie jak Kanada, stosujñ innñ konwencjö. 71 MoĔliwoĈè lokalnego magazynowania w przeglñdarce zapewnia powaĔnñ korzyĈè pod wzglödem szybkoĈci. W zaleĔnoĈci od serwera wykonywanie normalnego zapytania Ajax moĔe zajñè od póä sekundy do kilku sekund. JednakĔe nawet w najlepszym moĔliwym przypadku moĔe to byè doĈè däugi czas. Przesäanie prostego Ĕñdania narzödzia ping protokoäu ICMP z mojego biura w Tel Awiwie do serwera w Kalifornii zajmie Ĉrednio 250 ms. DuĔa czöĈè tego czasu bödzie prawdopodobnie wynikiem podstawowych ograniczeþ fizycznych: dane mogñ byè przesyäane w kablu tylko z okre- Ĉlonñ czöĈciñ uäamkowñ prödkoĈci Ĉwiatäa. A zatem bardzo niewiele moĔna zrobiè w celu zwiökszenia szybkoĈci, dopóki dane muszñ pokonywaè drogö z przeglñdarki do serwera. Opcje lokalne magazynowania bardzo dobrze siö sprawdzajñ w przypad- ku danych, które sñ statyczne lub gäównie statyczne. Na przykäad wiele aplikacji zawiera listö paþstw jako czöĈè swoich danych. JeĈli nawet lista uwzglödnia kilka dodatkowych informacji, takich jak to, czy produkt jest oferowany w kaĔdym kraju, nie bödzie siö zmieniaè zbyt czösto. W tym przypadku nierzadko sprawdza siö rozwiñzanie polegajñce na wstöpnym zaäadowaniu danych do obiektu localStorage, a nastöpnie w razie potrzeby warunkowym ponownym äadowaniu, aby uĔytkownik uzyskaä wszelkie nowe dane bez koniecznoĈci oczekiwania na te bieĔñce. OczywiĈcie lokalne magazynowanie jest równieĔ istotne podczas pracy z aplikacjñ internetowñ, która moĔe dziaäaè w trybie bez poäñczenia. Choè obecnie dostöp do internetu moĔe wydawaè siö wszechobecny, nie powi- nien byè traktowany jako coĈ uniwersalnego (nawet w inteligentnych tele- fonach). UĔytkownicy z takimi urzñdzeniami jak iPod uzyskajñ dostöp do internetu tylko wtedy, gdy istnieje poäñczenie WiFi. Nawet w przypadku inteligentnych telefonów, takich jak iPhone lub Android, wystñpiñ „martwe” strefy bez dostöpu do sieci. Wraz z rozwojem jözyka HTML5 dokonano sporego postöpu w zakresie zapewniania przeglñdarce metody tworzenia trwaäego magazynu lokalnego. JednakĔe wyniki tych prac wymagajñ jeszcze nabrania realnych ksztaätów. Obecnie istniejñ co najmniej trzy propozycje dotyczñce sposobu przecho- wywania danych w kliencie. W roku 2007 w ramach projektu Gears firma Google zaprezentowaäa bazö danych SQLite opartñ na przeglñdarce. W przeglñdarkach bazujñcych na mechanizmie WebKit, w tym Chrome, Safari oraz przeglñdarkach dla tele- fonów iPhone i Android, zaimplementowano wersjö bazy danych Gears SQLite. Jednak tö bazö danych usuniöto z propozycji jözyka HTML5, po- niewaĔ jest ona komponentem z jednym Ēródäem. 72 _ Rozdziaĥ 4. Lokalne magazynowanie danych Mechanizm localStorage udostöpnia obiekt JavaScript, który jest zacho- wywany w kolejnych operacjach ponownego äadowania stron interneto- wych. Ten mechanizm wydaje siö doĈè dobrze uzgodniony i stabilny. Jest odpowiedni do przechowywania danych o niewielkim rozmiarze, takich jak informacje o sesji lub preferencje uĔytkownika. W tym rozdziale wyjaĈniono, jak uĔywaè implementacji mechanizmu localStorage. W rozdziale 5. zajmiemy siö bardziej skomplikowanñ i zaawan- sowanñ odmianñ lokalnego magazynowania, która pojawiäa siö w niektórych przeglñdarkach. Mowa o interfejsie IndexedDB. Obiekty localStorage i sessionStorage Na potrzeby magazynowania nowoczesne przeglñdarki oferujñ progra- miĈcie dwa obiekty localStorage i sessionStorage. KaĔdy z tych obiektów moĔe przechowywaè dane jako klucze i wartoĈci. Obiekty majñ ten sam interfejs i dziaäajñ jednakowo z jednym wyjñtkiem. Obiekt localStorage jest zachowywany w kolejnych uruchomieniach przeglñdarki, natomiast obiekt sessionStorage jest resetowany w chwili ponownego uruchomienia sesji przeglñdarki. MoĔe to mieè miejsce w przypadku zamykania przeglñdarki lub okna. Dokäadny moment wystñpienia tego zdarzenia bödzie zaleĔny od szczegóäów przeglñdarki. Ustawianie tych obiektów i uzyskiwanie do nich dostöpu jest naprawdö proste (przykäad 4.1). Przykäad 4.1. Uzyskiwanie dostöpu do obiektu localStorage // Ustawianie localStorage.sessionID = sessionId; localStorage.setItem( sessionID , sessionId); // Uzyskiwanie dostĊpu var sessionId; sessionId = localStorage.sessionID; sessionId = localStorage.getItem( sessionId ); localStorage.sessionId = undefined; localStorage.removeItem( sessionId ); Dane magazynowane przez przeglñdarkö, takie jak informacje cookie, im- plementujñ omawianñ zasadö „tego samego Ēródäa”. Z tego powodu róĔne witryny internetowe nie mogñ kolidowaè z innñ witrynñ lub odczytywaè jej danych. JednakĔe oba obiekty opisywane w tym podrozdziale sñ Obiekty localStorage i sessionStorage _ 73 przechowywane na dysku uĔytkownika (tak jak informacje cookie), dlatego bardziej zaawansowany uĔytkownik moĔe znaleĒè sposób na edytowanie danych. Narzödzia Developer Tools przeglñdarki Chrome umoĔliwiajñ programiĈcie edytowanie obiektu magazynowania. Taki obiekt moĔe byè równieĔ edytowany w przeglñdarce Firefox za poĈrednictwem dodatku Firebug lub innego narzödzia. Oznacza to, Ĕe choè inne witryny nie mogñ uzyskaè dostöpu do danych w obiektach magazynowania, nie powinny one jednak byè godne zaufania. Informacji cookie dotyczñ okreĈlone restrykcje. Ich maksymalna wielkoĈè to okoäo 4 kB. Ponadto informacje te muszñ byè przesyäane do serwera z kaĔ- dym Ĕñdaniem Ajax, co znacznie zwiöksza ruch w sieci. Obiekt localStorage przeglñdarki pozwala na o wiele wiöcej. Choè specyfikacja jözyka HTML5 nie okreĈla dokäadnego limitu wielkoĈci obiektu, w wiökszoĈci przeglñdarek na jednego hosta internetowego jest ustalony taki limit i wynosi on okoäo 5 MB. Programista nie powinien przyjmowaè bardzo duĔego obszaru ma- gazynowania. Dane mogñ byè przechowywane w obiekcie magazynowania z wykorzy- staniem bezpoĈredniego dostöpu do niego lub przy uĔyciu zestawu funk- cji dostöpu. Obiekt sesji moĔe przechowywaè wyäñcznie äaþcuchy, dlatego kaĔdy magazynowany obiekt bödzie rzutowany na äaþcuch. Oznacza to, Ĕe obiekt bödzie przechowywany w postaci [object Object], która praw- dopodobnie nie jest tym, czego siö oczekuje. Aby przechowywaè obiekt lub tablicö, naleĔy je najpierw przeksztaäciè do formatu JSON. Zmiana wartoĈci w obiekcie magazynowania kaĔdorazowo powoduje wy- woäanie zdarzenia magazynowania. To zdarzenie wyĈwietli klucz, a takĔe jego poprzedniñ i nowñ wartoĈè. W przykäadzie 4.2 zaprezentowano ty- powñ strukturö danych. W przeciwieþstwie do niektórych zdarzeþ, takich jak klikniöcia, zdarzenia magazynowania nie mogñ zostaè wyeliminowane. Aplikacja nie ma moĔliwoĈci poinformowania przeglñdarki o tym, aby nie wprowadzaäa zmiany. Zdarzenie po prostu informuje aplikacjö o zmianie juĔ po fakcie. Przykäad 4.2. Interfejs zdarzenia magazynowania var storageEvent = { key: key , oldValue: old , newValue: newValue , url: url , storageArea: storage // Zmodyfikowany obszar magazynowania }; 74 _ Rozdziaĥ 4. Lokalne magazynowanie danych Mechanizm WebKit udostöpnia okno w ramach wäasnych narzödzi Deve- loper Tools, w którym programista moĔe wyĈwietliè i edytowaè obiekty localStorage i sessionStorage (rysunek 4.1). W oknie naleĔy kliknñè kartö Storage. Spowoduje to wyĈwietlenie obiektów localStorage i sessionStorage na stronie. Okno oferuje teĔ peäne moĔliwoĈci edycji. Klucze mogñ byè w nim dodawane, usuwane i modyfikowane. Rysunek 4.1. Przeglñdarka obiektów magazynowania aplikacji Chrome Choè w przeciwieþstwie do przeglñdarki Chrome oraz innych przeglñda- rek opartych na mechanizmie WebKit dodatek Firebug nie udostöpnia in- terfejsu do obiektów localStorage i sessionStorage, dostöp do nich moĔe byè uzyskany za poĈrednictwem konsoli JavaScript. UmoĔliwia ona do- dawanie, edytowanie i usuwanie kluczy. Spodziewam siö, Ĕe kiedyĈ ktoĈ utworzy rozszerzenie dodatku Firebug, które na to pozwoli. OczywiĈcie moĔliwe jest utworzenie interfejsu niestandardowego, säuĔñcego do wyĈwietlania i edytowania obiektów magazynowania w dowolnej prze- glñdarce. NaleĔy utworzyè widget wyĈwietlany na ekranie, który prezentuje obiekty przy uĔyciu wywoäaþ metod getItem i removeItem (przykäad 4.1), i zezwoliè na edycjö za pomocñ pól tekstowych. Szkielet widgetu zapre- zentowano w przykäadzie 4.3. Obiekty localStorage i sessionStorage _ 75 Przykäad 4.3. Przeglñdarka obiektów magazynowania (function createLocalStorageViewer() { $( table /table ).attr( { id : LocalStorageViewer , class : hidden viewer }).appendTo( body ); localStorage.on( update , viewer.load); var viewer = { load: function loadData() { var data, buffer; var renderLine = function (line) { return tr key= {key} value= {value} .populate(line) + td class= remove Usuñ klucz /td + td class= storage-key {key} /td td {value} /td /tr .populate(line); }; buffer = Object.keys(localStorage).map(function (key) var rec = { key: key, value: localStorage[data] }; return rec; }); }; $( #LocalStorageViewer ).html(buffer.map(renderLine).join( )); $( #LocalStorageViewer tr.remove ).click(function () { var key = $(this).parent( tr ).attr( key ).remove(); localStorage[key] = undefined; }); $( #LocalStroageViewer tr ).dblclick(function () { var key = $(this).attr( key ); var value = $(this).attr( value ); var newValue = prompt( Czy zmieniÊ wartoĂÊ + key + ? , value); if (newValue !== null) { localStorage[key] = newValue; } }); }; }()); 76 _ Rozdziaĥ 4. Lokalne magazynowanie danych UŜycie obiektu localStorage w bibliotece ExtJS Biblioteka ExtJS, której kilka przykäadów zamieszczono w poprzednich roz- dziaäach, to niezwykle popularna struktura jözyka JavaScript, umoĔliwia- jñca bardzo zaawansowane, interaktywne operacje wyĈwietlania. W tym punkcie wyjaĈniono, jak uĔywaè obiektu localStorage z bibliotekñ ExtJS. WartoĈciowñ funkcjñ tej biblioteki jest to, Ĕe wiele jej obiektów moĔe za- pamiötywaè wäasny stan. Na przykäad obiekt siatki biblioteki ExtJS umoĔ- liwia uĔytkownikowi zmianö wielkoĈci, ukrywanie i wyĈwietlanie oraz zmianö kolejnoĈci kolumn. Te zmiany sñ zapamiötywane i ponownie wy- Ĉwietlane, gdy uĔytkownik powróci póĒniej do aplikacji. Pozwala to kaĔ- demu uĔytkownikowi dostosowaè sposób dziaäania elementów aplikacji. Biblioteka ExtJS udostöpnia obiekt do zapisu stanu, lecz do przechowywa- nia danych wykorzystuje informacje cookie. ZäoĔona aplikacja moĔe utwo- rzyè dane dotyczñce stanu, wystarczajñce do przekroczenia limitów wiel- koĈci obowiñzujñcych dla informacji cookie. Aplikacja z kilkoma tuzinami siatek moĔe wygenerowaè informacjö cookie o wielkoĈci, która spowoduje zawieszenie aplikacji. Zatem lepsze byäoby uĔycie obiektu localStorage, który oferuje znacznie wiökszñ wielkoĈè, a ponadto eliminuje obciñĔenie wynikajñce z wysyäania danych do serwera w kaĔdym Ĕñdaniu. Okazuje siö, Ĕe konfigurowanie niestandardowego obiektu dostawcy stanu jest naprawdö proste. Dostawca zaprezentowany w przykäadzie 4.4 roz- szerza ogólny obiekt dostawcy, a co wiöcej — musi zapewniè trzy metody: set, clear i get. Te metody po prostu odczytujñ dane z magazynu i zapi- sujñ je w nim. W przykäadzie 4.4 zdecydowaäem siö na poindeksowanie danych w magazynie za pomocñ raczej prostej metody polegajñcej na za- stosowaniu äaþcucha state_ z identyfikatorem stanu zapisywanego ele- mentu. Jest to sensowna metoda. Przykäad 4.4. Lokalny dostawca stanu biblioteki ExtJS Ext.ux.LocalProvider = function() { Ext.ux.LocalProvider.superclass.constructor.call(this); }; Ext.extend(Ext.ux.LocalProvider, Ext.state.Provider, { // ************************************************************ set: function(name, value) { if (typeof value == undefined || value === null) { localStorage[ state_ + name] = undefined; return; } else { localStorage[ state_ + name] = this.encodeValue(value); Obiekty localStorage i sessionStorage _ 77 } }, // ************************************************************ // Private clear: function(name) { localStorage[ state_ + name] = undefined; }, // ************************************************************ get: function(name, defaultValue) { return Ext.value(this.decodeValue(localStorage[ state_ + name]), ´defaultValue); } }); // Zdefiniowanie procedury obsáugi stanu Ext.onReady(function setupState() { var provider = new Ext.ux.LocalProvider(); Ext.state.Manager.setProvider(provider); }); MoĔliwe byäoby równieĔ umieszczenie wszystkich danych stanu w jed- nym duĔym obiekcie i przechowywanie go w jednym kluczu magazynu. KorzyĈciñ z tego wynikajñcñ jest to, Ĕe w magazynie nie jest tworzona du- Ĕa liczba elementów. JednakĔe kod staje siö bardziej zäoĔony. JeĈli ponadto dwa okna próbujñ zaktualizowaè magazyn, jedno moĔe negatywnie wpäynñè na zmiany dokonane przez drugie. Lokalne magazynowanie danych opi- sane w rozdziale nie oferuje Ĕadnego znakomitego rozwiñzania problemu dotyczñcego warunków wyĈcigu. W miejscach, w których moĔe to stanowiè problem, prawdopodobnie lepiej bödzie uĔyè interfejsu IndexedDB lub innego rozwiñzania. Ĥadowanie w trybie bez poĥéczenia przy uŜyciu magazynu danych Gdy czöĈè trwaäych danych uĔywanych w aplikacji bödzie stosunkowo niezmienna, w celu zapewnienia szybszego dostöpu moĔe mieè sens äa- dowanie danych do lokalnego magazynu. W tym przypadku niezbödne bödzie zmodyfikowanie obiektu Ext.data.JsonStore tak, aby jego metoda load() szukaäa danych w obszarze localStorage przed podjöciem próby zaäa- dowania danych z serwera. Po zaäadowaniu danych z obszaru localStorage obiekt Ext.data.JsonStore powinien wywoäaè serwer w celu sprawdzenia, czy dane zostaäy zmienione. W ten sposób aplikacja jest w stanie natych- miast udostöpniè dane uĔytkownikowi, co moĔe wiñzaè siö z wystñpieniem krótkotrwaäej niespójnoĈci. MoĔe to wpäynñè na szybszñ obsäugö interfejsu przez uĔytkownika, a ponadto zredukowanie przepustowoĈci wykorzy- stywanej przez aplikacjö. 78 _ Rozdziaĥ 4. Lokalne magazynowanie danych PoniewaĔ w przypadku wiökszoĈci Ĕñdaþ dane nie bödñ modyfikowane, naprawdö sensowne jest uĔycie dla danych okreĈlonej postaci mechani- zmu ETag. Dane sñ pobierane z serwera za pomocñ Ĕñdania GET protokoäu HTTP i nagäówka If-None-Match. JeĈli serwer stwierdzi, Ĕe dane nie zmie- niäy siö, moĔe wysäaè odpowiedĒ 304 Not Modified. JeĔeli dane zostaäy zmodyfikowane, serwer odeĈle nowe dane, a aplikacja zaäaduje je zarówno do obiektu Ext.data.JsonStore, jak i do obiektu sessionStorage. Obiekt Ext.data.PreloadStore (przykäad 4.6) przechowuje dane w buforze sesji jako jeden duĔy obiekt JSON (przykäad 4.5). Dodatkowo dane odsy- äane przez serwer obiekt opakowuje w kopertö JSON, która umoĔliwia przechowywanie w niej metadanych. W tym przypadku sñ przechowywane dane mechanizmu ETag, a takĔe data ich zaäadowania. Przykäad 4.5. Format danych trybu bez poäñczenia obiektu Ext.data.PreloadStore { etag : 25f9e794323b453885f5181f1b624d0b , loadDate : 26-jan-2011 , data : { root : [{ code : us , name : Stany Zjednoczone }, { code : ca , name : Kanada }] } } Przykäad 4.6. Obiekt Ext.data.PreloadStore Ext.extend(Ext.data.PreloadStore, Exta.data.JsonStore, { indexKey: , // DomyĞlny klucz indeksu loadDefer: Time.MINUTE, // OkreĞlanie opóĨnienia procesu áadowania danych listeners: { load: function load(store, records, options) { var etag = this.reader.etag; var jsonData = this.reader.jsonData; var data = { etag: etag, date: new date(), data: jsonData }; sessionStorage[store.indexKey] = Ext.encode(data); Obiekty localStorage i sessionStorage _ 79 }, beforeload: function beforeLoad(store, options) { var data = sessionStorage[store.indexKey]; if (data === undefined || options.force) { return true; // Brak danych w buforze; áadowanie z serwera } var raw = Ext.decode(data); store.loadData(raw.data); // Odroczenie ponownego áadowania danych store.doConditionalLoad.defer(store.loadDefer, store, [raw.etag]); return false; } }, doConditionalLoad: function doConditionalLoad(etag) { this.proxy.headers[ If-None-Match ] = etag; this.load( { force: true }); }, forceLoad: function () { // Przekazanie fikcyjnego identyfikatora ETag w celu wymuszenia áadowania this.doConditionalLoad( ); } }); Podczas tworzenia identyfikatora mechanizmu ETag naleĔy pa- miötaè o uĔyciu odpowiedniej funkcji mieszajñcej. Algorytm MD5 to prawdopodobnie najlepszy wybór. Choè algorytm SHA1 teĔ moĔe zostaè zastosowany, poniewaĔ generuje znacznie däuĔszy äaþcuch, raczej nie jest godny uwagi. W teorii moĔliwe jest wystñ- pienie kolizji dotyczñcej algorytmu MD5, lecz w praktyce w przy- padku kontrolowania bufora prawdopodobnie nie jest to powód do zmartwienia. Dane w obiekcie localStorage mogñ byè zmieniane w tle. Jak juĔ wyjaĈniono, uĔytkownik moĔe zmieniè dane za pomocñ narzödzi Developer Tools prze- glñdarki Chrome lub z poziomu wiersza poleceþ dodatku Firebug. Zmiana danych moĔe teĔ po prostu wystñpiè nieoczekiwanie, gdy uĔytkownik tö samñ aplikacjö otworzy w dwóch przeglñdarkach. A zatem waĔne jest, aby magazyn prowadziä nasäuch pod kñtem zdarzenia aktualizacji z obiektu localStorage. 80 _ Rozdziaĥ 4. Lokalne magazynowanie danych WiökszoĈè operacji jest wykonywana w procedurze obsäugi zdarzenia beforeload. Sprawdza ona, czy w magazynie danych znajduje siö buforo- wana kopia danych. JeĈli kopia istnieje, procedura äaduje jñ do magazynu. JeĔeli dane wystöpujñ, procedura obsäugi zaäaduje ponownie równieĔ dane, lecz uĔyje metody Function.defer() w celu opóĒnienia procesu äadowania do momentu pomyĈlnego zakoþczenia przez system wczytywania strony internetowej. Dziöki temu z mniejszym prawdopodobieþstwem proces äadowania bödzie zauwaĔalny dla uĔytkownika. Metoda store.doConditionalLoad() kieruje wywoäanie Ajax do serwera, aby zaäadowaè dane. PoniewaĔ metoda uwzglödnia nagäówek If-None-Match, jeĈli dane nie zmieniäy siö, zaäaduje ona bieĔñce dane. Metoda ta uĔywa równieĔ opcji force, która sprawi, Ĕe procedura obsäugi beforeload zaäaduje nowe dane i nie podejmie próby odĈwieĔenia magazynu z wykorzystaniem buforowanej wersji obiektu localStorage. Aby zwiökszyè czytelnoĈè kodu, przewaĔnie definiujö staäe dla SECOND, MINUTE i HOUR. Przechowywanie zmian w celu póŚniejszej synchronizacji z serwerem W sytuacji, gdy aplikacja moĔe dziaäaè w trybie bez poäñczenia lub z uĔy- ciem kiepskiego poäñczenia internetowego, przydatne moĔe byè zapew- nienie uĔytkownikowi moĔliwoĈci zapisu zmian bez wymogu dostöpu do sieci. W tym celu zmiany w kaĔdym rekordzie naleĔy zapisywaè w kolejce obiektu localStorage. Po ponownym nawiñzaniu poäñczenia sieciowego przez przeglñdarkö kolejka moĔe byè przekazana serwerowi. Pod wzglödem dziaäania przypomina to dziennik transakcji uĔywany w bazie danych. Kolejka zapisu moĔe wyglñdaè podobnie jak w przykäadzie 4.7. KaĔdy re- kord w kolejce reprezentuje dziaäanie podejmowane na serwerze. Oczywi- Ĉcie dokäadny format bödzie okreĈlany zaleĔnie od wymaganej konkretnej aplikacji. Przykäad 4.7. Dane kolejki zapisu [ { url : /index.php , params : {} }, { url : /index.php , Obiekty localStorage i sessionStorage _ 81 params : {} }, { url : /index.php , params : {} } ] Gdy przeglñdarka internetowa ponownie przeäñczy siö w tryb z poäñczeniem, niezbödne bödzie przetworzenie elementów kolejki. W przykäadzie 4.8 pierwszy element kolejki jest wysyäany do serwera. JeĈli to Ĕñdanie zakoþ- czy siö powodzeniem, zostanie pobrany nastöpny element. Proces bödzie kontynuowany dla kolejnych elementów aĔ do momentu wysäania caäej zawartoĈci kolejki. JeĈli nawet kolejka jest däuga, ten proces bödzie prze- prowadzany z minimalnym wpäywem na dziaäania uĔytkownika, poniewaĔ technologia Ajax przetwarza kaĔdy element w sposób asynchroniczny. W celu zmniejszenia liczby wywoäaþ Ajax moĔliwa byäaby taka modyfika- cja przykäadowego kodu, aby jednoczeĈnie byäy wysyäane elementy kolejki w grupach liczñcych na przykäad piöè pozycji. Przykäad 4.8. Kolejka zapisu var save = function save(queue) { if (queue.length 0) { $.ajax( { url: save.php , data: queue.slice(0, 5), success: function (data, status, request) { save(queue.slice(5)); } }); } }; Dodatki biblioteki jQuery JeĈli niepewnoĈè wszystkich opcji magazynowania po stronie klienta nie daje spokoju, moĔna skorzystaè z innych opcji. Jak w przypadku wielu rzeczy w jözyku JavaScript, zäy i niespójny interfejs moĔe byè zastñpiony moduäem, który zapewnia znacznie lepszy interfejs. PoniĔej omówiono dwa takie moduäy uäatwiajñce pracö. 82 _ Rozdziaĥ 4. Lokalne magazynowanie danych DSt DSt (http://github.com/gamache/DSt) to prosta biblioteka, która opakowuje obiekt localStorage. DSt moĔe byè autonomicznñ bibliotekñ lub dziaäaè jako dodatek biblioteki jQuery. Biblioteka DSt automatycznie przeksztaäci do- wolny zäoĔony obiekt w strukturö JSON. Ta biblioteka pozwala równieĔ zapisywaè i przywracaè stan caäego for- mularza lub jego elementu. Aby zapisaè i przywróciè element, metodzie DSt.store() naleĔy przekazaè element lub jego identyfikator. W celu póĒniej- szego przywrócenia elementu naleĔy go przekazaè metodzie DSt.recall(). Aby zapisaè stan caäego formularza, naleĔy uĔyè metody DSt.store_form(). Metoda pobiera identyfikator lub element samego formularza. Dane mogñ byè przywrócone za pomocñ metody DSt.populate_form(). Przykäad 4.9 pre- zentuje podstawowe zastosowanie biblioteki DSt. Przykäad 4.9. Interfejs biblioteki DSt $.DSt.set( key , value ); var value = $.DSt.get( key ); $.DSt.store( element ); // Zapisanie wartoĞci elementu formularza $.DSt.recall( element ); // Przywrócenie wartoĞci elementu formularza $.DSt.store_form( form ); $.DSt.populate_form( form ); jStore Aby nie podejmowaè ryzyka zwiñzanego z okreĈlaniem, jakie mechanizmy magazynowania sñ obsäugiwane przez poszczególne przeglñdarki, i nie two- rzyè róĔnego kodu dla kaĔdego przypadku, moĔna skorzystaè z dobrego rozwiñzania, czyli dodatku jStore (http://twablet.com/docs.html?p=jstore) dla biblioteki jQuery. Dodatek obsäuguje obiekty localStorage i sessionStorage, komponenty Gears SQLite i HTML5 SQLite, a takĔe rozwiñzania Flash Storage i wbudowane w przeglñdarkö Internet Explorer 7. Dodatek jStore ma prosty interfejs, który umoĔliwia programiĈcie prze- chowywanie par nazwa/wartoĈè w dowolnym z róĔnych mechanizmów magazynowania. Dodatek zapewnia jeden zestaw interfejsów dla wszystkich mechanizmów. Z tego powodu w razie potrzeby program moĔe dokonaè degradacji z „wdziökiem” w sytuacjach, gdy mechanizm magazynowania nie jest dostöpny w danej przeglñdarce. Dodatki biblioteki jQuery _ 83 Dodatek jStore udostöpnia listö mechanizmów obecnych w zmiennej instancji jQuery.jStore.Availability. Program powinien wybraè najbardziej sensowny mechanizm. W przypadku aplikacji wymagajñcych obsäugi przez wiele przeglñdarek moĔe to byè poĔyteczny dodatek. Wiöcej szczegóäów moĔna znaleĒè w witrynie internetowej dodatku jStore. 84 _ Rozdziaĥ 4. Lokalne magazynowanie danych Skorowidz MongoDB, 85 NoSQL, 85 SQLite, 72 bezpieczeþstwo danych, 86 biblioteka DSt, 83 Event Machine, 140 ExtJS, 17, 77 jQuery, 14, 16 jQuery Hive, 132 PollenJS, 132 socket.io, 135 Symfony Yaml Library, 106 bäödy w wñtku roboczym, 127 bufor aplikacji, 110 buforowanie plików, 12 C CACHE MANIFEST, 105 CDN, Content Delivery Network, 103 cena akcji spóäki, 136, 138 chmura Amazon EC2, 62 ciñg Fibonacciego, 34 cookie, 71 Crockford Douglas, 16 czas äadowania strony, 49 czas wykonania operacji, 21 D dane formularza, 148 obrazu PNG, 94 oprogramowania Gmail, 134 157 A adres URL gniazda WWW, 135 adresowanie elementów, 55 Ajax, Asynchronous JavaScript and XML, 30 aktualizowanie magazynu, 90 aktualizowanie pliku manifestu, 106 aktywny plik manifestu, 105 akumulator, 40 algebra tablic, 37 algorytm MD5, 80 SHA1, 80 Android, 69 aplety Java, 14 aplikacja ARIA, 145 WAI-ARIA, 145 aplikacje internetowe, 14 uruchamiane w przeglñdarce, 14 ARIA, Accessible Rich Internet Applications, 145 arkusz stylów qunit, 50 asercje, 56 atak XSS, 86 atrybut itemprop, 146 atrybut role, 145 atrybuty HTML, 147 B baza danych CouchDB, 85 Gears SQLite, 72 interfejsu IndexedDB, 88 debugger Venkman, 16 Weinre, 16 debugowanie kodu JavaScript, 16, 127 plików manifestu, 109 deklaracja manifestu HTML, 104 Developer Tools, 74 dodatek Firebug, 16, 74, 95 FireRainbow, 155 Flash, 93 jStore, 84 Speed Tracer, 156 dodawanie magazynu danych, 87 wäaĈciwoĈci, 32 DOM, Document Object Model, 11 domkniöcie, 21, 24 domkniöcie w przycisku, 25 dostarczanie treĈci, 103 dostöp do bazy, 86 do dysku, 20 do funkcji, 24 do modelu DOM, 115 do obiektów magazynowania, 75 do obiektu localStorage, 73 do plików, 104 do serwera, 133 do systemu plików, 93, 101 do wñtków roboczych, 115 DSt, 83 dwukierunkowy kanaä danych, 134 dziaäania, 56 E Eclipse, 155 edytowanie localStorage, 75 obiektu magazynowania, 74 sessionStorage, 75 efekty uboczne, 27 158 _ Skorowidz element canvas, 13, 149 dokument, 55 identyfikator, 55 iframe, 127 nazwa, 55 selektor CSS, 55 tablicy, 37 tekst odsyäacza, 55 wyraĔenie XPath, 55 emulowanie gniazd WWW, 135 F farma testowania, 69 Firebug, 16, 74, 95 Firefox, 111 Flash Storage, 83 format JSON, 30, 74, 137 pliku manifestu, 105 SVG, 149 UTF-8, 139 formularz klasyczny, 147 fraktal, 120 funkcja Array(), 28 buildMaster(), 123 deepEqual(), 50 factory(), 25 filter(), 28 handleButtonClick(), 47 isDuplicate(), 92 notDeepEqual(), 50 notEqual(), 50 notStrictEqual(), 50 raises(), 50 setTimeout(), 50 square(), 22 strictEqual(), 50 tickerUpdate(), 138 transaction.abort(), 89 transaction.done(), 89 WaitForElementPresent(), 64 funkcje anonimowe, 22 asercji, 49 lambda, 37 mieszajñce, 80 uruchamiania, 128 wewnötrzne, 24 wyĔszego rzödu, 28 zewnötrzne, 24 G Gears, 13 geolokacja, 116, 150 gniazdo TCP/IP, 134 WWW, 13, 134 GWT, Google Web Toolkit, 17 H HTTP, Hypertext Transfer Protocol, 13 I identyfikator mechanizmu ETag, 80 instancja obiektu, 32 instrukcja API, 12, 62 API FileSystem, 101 API geolokacji, 150 biblioteki DSt, 83 biblioteki jQuery, 28 BlobBuilder, 94 dla gniazd WWW, 135 FileReader, 96 gniazd WWW, 135, 138 IndexedDB, 12, 73, 85, 90 JSON, 118 function, 22 if, 22 return, 27 instrukcje waitFor, 52 inteligentny telefon, smartphone, 14 interfejs localStorage, 85 MozBlobBuilder, 94 REST, 61 uĔytkownika, 54 WebKitBlobBuilder, 94 XHR2, 97 XMLHttpRequest, 97, 118 zdarzenia magazynowania, 74 iOS, 69 J jözyk C, 13 C++, 13 CoffeeScript, 156 C#, 62 Erlang, 27, 138, 142 F#, 27 Haskell, 27, 36 HTML5, 11 Java, 13, 62, 138 JavaScript, 12, 15 Lisp, 23 Perl, 23, 62 PHP, 20, 62, 137 Python, 23, 62 Rhino, 156 Ruby, 23, 62, 138 Scala, 27 Selenese, 64 jözyki funkcjonalne, 140 poleceþ, 54 .NET/CLR, 138 jStore, 83 K klasa PHPUnit_ Extensions_SeleniumTestCase, 61 klient z gniazdem, 137 klucz gäówny, 91 magazynu, 78 obiektu, 86 Skorowidz _ 159 kolejka zapisu, 81 komunikacja z wñtkiem, 119 konfigurowanie pakietu QUnit, 47 konsorcjum W3C, 85 konstruktor MozWebSockets, 135 kontrola przepäywu, 55 L liczba wykonanych testów, 66 Ĕñdaþ Ajax, 134 limit czasu oczekiwania, 50 lista domkniötych zmiennych, 26 pozycji dozwolonych, 110 Ĥ äadowanie listy plików, 106 äadowanie zestawu plików, 103 äadunek Ajax, 97 äaþcuch prototypów, 31 äaþcuch UTF-8, 136 äaþcuchy, 31 M magazyn danych, 87 obiektów, 88 magazynowanie lokalne danych, 72 magazynowanie obiektów binarnych, 101 manifest, 103 manifest HTML5, 104 sekcja FALLBACK, 105 sekcja NETWORK, 105 mapy, 116 mechanizm ETag, 79 localStorage, 73 magazynowania, 85 menedĔer NPM, 138 160 _ Skorowidz metoda $.decode(), 132 $.encode(), 132 $.get(), 132 $.post(), 132 $this- getText(), 64 $this- getXpathCount(), 65 $this- isElementPresent(), 64 $this- isTextPresent(), 64 alert(), 21 BlobBuilder.getBlob(), 94 close(), 118 confirm(), 21 console.info(), 123 createObjectURL(), 95 deleteEach(), 92 DSt.recall(), 83 DSt.store(), 83 DSt.store_form(), 83 equal(), 49 every(), 40 filter(), 39 FormData.append(), 97 Function.defer(), 81 get, 91 getCurrentPosition(), 150 getEval(), 65 getItem(), 75 importScripts(), 118 index(), 90 map(), 38 mozSlice(), 95 ok(), 50 onmessage(), 117 openCursor, 91 populate(), 32 postMessage(), 117, 128 prompt(), 21 reduce(), 40 reduceRight(), 40 remove(), 92 removeItem(), 75 revokeBlobURL(), 95 setInterval(), 36, 118 setTimeout(), 36, 118 slice(), 95 socket.close(), 136 socket.onclose(), 136 socket.onopen(), 136 socket.send(), 136 some(), 40 store.doConditionalLoad(), 81 string.indexOf(), 31 string.lastIndexOf(), 31 string.match(), 31 string.replace(), 31 string.slice(), 31 string.split(), 31 then(), 91 transaction.done(), 89 webkitSlice(), 95 metody iteracji, 37 okien, 21 uruchamiania testów, 52 mikrodane, 146 model DOM, 13 model wieloprocesorowy, 138 modyfikowanie opcji testowania, 61 N nagäówek If-None-Match, 79, 81 nagäówki gniazda, 139 narzödzie ClojureScript, 156 DevTools, 26 Gmail, 93 GWT, 17 JSBeautifier, 154 JSLint, 19, 153 JSMin, 154 PhoneGap, 14 Selenium Grid, 62 YSlow, 155 narzut, 135 NoSQL, 12 O obiekt Array.prototype, 40, 42 ArrayBuffer, 96 blob, 94, 97 DataStore, 21 do zapisu stanu, 77 Ext.data.JsonStore, 78 Ext.data.PreloadStore, 79 File, 95 FileList, 95 FileReader, 96 FormData, 97, 99 Function.prototype, 33 localStorage, 17, 72 location, 118 nasäuchujñcy, 98 navigator, 118 Number.prototype, 33 Object.prototype, 42 poäñczenia, 138 self, 118 sessionStorage, 73 String.prototype, 31 transakcji, 88 URL, 94 WebSocket, 135 window.applicationCache, 108 Worker, 117 XHR, 21, 30 XMLHttpRequest, 99 obsäuga czcionek internetowych, 151 dĒwiöku i wideo, 149 gniazd WWW, 135 grafiki w HTML5, 116 odchylenie standardowe, 40 okno profilu niestandardowego, 111 opakowanie, wrapper, 14 opcje odczytu danych FileReader.readAsArrayBuffer(), 96 FileReader.readAsBinaryString(), 96 FileReader.readAsText(), 96 FileReader.readDataAsURL(), 96 Skorowidz _ 161 opcje przeglñdarki Firefox, 111 Opera Dragonfly, 16 operacje programowanie funkcyjne, 27 sterowane zdarzeniami, 20 protokóä gniazd WWW, 139 HTTP, 13, 135 SSL, 135 prototyp, 31 Function, 36 Number, 33 przechowywanie danych, 12, 15 przechwytywacz, 33 przeciñganie plików, 93, 98 przetwarzanie danych mapy, 116 elementów kolejki, 82 w chmurze, 62 przeznaczenie witryny, 14 QUnit, 47 Q R rejestrowanie dziaäaþ w przeglñdarce, 58 rekurencja, 35 rekurencja listy, 29 relacyjna baza danych, 88 rozszerzanie funkcji, 33 prototypów, 32 rozszerzenia typów podstawowych, 32 rozszerzenie Firebug, 16, 26 Gears, 13 rozwijanie, currying, 36 rozwijanie obiektu, 41 S selektor XPath, 65 selektory CSS, 150 Selenese, 54 Selenium, 50 blokujñce, 21 nieblokujñce, 21 wejĈcia-wyjĈcia, 20 operator ==, 50 ===, 50 tablicowy, 99 oprogramowanie Gears, 104 otwarte Ĕñdanie HTTP, 134 P panel administracyjny witryny, 146 panel Ĉrodowiska IDE, 58 para klucz wartoĈè, 88 parametr unlimitedStorage, 101 pasek postöpu, 101 pötla for, 39 pötla zdarzeþ, 113 ping, 15, 72 plik HTML, 61 JAR, 68 Java, 61 konfiguracyjny, 104 manifestu, 104, 105 phpunit.xml, 61 seleneseTest.html, 62 archiwum, 98 pobieranie danych, 91 pole wysyäania pliku, 95 polecenia pakietu Selenium, 56 polecenie assertElementPresent, 57 clickAndWait, 57 verifyElementPresent, 57 waitForElementPresent, 57 poäñczenie gniazda z serwerem, 136 poäoĔenie elementu, 54 port domyĈlny, 69 procedura obsäugi clickHandler, 25 program seleniumrc, 61 162 _ Skorowidz serwer Node.js, 138, 156 RC, 62, 68 seleniumrc, 51 WWW, 14 WWW Erlang Yaws, 140 Yaws, 138 z gniazdami, 138 skäadowa statyczna $browsers, 61 skrypt pakietu Selenium, 52 säowo kluczowe lambda, 23 sprawdzanie plików, 106 standard ECMAScript 5, 118 standard XML, 149 sterownik systemu Android, 69 sterownik urzñdzenia iPhone, 69 Subversion, 106 suma kontrolna MD5, 106 SVG, Scalable Vector Graphics, 149 system kontroli wersji, 106 system plików, 101 szablon, 31 szybkoĈè transmisji, 72 Ļ ĈcieĔki do plików, 42 Ĉledzenie stosu, 23 Ĉrednia kroczñca, 38 Ĉrodowisko Aptana, 155 Emacs JS2 mode, 155 IDE, 51, 58 Java, 68 narzödziowe Xcode, 69 PHP, 65 PHPUnit, 59 piaskownicy, 14, 101 wñtków roboczych, 117 xUnit, 52 T tablica tools, 25 tablice, 37 technologia Ajax, 11, 13, 135 Flash, 135 Web Workers, 12, 30, 114, 127 terminal VT320, 15 test integracji, 45 test jednostkowy, 45 testowania po stronie serwera, 63 testowanie przeglñdarek, 68 tytuäu, 63 wñtków roboczych, 127 testy akceptacji, 45 integracji, 44 jednostkowe, 44 QUnit, 47 Selenium, 50 transakcja jawna, 89 tryb bez poäñczenia, 81 tryb z poäñczeniem, 82 tworzenie bazy danych, 88 generatora funkcji, 24 grafiki, 149 indeksu, 87, 90 kodu Java, 17 magazynu lokalnego, 72 wywoäania Ajax, 20 typ MIME, 104 typy podstawowe, 30 typy testów, 45 U upuszczanie pliku, 98 uruchamianie testów, 61 testów QUnit, 66 pakietu Selenium, 63 usuwanie danych, 92 indeksu, 87 Skorowidz _ 163 uzyskiwanie jednego wiersza, 91 wszystkich wierszy, 92 zakresu wierszy, 91 uĔycie danych z pliku, 93 W wartoĈè this, 27 undefined, 27, 42 void, 96 warunek bäödu, 50 wñtek gäówny, 120 roboczy, 114, 118 roboczy Web Worker, 21 WebKit, 16, 72 Weinre, WEb INspector REmote, 16 wersja magazynu, 90 wielkoĈè obiektu localStorage, 74 wielkoĈè wysyäanych plików, 96 witryna GitHub, 50, 138 Mozilla Developer Network, 31 O’Reilly Answers, 19 StackOverflow, 19 wäaĈciwoĈè $seleneseDirectory, 62 wäñczanie buforu aplikacji, 110 wskaĒnik Licznik, 144 wskaĒnik postöpu, 143, 144 wtyczka goto_sel_ide.js, 55 wyciek pamiöci, 55 wyniki testów, 66 wynoszenie, hoisting, 22 wyraĔenia lambda, 23 wyraĔenie funkcji, 23 wyraĔenie XPath, 53 wysyäanie plików, 97 wyszukiwanie sterowane gäosem, 147 wyszukiwarka trasy, 116 wywoäanie Ajax, 20 wywoäanie zwrotne, 20 wzajemne wykluczanie, mutex, 115 wzorce plików, 105 164 _ Skorowidz Z zablokowanie interfejsu, 21 zapisywanie stanu, 17 zapytania, 64 zarzñdzanie kolejkñ zadaþ, 126 zasiög leksykalny, 24 zbiór Mandelbrota, 123 zdarzenie beforeload, 81 cached, 108 checking, 108 click, 57 downloading, 108 drop, 98 error, 109 magazynowania, 74 message, 118 mouseDown, 57 mouseUp, 57 noupdate, 108 oncomplete, 97 onprogress, 97 progress, 108 webkitspeechchange, 147 zmiana danych, 80 zmienna leksykalna, 24 znacznik audio , 149 canvas , 116, 122 div , 47, 49 hr , 145 img , 145 input type= text , 147 li , 145 meter , 144 progress , 143 script , 118 span , 145 svg , 116 video , 116, 149 img, 28 speech, 147 znaczniki mikrodanych, 146 znak #, 105 ś Ĕñdanie DELETE, 105 GET, 79, 105 POST, 105 PUT, 105 Ĕñdanie Ajax, 21 Ĕñdanie ICMP, 15 Skorowidz _ 165 166 _ Skorowidz
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

HTML5. Programowanie aplikacji
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: