" Kup książkę " Księgarnia internetowa " Poleć książkę " Lubię to! Nasza społeczność " Oceń książkę Spis tre ci Przedmowa ................................................................................................. 7 1. Sie WWW jako platforma aplikacji ..............................................11 Zwi kszanie mo liwo ci aplikacji internetowych 12 Projektowanie aplikacji internetowych 13 Triumf j zyka JavaScript 15 2. Mo liwo ci j zyka JavaScript ....................................................... 19 Nieblokuj ce operacje wej cia-wyj cia i wywo ania zwrotne 20 Funkcje lambda oferuj du e mo liwo ci 22 Domkni cia 24 Programowanie funkcyjne 27 Prototypy i sposób rozszerzania obiektów 30 Rozszerzanie funkcji przy u yciu prototypów 33 Rozwijanie i parametry obiektów 36 Operacje iteracji dotycz ce tablicy 37 Obiekty równie mog by rozwijane 41 3. Testowanie aplikacji JavaScript ....................................................43 QUnit 47 Selenium 50 4. Lokalne magazynowanie danych ................................................. 71 Obiekty localStorage i sessionStorage 73 Dodatki biblioteki jQuery 82 3 Poleć książkę Kup książkę 5. Interfejs IndexedDB .......................................................................85 Dodawanie i aktualizowanie rekordów 89 Dodawanie indeksów 90 Pobieranie danych 91 Usuwanie danych 92 6. Pliki .................................................................................................93 Obiekty blob 94 Praca z plikami 95 Wysy anie plików 97 Przeci ganie i upuszczanie 98 Po czenie wszystkiego ze sob 99 System plików 101 7. Praca w trybie bez po czenia .................................................... 103 Plik manifestu wprowadzenie 104 Zdarzenia 108 Debugowanie plików manifestu 109 8. Podzia pracy za pomoc technologii Web Workers ...................113 Przypadki zastosowania w tku roboczego Web Worker 115 Zastosowanie technologii Web Workers 117 Przyk ad fraktala bazuj cego na w tku roboczym 119 Testowanie i debugowanie w tków roboczych Web Worker 127 Wzorzec ponownego wykorzystania przetwarzania wielow tkowego 127 Biblioteki dla technologii Web Workers 132 9. Gniazda WWW ............................................................................ 133 Interfejs gniazd WWW 135 Konfigurowanie gniazda WWW 136 Przyk ad gniazda WWW 136 Protokó gniazd WWW 139 4 Spis tre ci Poleć książkę Kup książkę 10. Nowe znaczniki ........................................................................... 143 Znaczniki dla aplikacji 143 U atwienie dost pu za pomoc aplikacji WAI-ARIA 145 Mikrodane 146 Nowe typy formularzy 147 D wi k i wideo 149 Element canvas i format SVG 149 Geolokacja 150 Nowy kod CSS 150 A Narz dzia JavaScript, które warto zna ..................................... 153 Skorowidz ............................................................................................... 157 Spis tre ci 5 Poleć książkę Kup książkę 6 Spis tre ci Poleć książkę Kup książkę 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę Przyk ad 4.3. Przegl darka obiektów magazynowania (function createLocalStorageViewer() { $('
').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 "
\n".populate(line) + "
Usu klucz
" + "
{key}
{value}
".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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę } }, // ************************************************************ // 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę }, 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę "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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę 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 Poleć książkę Kup książkę Skorowidz MongoDB, 85 A NoSQL, 85 SQLite, 72 adres URL gniazda WWW, 135 bezpiecze stwo danych, 86 adresowanie elementów, 55 biblioteka Ajax, Asynchronous JavaScript DSt, 83 and XML, 30 Event Machine, 140 aktualizowanie magazynu, 90 ExtJS, 17, 77 aktualizowanie pliku manifestu, 106 jQuery, 14, 16 aktywny plik manifestu, 105 jQuery Hive, 132 akumulator, 40 PollenJS, 132 algebra tablic, 37 socket.io, 135 algorytm Symfony Yaml Library, 106 MD5, 80 b dy w w tku roboczym, 127 SHA1, 80 bufor aplikacji, 110 Android, 69 buforowanie plików, 12 aplety Java, 14 aplikacja ARIA, 145 C WAI-ARIA, 145 aplikacje CACHE MANIFEST, 105 internetowe, 14 CDN, Content Delivery Network, 103 uruchamiane w przegl darce, 14 cena akcji spó ki, 136, 138 ARIA, Accessible Rich Internet chmura Amazon EC2, 62 Applications, 145 ci g Fibonacciego, 34 arkusz stylów qunit, 50 cookie, 71 asercje, 56 Crockford Douglas, 16 atak XSS, 86 czas adowania strony, 49 atrybut itemprop, 146 czas wykonania operacji, 21 atrybut role, 145 atrybuty HTML, 147 D B dane formularza, 148 baza danych obrazu PNG, 94 CouchDB, 85 oprogramowania Gmail, 134 Gears SQLite, 72 interfejsu IndexedDB, 88 157 Poleć książkę Kup książkę debugger element Venkman, 16 canvas, 13, 149 Weinre, 16 dokument, 55 debugowanie identyfikator, 55 kodu JavaScript, 16, 127 iframe, 127 plików manifestu, 109 nazwa, 55 deklaracja manifestu HTML, 104 selektor CSS, 55 Developer Tools, 74 tablicy, 37 dodatek tekst odsy acza, 55 Firebug, 16, 74, 95 wyra enie XPath, 55 FireRainbow, 155 emulowanie gniazd WWW, 135 Flash, 93 jStore, 84 F Speed Tracer, 156 dodawanie farma testowania, 69 magazynu danych, 87 Firebug, 16, 74, 95 w a ciwo ci, 32 Firefox, 111 DOM, Document Object Model, 11 Flash Storage, 83 domkni cie, 21, 24 format domkni cie w przycisku, 25 JSON, 30, 74, 137 dostarczanie tre ci, 103 pliku manifestu, 105 dost p SVG, 149 do bazy, 86 UTF-8, 139 do dysku, 20 formularz klasyczny, 147 do funkcji, 24 fraktal, 120 do modelu DOM, 115 funkcja do obiektów magazynowania, 75 Array(), 28 do obiektu localStorage, 73 buildMaster(), 123 do plików, 104 deepEqual(), 50 do serwera, 133 factory(), 25 do systemu plików, 93, 101 filter(), 28 do w tków roboczych, 115 handleButtonClick(), 47 DSt, 83 isDuplicate(), 92 dwukierunkowy kana danych, 134 notDeepEqual(), 50 dzia ania, 56 notEqual(), 50 notStrictEqual(), 50 raises(), 50 E setTimeout(), 50 Eclipse, 155 square(), 22 edytowanie strictEqual(), 50 localStorage, 75 tickerUpdate(), 138 obiektu magazynowania, 74 transaction.abort(), 89 sessionStorage, 75 transaction.done(), 89 efekty uboczne, 27 WaitForElementPresent(), 64 158 Skorowidz Poleć książkę Kup książkę funkcje localStorage, 85 anonimowe, 22 MozBlobBuilder, 94 asercji, 49 REST, 61 lambda, 37 u ytkownika, 54 mieszaj ce, 80 WebKitBlobBuilder, 94 uruchamiania, 128 XHR2, 97 wewn trzne, 24 XMLHttpRequest, 97, 118 wy szego rz du, 28 zdarzenia magazynowania, 74 zewn trzne, 24 iOS, 69 G J j zyk Gears, 13 C, 13 geolokacja, 116, 150 C++, 13 gniazdo CoffeeScript, 156 TCP/IP, 134 C#, 62 WWW, 13, 134 Erlang, 27, 138, 142 GWT, Google Web Toolkit, 17 F#, 27 Haskell, 27, 36 H HTML5, 11 Java, 13, 62, 138 HTTP, Hypertext Transfer Protocol, 13 JavaScript, 12, 15 Lisp, 23 Perl, 23, 62 I PHP, 20, 62, 137 identyfikator mechanizmu ETag, 80 Python, 23, 62 instancja obiektu, 32 Rhino, 156 instrukcja Ruby, 23, 62, 138 function, 22 Scala, 27 if, 22 Selenese, 64 j zyki return, 27 funkcjonalne, 140 instrukcje waitFor, 52 polece , 54 inteligentny telefon, smartphone, 14 .NET/CLR, 138 interfejs jStore, 83 API, 12, 62 API FileSystem, 101 API geolokacji, 150 K biblioteki DSt, 83 biblioteki jQuery, 28 klasa PHPUnit_ BlobBuilder, 94 Extensions_SeleniumTestCase, 61 dla gniazd WWW, 135 klient z gniazdem, 137 FileReader, 96 klucz gniazd WWW, 135, 138 g ówny, 91 IndexedDB, 12, 73, 85, 90 magazynu, 78 JSON, 118 obiektu, 86 Skorowidz 159 Poleć książkę Kup książkę kolejka zapisu, 81 metoda komunikacja z w tkiem, 119 $.decode(), 132 konfigurowanie pakietu QUnit, 47 $.encode(), 132 konsorcjum W3C, 85 $.get(), 132 konstruktor MozWebSockets, 135 $.post(), 132 kontrola przep ywu, 55 $this->getText(), 64 $this->getXpathCount(), 65 $this->isElementPresent(), 64 L $this->isTextPresent(), 64 alert(), 21 liczba BlobBuilder.getBlob(), 94 wykonanych testów, 66 close(), 118 da Ajax, 134 confirm(), 21 limit czasu oczekiwania, 50 console.info(), 123 lista createObjectURL(), 95 domkni tych zmiennych, 26 deleteEach(), 92 pozycji dozwolonych, 110 DSt.recall(), 83 DSt.store(), 83
DSt.store_form(), 83 equal(), 49 adowanie listy plików, 106 every(), 40 adowanie zestawu plików, 103 filter(), 39 adunek Ajax, 97 FormData.append(), 97 a cuch prototypów, 31 Function.defer(), 81 a cuch UTF-8, 136 get, 91 a cuchy, 31 getCurrentPosition(), 150 getEval(), 65 getItem(), 75 M importScripts(), 118 magazyn index(), 90 danych, 87 map(), 38 obiektów, 88 mozSlice(), 95 magazynowanie lokalne danych, 72 ok(), 50 magazynowanie obiektów binarnych, 101 onmessage(), 117 manifest, 103 openCursor, 91 manifest HTML5, 104 populate(), 32 sekcja FALLBACK, 105 postMessage(), 117, 128 sekcja NETWORK, 105 prompt(), 21 mapy, 116 reduce(), 40 mechanizm reduceRight(), 40 ETag, 79 remove(), 92 localStorage, 73 removeItem(), 75 magazynowania, 85 revokeBlobURL(), 95 mened er NPM, 138 setInterval(), 36, 118 setTimeout(), 36, 118 160 Skorowidz Poleć książkę Kup książkę slice(), 95 O socket.close(), 136 socket.onclose(), 136 obiekt socket.onopen(), 136 Array.prototype, 40, 42 socket.send(), 136 ArrayBuffer, 96 some(), 40 blob, 94, 97 store.doConditionalLoad(), 81 DataStore, 21 string.indexOf(), 31 do zapisu stanu, 77 string.lastIndexOf(), 31 Ext.data.JsonStore, 78 string.match(), 31 Ext.data.PreloadStore, 79 string.replace(), 31 File, 95 string.slice(), 31 FileList, 95 string.split(), 31 FileReader, 96 then(), 91 FormData, 97, 99 transaction.done(), 89 Function.prototype, 33 webkitSlice(), 95 localStorage, 17, 72 metody location, 118 iteracji, 37 nas uchuj cy, 98 okien, 21 navigator, 118 uruchamiania testów, 52 Number.prototype, 33 mikrodane, 146 Object.prototype, 42 model DOM, 13 po czenia, 138 model wieloprocesorowy, 138 self, 118 modyfikowanie opcji testowania, 61 sessionStorage, 73 String.prototype, 31 transakcji, 88 N URL, 94 WebSocket, 135 nag ówek If-None-Match, 79, 81 window.applicationCache, 108 nag ówki gniazda, 139 Worker, 117 narz dzie XHR, 21, 30 ClojureScript, 156 XMLHttpRequest, 99 DevTools, 26 obs uga Gmail, 93 czcionek internetowych, 151 GWT, 17 d wi ku i wideo, 149 JSBeautifier, 154 gniazd WWW, 135 JSLint, 19, 153 grafiki w HTML5, 116 JSMin, 154 odchylenie standardowe, 40 PhoneGap, 14 okno profilu niestandardowego, 111 Selenium Grid, 62 opakowanie, wrapper, 14 YSlow, 155 opcje odczytu danych narzut, 135 FileReader.readAsArrayBuffer(), 96 NoSQL, 12 FileReader.readAsBinaryString(), 96 FileReader.readAsText(), 96 FileReader.readDataAsURL(), 96 Skorowidz 161 Poleć książkę Kup książkę opcje przegl darki Firefox, 111 programowanie Opera Dragonfly, 16 funkcyjne, 27 operacje sterowane zdarzeniami, 20 blokuj ce, 21 protokó nieblokuj ce, 21 gniazd WWW, 139 wej cia-wyj cia, 20 HTTP, 13, 135 operator SSL, 135 ==, 50 prototyp, 31 ===, 50 Function, 36 tablicowy, 99 Number, 33 oprogramowanie Gears, 104 przechowywanie danych, 12, 15 otwarte danie HTTP, 134 przechwytywacz, 33 przeci ganie plików, 93, 98 przetwarzanie P danych mapy, 116 elementów kolejki, 82 panel administracyjny witryny, 146 w chmurze, 62 panel rodowiska IDE, 58 przeznaczenie witryny, 14 para klucz warto , 88 parametr unlimitedStorage, 101 pasek post pu, 101 Q p tla for, 39 p tla zdarze , 113 QUnit, 47 ping, 15, 72 plik R HTML, 61 JAR, 68 rejestrowanie dzia a w przegl darce, 58 Java, 61 rekurencja, 35 konfiguracyjny, 104 rekurencja listy, 29 manifestu, 104, 105 relacyjna baza danych, 88 phpunit.xml, 61 rozszerzanie seleneseTest.html, 62 funkcji, 33 archiwum, 98 prototypów, 32 pobieranie danych, 91 rozszerzenia typów podstawowych, 32 pole wysy ania pliku, 95 rozszerzenie polecenia pakietu Selenium, 56 Firebug, 16, 26 polecenie Gears, 13 assertElementPresent, 57 rozwijanie, currying, 36 clickAndWait, 57 rozwijanie obiektu, 41 verifyElementPresent, 57 waitForElementPresent, 57 S po czenie gniazda z serwerem, 136 po o enie elementu, 54 selektor XPath, 65 port domy lny, 69 selektory CSS, 150 procedura obs ugi clickHandler, 25 Selenese, 54 program seleniumrc, 61 Selenium, 50 162 Skorowidz Poleć książkę Kup książkę serwer technologia Node.js, 138, 156 Ajax, 11, 13, 135 RC, 62, 68 Flash, 135 seleniumrc, 51 Web Workers, 12, 30, 114, 127 WWW, 14 terminal VT320, 15 WWW Erlang Yaws, 140 test integracji, 45 Yaws, 138 test jednostkowy, 45 z gniazdami, 138 testowania po stronie serwera, 63 sk adowa statyczna $browsers, 61 testowanie skrypt pakietu Selenium, 52 przegl darek, 68 s owo kluczowe lambda, 23 tytu u, 63 sprawdzanie plików, 106 w tków roboczych, 127 standard ECMAScript 5, 118 testy standard XML, 149 akceptacji, 45 sterownik systemu Android, 69 integracji, 44 sterownik urz dzenia iPhone, 69 jednostkowe, 44 Subversion, 106 QUnit, 47 suma kontrolna MD5, 106 Selenium, 50 SVG, Scalable Vector Graphics, 149 transakcja jawna, 89 system kontroli wersji, 106 tryb bez po czenia, 81 system plików, 101 tryb z po czeniem, 82 szablon, 31 tworzenie szybko transmisji, 72 bazy danych, 88 generatora funkcji, 24 grafiki, 149
indeksu, 87, 90 kodu Java, 17 cie ki do plików, 42 magazynu lokalnego, 72 ledzenie stosu, 23 wywo ania Ajax, 20 rednia krocz ca, 38 typ MIME, 104 rodowisko typy podstawowe, 30 Aptana, 155 typy testów, 45 Emacs JS2 mode, 155 IDE, 51, 58 Java, 68 U narz dziowe Xcode, 69 PHP, 65 upuszczanie pliku, 98 PHPUnit, 59 uruchamianie piaskownicy, 14, 101 testów, 61 w tków roboczych, 117 testów QUnit, 66 xUnit, 52 pakietu Selenium, 63 usuwanie danych, 92 T indeksu, 87 tablica tools, 25 tablice, 37 Skorowidz 163 Poleć książkę Kup książkę uzyskiwanie Z jednego wiersza, 91 wszystkich wierszy, 92 zablokowanie interfejsu, 21 zakresu wierszy, 91 zapisywanie stanu, 17 u ycie danych z pliku, 93 zapytania, 64 zarz dzanie kolejk zada , 126 zasi g leksykalny, 24 W zbiór Mandelbrota, 123 zdarzenie warto beforeload, 81 this, 27 cached, 108 undefined, 27, 42 checking, 108 void, 96 click, 57 warunek b du, 50 downloading, 108 w tek drop, 98 g ówny, 120 error, 109 roboczy, 114, 118 magazynowania, 74 roboczy Web Worker, 21 message, 118 WebKit, 16, 72 mouseDown, 57 Weinre, WEb INspector REmote, 16 mouseUp, 57 wersja magazynu, 90 noupdate, 108 wielko obiektu localStorage, 74 oncomplete, 97 wielko wysy anych plików, 96 onprogress, 97 witryna progress, 108 GitHub, 50, 138 webkitspeechchange, 147 Mozilla Developer Network, 31 zmiana danych, 80 O Reilly Answers, 19 zmienna leksykalna, 24 StackOverflow, 19 znacznik w a ciwo $seleneseDirectory, 62