Računala Windows Internet

Lokalna pohrana. Za korištenje localStorage za JavaScript potrebna je lokalna pohrana kolačića

Kolačići koje smo analizirali u prethodnoj lekciji vrlo su ograničeni: jedan kolačić može imati samo 4096 znakova, a broj kolačića po domeni može biti oko 30-50, ovisno o pregledniku. Stoga, nažalost, tamo neće biti moguće pohraniti puno informacija. Upravo se tako dogodilo povijesno.

Kako bi se zaobišlo ovo ograničenje, u preglednicima se pojavila alternativa kolačićima - zove se lokalna pohrana. U lokalnoj pohrani možemo dulje vrijeme pohraniti 5-10 megabajta informacija ili čak više.

Rad s lokalnom pohranom

Objekt localStorage ugrađen u preglednik namijenjen je radu s lokalnom pohranom. Ima 4 lako razumljive metode. Evo ih:

// Pohrani vrijednost: localStorage.setItem ("Ključ", "Vrijednost"); // Dobivamo vrijednost: var value = localStorage.getItem ("Key"); // Uklanjanje vrijednosti: localStorage.removeItem ("Key"); // Obriši svu pohranu: localStorage.clear ();

S lokalna pohrana također možete raditi kao običan niz:

// Pohrani vrijednost: localStorage ["Key"] = "Vrijednost"; // Dobivamo vrijednost: var value = localStorage ["Key"]; // Izbriši vrijednost: delete localStorage ["Key"];

Osim objekta lokalna pohrana postoji i predmet sessionStorage... Rad s njim provodi se na isti način, jedina razlika je u tome što se svi podaci iz njega automatski uništavaju nakon zatvaranja preglednika ili kartice na web-mjestu. Pa, localStorage pohranjuje podatke dugo vremena dok ih skripta ne ukloni ili dok korisnik preglednika ne izbriše lokalnu pohranu koristeći postavke.

Primjeri

U sljedećem primjeru zapisat ćemo korisničko ime u lokalnu pohranu:

LocalStorage.setItem ("ime", "Ivan");

Nakon nekog vremena vratit ćemo ovo ime:

Upozorenje (localStorage.getItem ("name"));

Kao što vidite, ovdje nema ništa komplicirano, sve je puno jednostavnije od istog rada s kolačićima.

Spremanje objekata

Lokalna pohrana ne može pohraniti JavaScript objekte i nizove, iako je to često zgodno. Ali postoji način - trebate serijalizirati ove podatke u JSON format - dobivate niz koji se već može pohraniti u localStorage. Zatim, kada trebamo vratiti ovaj objekt - pretvoriti string iz JSON natrag u objekt - i koristiti ga mirno.

Pogledajmo ovaj proces na primjeru. Serijalizirajte objekt i spremite ga u lokalnu pohranu:

// Zadan objekt: var obj = (ime: "Ivan", arr :); // Serijaliziraj ga u "(" name ":" Ivan "," arr ":)": var json = JSON.stringify (obj); // Pišite u localStorage s ključem obj: localStorage.setItem ("obj", json);

Nakon nekog vremena vraćamo objekt:

// Vratite podatke iz localStorage kao JSON: var json = localStorage.getItem ("obj"); // Pretvorite ih natrag u JavaScript objekt: var obj = JSON.parse (json); console.log (obj);

Dodatne mogućnosti

Određivanje broja zapisa u pohrani: upozorenje (localStorage.length).

Određivanje naziva ključa po njegovom broju: alert (localStorage.key (broj)).

Prilikom izvođenja operacija s pohranom, događaj se pokreće na skladištu... Ako vežete funkciju na ovaj događaj, tada će u njemu biti dostupan objekt Event sa sljedećim svojstvima:

funkcija funkcija (događaj) (var ključ = event.key; // ključ podataka koji se mijenjaju var oldValue = event.oldValue; // stara vrijednost var newValue = event.newValue; // nova vrijednost var storageArea = event.storageArea; // Područje skladištenja )

Dodati. materijal

Pohranjivanje niza u lokalnu pohranu: https://youtu.be/sYUILPMnrIo

Što učiniti sljedeće:

Zadatke počnite rješavati na sljedećoj poveznici: zadaci za lekciju.

Kada ste sve odlučili, prijeđite na proučavanje nove teme.

Neki videozapisi mogu biti u tijeku jer nismo prošli cijeli ES6 do ove točke u vodiču. Samo preskočite ove videozapise, pogledajte ih kasnije.

Pregled web pohrane

Na internetu se informacije mogu pohraniti na dva mjesta: na web poslužitelju i na web klijentu (tj. računalu posjetitelja stranice). Određene vrste podataka najbolje je pohraniti na jednom od ovih mjesta, a druge vrste na drugom.

Pravo mjesto za pohranu osjetljivih i važnih podataka je web poslužitelj. Na primjer, ako dodate artikle u košaricu u internetskoj trgovini, vaši potencijalni podaci o kupnji pohranjuju se na web poslužitelju. Na vašem je računalu pohranjeno samo nekoliko bajtova podataka o praćenju koji sadrže podatke o vama (točnije o vašem računalu) tako da web poslužitelj zna koji je segment vaš. Čak i uz nove mogućnosti HTML5, nema potrebe mijenjati ovaj sustav – pouzdan je, siguran i učinkovit.

Ali pohranjivanje podataka na poslužitelju nije uvijek najbolji pristup. ponekad je lakše pohraniti nebitne informacije na računalo korisnika. Na primjer, ima smisla pohraniti korisničke postavke (recimo, postavke koje određuju kako će se web stranica prikazati) i stanje aplikacije (snimka trenutnog stanja web aplikacije) lokalno kako bi posjetitelj mogao nastaviti s mjesta na kojem je bio kasnije vrijeme.

Prije HTML5, jedini način za lokalno pohranjivanje podataka bio je korištenje mehanizma datoteka kolačići koji je izvorno dizajniran za razmjenu malih količina identifikacijskih informacija između web poslužitelja i preglednika. Kolačići su idealni za pohranu male količine podataka, ali JavaScript model za rad s njima je pomalo nezgrapan. Sustav kolačića također prisiljava programera da se petlja s datumima isteka i beskorisno šalje podatke naprijed-natrag putem interneta sa svakim zahtjevom stranice.

HTML5 uvodi bolju alternativu kolačićima, što olakšava i jednostavno pohranjivanje informacija na računalo posjetitelja. Ove informacije mogu biti pohranjene na klijentskom računalu na neodređeno vrijeme, ne šalju se na web poslužitelj (osim ako to ne radi sam programer), mogu biti velike i zahtijevaju samo nekoliko jednostavnih, učinkovitih JavaScript objekata za rad.

Ova prilika se zove web pohrana a posebno je prikladan za korištenje sa izvanmrežni način rada rad web stranica, jer omogućuje vam stvaranje samostalnih aplikacija koje mogu spremiti sve potrebne informacije čak i kada nema internetske veze.

Funkcija HTML5 web pohrane omogućuje web stranici pohranjivanje podataka na računalu posjetitelja. Ove informacije mogu biti kratkoročne, koje se brišu nakon isključivanja preglednika, ili dugoročne, koje ostaju dostupne pri sljedećim posjetima web stranici.

Podaci pohranjeni u web pohrani zapravo se ne pohranjuju na Internetu, već na računalu posjetitelja web stranice. Drugim riječima, web pohrana ne znači pohranjivanje podataka na Internetu, već pohranjivanje podataka s Interneta.

Postoje dvije vrste web pohrane koje su nekako povezane s dva objekta:

Lokalna pohrana

Koristi objekt lokalna pohrana za trajno pohranjivanje podataka za cijelu web stranicu. To znači da ako web stranica sprema podatke u lokalnu pohranu, ti će podaci biti dostupni korisniku kada se vrati na tu web stranicu sljedećeg dana, sljedećeg tjedna ili sljedeće godine.

Naravno, većina preglednika korisniku također nudi mogućnost brisanja lokalne pohrane. U nekim se preglednicima implementira kao strategija sve ili ništa i briše sve lokalne podatke, slično kao što se briše kolačić. (Zapravo, u nekim preglednicima kolačići i lokalna pohrana su međusobno povezani, tako da je jedini način za brisanje lokalnih podataka brisanje kolačića.) Drugi preglednici mogu pružiti korisniku mogućnost pregleda podataka za svaku pojedinačnu web stranicu i brisanja podataka za odabrano mjesto ili mjesta.

Skladište podataka o sesiji

Koristi objekt sessionStorage za privremenu pohranu podataka za jedan prozor ili karticu preglednika. Ti su podaci dostupni samo dok korisnik ne zatvori prozor ili karticu, nakon čega se sesija završava i podaci se brišu. No podaci o sesiji ostaju i dalje ako korisnik prijeđe na drugu web stranicu, a zatim se vrati, pod uvjetom da se to dogodi u istom prozoru preglednika.

Sa stajališta koda web stranice, i lokalna pohrana i pohrana podataka sesije rade potpuno isto. Jedina razlika je u trajanju pohrane podataka.

Korištenje lokalne pohrane omogućuje najbolja prilika za spremanje potrebnih podataka za naknadne posjete web stranici od strane korisnika. A pohrana sesije se koristi za pohranu podataka koje je potrebno prenijeti s jedne stranice na drugu. (Spremište sesija također može pohraniti privremene podatke koje koristi samo jedna stranica, ali obične JavaScript varijable rade sasvim dobro u tu svrhu.)

I lokalna pohrana i pohrana sesije povezani su s domenom web-mjesta. Dakle, ako podatke za www..html stranicu spremite u lokalnu pohranu, ti će podaci biti dostupni za www..html stranicu, budući da obje ove stranice imaju istu domenu. Ali ti podaci neće biti dostupni za stranice drugih domena.

Osim toga, budući da web pohrana se nalazi na vašem računalu (ili mobilni uređaj) danog korisnika, povezana je s ovim računalom, a web stranica je otvorena na ovo računalo i pohranjivanja podataka u svoju lokalnu pohranu, nema pristup informacijama koje je pohranio na drugom računalu. Isto tako, web stranica stvara zasebnu lokalnu trgovinu ako se prijavite s drugim korisničkim imenom ili pokrenete drugi preglednik.

Iako HTML5 specifikacija ne postavlja nikakva čvrsta i brza pravila za maksimalnu pohranu, većina preglednika ograničava je na 5 MB. Možete spakirati puno podataka u ovaj volumen, ali to neće biti dovoljno ako želite koristiti lokalnu pohranu za optimizaciju performansi i predmemoriranje velikih slika ili videozapisa u njemu (a, istina, lokalna pohrana nije dizajnirana za takve svrhe ).

Standard baze podataka koji se još uvijek razvija za pohranjivanje velikih količina podataka IndexedDB Omogućuje mnogo više lokalne pohrane - obično 50 MB za početak i više ako se slažete.

Spremanje podataka

Prije nego što možete staviti dio informacije u lokalnu pohranu ili pohranu sesije, morate joj dati opisno ime. Taj se naziv naziva ključ i potreban je kako bi se podaci mogli dohvatiti u budućnosti.

Sintaksa za spremanje dijela podataka je sljedeća:

lokalna pohrana = podaci;

// JS localStorage ["username"] = "Ivan Petrov";

Naravno, nema smisla spremati dio statičkog teksta. U pravilu moramo pohraniti neku vrstu varijabilnih podataka, kao što je trenutni datum, rezultat matematičkog izračuna ili tekstualni podaci koje je korisnik unio u polja obrasca. Slijedi primjer pohranjivanja tekstualnih podataka koje je unio korisnik:

Web pohrana

Funkcija saveData () (// Dobijte vrijednosti tekstualnih okvira var localData = document.getElementById ("localData"). Vrijednost; var sessionData = document.getElementById ("sessionData"). Vrijednost; // Spremite uneseni tekst u tekstualni okvir u lokalnu pohranu localStorage ["localData"] = localData; // Spremite tekst upisan u tekstualno polje u pohranu sesije sessionStorage ["sessionData"] = sessionData;) funkcija loadData () (// Učitajte spremljeni podaci iz skladišta var localData = localStorage ["localData"]; var sessionData = sessionStorage ["sessionData"]; // Prikaži ove podatke u tekstualnim poljima if (localData! = null) (document.getElementById ("localData"). value). = localData;) if (sessionData! = null) (document.getElementById ("sessionData"). value = sessionData;))

Stranica sadrži dva tekstualna okvira: za lokalnu pohranu (gore) i za pohranu sesije (dolje). Klikom na gumb Spremi sprema se tekst upisan u tekstualna polja, a klikom na gumb Učitaj prikazuje se odgovarajući spremljeni podaci u poljima.

Web Storage također podržava manje uobičajenu sintaksu svojstava. Prema pravilima ove sintakse, mjesto pohrane pod nazivom korisničko ime nazivamo localStorage.username, a ne localStorage ["username"]. Obje vrste sintakse su ekvivalentne, a korištenje jedne ili druge je stvar osobnih preferencija.

Web pohrana neće raditi bez web poslužitelja

U svom istraživanju web-pohrane mogli biste naići na neočekivani problem. U mnogim preglednicima web pohrana radi samo za stranice koje pruža web poslužitelj. U ovom slučaju nije važno gdje se poslužitelj nalazi, na internetu ili na vlastitom računalu, najvažnije je da se stranice ne pokreću s lokalnog tvrdi disk(Na primjer, dvostruki klik ikonom datoteke stranice).

Ova značajka je nuspojava načina na koji preglednici dodjeljuju lokalni prostor za pohranu. Kao što je prethodno navedeno, preglednici ograničavaju lokalnu pohranu za svaku web stranicu na 5 MB povezujući svaku stranicu koja želi koristiti lokalnu pohranu s domenom web stranice.

Što se događa kada otvorite stranicu koja koristi web pohranu s vašeg lokalnog tvrdog diska? Sve ovisi o pregledniku. Preglednik Internet Explorerčini se da u potpunosti gubi podršku za web pohranu. Objekti localStorage i sessionStorage nestaju i pokušaj da ih se koristi izaziva JavaScript grešku.

V Firefox preglednik objekti localStorage i sessionStorage ostaju na mjestu i čini se da su podržani (čak i Modernizr otkriva da su podržani), ali sve što se pošalje u pohranu nestaje nitko ne zna gdje. V preglednik Chrome opet nešto drugačije - većina funkcionalnosti web pohrane radi kako bi trebala, ali neke značajke (na primjer, događaj onStorage) ne rade.

Slični problemi nastaju s File API-jem. Stoga ćete si uštedjeti mnogo gnjavaže ako stavite stranicu pod test na testni poslužitelj kako biste izbjegli sve ove nejasnoće.

Podrška preglednika za web pohranu

Web-pohrana je jedna od najpodržanijih značajki HTML5, s dobrom razinom podrške u svakom većem pregledniku. Tablica u nastavku prikazuje minimalne verzije glavnih preglednika koji podržavaju web pohranu:

Svi ovi preglednici pružaju mogućnost lokalnog pohranjivanja i pohrane sesije. Ali da bi se podržao događaj onStorage, potrebne su novije verzije preglednika, kao što su IE 9, Firefox 4 ili Chrome 6.

Najproblematičniji je IE 7, koji uopće ne podržava web pohranu. Kao zaobilazno rješenje, možete emulirati web pohranu pomoću kolačića. Ovo zapravo nije savršeno rješenje, ali djeluje. Iako ne postoji službena skripta koja bi zatvorila ovaj jaz, nekoliko dobrih polaznih točaka može se pronaći na stranici HTML5 Cross Browser (pod "Web Storage").

Prijevod članka: Kako koristiti lokalnu pohranu za JavaScript.
Sara Vieira.

Upoznavanje s osnovama JavaScript programiranja često počinje izradom najjednostavnijih aplikacija, poput elektroničke bilježnice, koju koristimo za bilježenje stvari i događaja na koje možemo zaboraviti. Ali takve aplikacije imaju jedan problem - nakon ponovnog učitavanja stranice, popis svih prethodno ostavljenih zapisa nestaje, odnosno aplikacija se vraća u prvobitno stanje.

Postoji vrlo jednostavan izlaz iz ove situacije korištenjem mehanizma localStorage. Zbog činjenice da nam localStorage omogućuje spremanje potrebnih podataka na računalo korisnika, gornji popis zakazanih zadataka i događaja i dalje će biti dostupan nakon ponovnog učitavanja stranice, osim toga, localStorage je iznenađujuće vrlo na jednostavan način pohranjivanje podataka i pristup po potrebi.

Što je localStorage?

To je lokalni mehanizam za pohranu koji je dio tehnologije Web Storage definirane HTML5 specifikacijom. Postoje dvije opcije pohrane koje dozvoljava ova specifikacija:

  • Lokalna pohrana: omogućuje spremanje podataka bez ograničenja u razdobljima pohrane. Koristit ćemo ovu opciju, budući da popis zadataka dostupnih u našem primjeru treba biti trajno pohranjen.
  • Korištenje sesija: osigurava sigurnost podataka samo za vrijeme jedne sesije, odnosno nakon što korisnik zatvori karticu naše aplikacije i ponovno je otvori, sve što je potrebno za daljnji rad podaci o aplikaciji bit će izbrisani.

Jednostavno rečeno, sve što Web Storage radi je pohranjivanje podataka u obrazac imenovani ključ/vrijednost lokalno i za razliku od druge dvije metode, od kojih svaka ima svoje nedostatke ( Skladištenje informacija u sesiji predviđa korištenje poslužiteljske strane za to, osim toga, nakon zatvaranja sesije korisnika, ti se podaci brišu, a iako se kolačići koriste za pohranu na strani klijenta, nisu pouzdani jer korisnik može otkazati svoju podršku putem postavke preglednika.) sprema podatke čak i ako ste zatvorili preglednik ili isključili računalo. ( * Uzeo sam slobodu malo izmijeniti i dopuniti sadržaj ovog odlomka, budući da smatram da je autor napravio netočnosti u originalu.)

HTML

Ako se držimo našeg primjera, u kojem želimo stvoriti elektroničku verziju bilježnica, u nastavku su sve potrebne komponente za njegovu implementaciju:

  • Polje za unos novih zapisa (događaji, slučajevi itd.).
  • Gumb za potvrdu unesenog unosa.
  • Gumb za brisanje već kreiranog popisa obaveza.
  • Neuređeni popis koji će biti popunjen novim unosima.
  • Konačno, trebamo div kao spremnik koji će sadržavati poruke koje će se prikazati korisniku, kao što je upozorenje da je zaboravio unijeti vrijednost za sljedeći zapis, ostavljajući polje za unos praznim.

Kao rezultat, naša bi oznaka trebala izgledati otprilike ovako:








Ovo je prilično standardni HTML predložak koji možemo ispuniti dinamički generiranim sadržajem pomoću JavaScripta.

JavaScript

Što se tiče strukture najjednostavnije aplikacije bilježnice u našem primjeru, prva stvar koju trebamo učiniti je osigurati da se prati događaj klika na gumb. "Dodaj bilješku" i provjerite da li je u tekstualno polje za snimanje unesena neka informacija, odnosno da u trenutku pritiska na tipku ne smije biti prazno. Nešto kao ovo:

$ ("# dodaj"). kliknite (funkcija () (
// ako je polje za tekst prazno
$ ("# upozorenje"). html (" Pažnja! Unesite unos u tekst
polje.");
vratiti false;
}

Evo što ćemo učiniti s ovim dijelom koda. Kada se pritisne tipka "Dodaj bilješku" provjeravamo je li korisnik nešto upisao u polje za novi unos... Ako to nije učinio, pojavljuje se div koji smo mi dali za prikaz poruka, koji obavještava korisnika da polje za unos zapisa nije popunjeno, a zatim, nakon 1000ms (1 sekunda), element div, i sukladno tome poruka, nestaje. Funkcija tada vraća false, nakon čega preglednik prestaje izvršavati ostatak skripte i aplikacija je ponovno spremna za unos novog zapisa.

Naš sljedeći korak je dodavanje vrijednosti unesene u polje za zapise na početak popisa generiranjem nove stavke popisa. Dakle, kada korisnik doda još jedan unos, on će uvijek biti stavljen na početak popisa obveza i očekivanih događaja. Nakon toga, sve što trebamo učiniti je spremiti popis pomoću mehanizma localStorage:

// Dodajte unos na postojeći popis
$ ("# zadataka"). prepend ("

  • "+ Opis +"
  • ");
    // Obrišite polje za unos
    $ ("# obrazac"). reset ();

    vratiti false;
    });

    Kao što ste možda primijetili, ovdje nema ničeg neobičnog, koristi se standardna verzija jQuery kod. U trenutku pristupa objektu localStorage, moramo specificirati podatke koje spremamo u obliku ključa/vrijednosti. Za ključ se može koristiti proizvoljno ime, a ja sam ga nazvao "todos", tada trebamo naznačiti što, zapravo, trebamo zadržati u sjećanju. U ovom slučaju, to je potpuni dio HTML oznake koji je uključen u neuređeni popis (koji se nalazi između oznaka) koji prikazuje sve prethodno unesene zapise od strane korisnika. Iz koda možete vidjeti da jednostavno dohvaćamo fragment koji nam je potreban pomoću metode jQuery .html () i na kraju, nakon dovršetka svih potrebnih radnji, postavljamo povratnu vrijednost funkcije na false, što sprječava oblik podatke od slanja i stoga ponovno učitavanje naše stranice.

    Sada, recimo, naš korisnik je prethodno napravio nekoliko unosa i za daljnji normalan rad aplikacije moramo provjeriti sadrži li localStorage podatke prethodno spremljene na računalu i, ako je tako, prikazati ih korisniku. Budući da je naziv našeg ključa "todos", moramo provjeriti njegovo postojanje na sljedeći način:

    // ako već postoje podaci u lokalnoj pohrani, onda ih prikaži

    }

    Za provjeru prisutnosti podataka koristili smo uobičajenu if naredbu i, kada je navedeni uvjet bio ispunjen, jednostavno smo dohvatili sve podatke iz lokalne memorije, stavljajući ih kao HTML oznaku unutar neuređenog popisa, uz pomoć kojeg Prikazuju se zapisi koje je korisnik ranije unio.

    Ako testirate svoju najjednostavniju aplikaciju, vidjet ćete da nakon ponovnog učitavanja stranice sve ostaje na svom mjestu. A sada, zadnje što nam preostaje je stvoriti funkciju s kojom bi korisnik, ako je potrebno, mogao izbrisati sve svoje zapise. To se postiže brisanjem localStorage i ponovnim učitavanjem stranice kako biste aktivirali napravljene promjene. Zatim, kao i u prethodnom slučaju, postavljamo false kao povratnu vrijednost funkcije, što sprječava pojavljivanje hasha u URL-u. ( * i ne pomiče stranicu prema gore.):

    // Potpuno čišćenje localStorage
    window.localStorage.clear ();
    location.reload ();
    vratiti false;
    });

    Rezultat je potpuno funkcionalna aplikacija. I sastavljajući sve gore navedene isječke zajedno, dobivamo potpuni kod aplikacije:

    $ ("# dodaj"). kliknite (funkcija () (
    var Opis = $ ("# opis"). val ();
    if ($ ("# opis"). val () == "") (
    $ ("# upozorenje"). html (" Pažnja! Unesite unos u
    polje za tekst.");
    $ ("# upozorenje"). fadeIn (). kašnjenje (1000) .fadeOut ();
    vratiti false;
    }
    $ ("# zadataka"). prepend ("

  • "
    + Opis + "
  • ");
    $ ("# obrazac"). reset ();
    var todos = $ ("# zadataka"). html ();
    localStorage.setItem ("todos", todos);
    vratiti false;
    });

    if (localStorage.getItem ("todos")) (
    $ ("# zadataka"). html (localStorage.getItem ("todos"));
    }

    $ ("# clear"). kliknite (funkcija () (
    window.localStorage.clear ();
    location.reload ();
    vratiti false;
    });

    Podrška za preglednik.

    HTML5 specifikacija pruža prilično snažnu podršku za tehnologiju Web Storagea, tako da je implementiraju i većina popularnih preglednika, čak i IE8. IE7 ostaje jedini problem ako vas to još uvijek zanima.

    Zaključak.

    U tako malim aplikacijama mehanizam localStorage može prilično uspješno zamijeniti korištenje baza podataka. Ne morate koristiti sofisticiranije alternative za pohranu malih količina podataka.

    * Bilješka prevoditelja.

    Broj pregleda: 475

    Prijevod: Vlad Merzhevich

    Trajna lokalna pohrana jedno je područje u kojem klijentske aplikacije iskorištavaju prednosti poslužiteljskih aplikacija. Za aplikacije poput operacijski sustav, pruža sloj apstrakcije za pohranu i dohvaćanje podataka kao što su postavke ili status izvršenja. Ove vrijednosti mogu biti pohranjene u registru, INI datotekama, XML datotekama ili drugdje, ovisno o principima platforme. Ako je vašoj klijentskoj aplikaciji potrebna lokalna pohrana za više od para ključ/vrijednost, možete umetnuti vlastitu bazu podataka, smisliti vlastiti format datoteke ili bilo koji broj drugih rješenja.

    Povijesno gledano, web aplikacije nisu imale nijedan od ovih luksuza. Kolačići su izumljeni rano u povijesti interneta i mogu se koristiti za trajno pohranjivanje malih količina podataka lokalno. Ali imaju tri potencijalne nedostatke:

    • Kolačići su uključeni u svaki HTTP zahtjev, čime se usporava vaša web aplikacija od nepotrebnog prijenosa istih podataka iznova i iznova.
    • Kolačići su uključeni u svaki HTTP zahtjev kada se podaci prenose putem Interneta u nekriptiranom obliku (čak i ako se cijela web aplikacija prenosi putem SSL-a);
    • Kolačići su ograničeni na veličinu podataka od približno 4 KB - dovoljno da uspore vašu aplikaciju (vidi gore), ali nedovoljno da budu korisni.

    Evo što stvarno želimo:

    • puno prostora za pohranu;
    • rad na strani klijenta;
    • uzeti u obzir osvježavanje stranice;
    • nema slanja na server.

    Prije HTML5, svi pokušaji da se to postigne u konačnici su propali na razne načine.

    Kratka povijest lokalne pohrane prije HTML5

    U početku je postojao samo jedan Internet Explorer. Po barem Microsoft je želio da svijet tako misli. U tu svrhu u okviru Prve Veliki rat preglednici Microsoft je izumio toliko stvari i ugradio ih u svoj preglednik koji je završio rat - Internet Explorer. Jedna od tih stvari se zvala DHTML Behaviors, a jedno od ponašanja zove se korisnički podaci.

    UserData omogućuje web stranici pohranjivanje do 64 KB podataka po domeni u hijerarhijskoj strukturi nalik XML-u. Pouzdane domene kao što su intranet stranice mogu pohraniti deset puta više. I hej, 640 KB bi svima trebalo biti dovoljno. IE nije pružio nikakav način za promjenu ovih konvencija, tako da ne postoji način da se poveća količina dostupne memorije.

    Adobe je 2002. godine predstavio značajku u Flash 6, koja se pokazala nesretnom i s pogrešnim nazivom - "Flash Cookies". U Flash okruženju ova je mogućnost poznatija kao lokalni dijeljeni objekti (LSO). Ukratko, omogućuje Flash objektima pohranu do 100 KB podataka po domeni. Brad Neuberg, koji je razvio rani prototip mosta između Flasha i JavaScripta, nazvao ga je AMASS (AJAX Massive Storage System), ali je bio ograničen nekim hicima Flash dizajna. Do 2006., s uvođenjem ExternalInterfacea u Flash 8, pristup LSO-ovima putem JavaScripta postao je za red veličine brži i lakši. Brad je prepisao AMASS i integrirao ga u popularni Dojo Toolkit pod aliasom dojox.storage. Flash "besplatno" daje svakoj domeni 100 kb prostora za pohranu. Osim toga, poziva korisnika da poveća kapacitet pohrane za red veličine na zahtjev (1 MB, 10 MB, itd.).

    if (Modernizr.localstorage) (
    // window.localStorage je dostupan!
    ) drugo (
    // nema izvorne podrške za HTML5 pohranu
    }

    Korištenje HTML5 pohrane

    HTML5 pohrana temelji se na nazivima parova ključ/vrijednost. Informacije pohranjujete na temelju naziva ključa, a zatim ih možete dohvatiti istim ključem. Naziv ključa je niz. Podaci mogu biti bilo koje vrste koje JavaScript podržava, uključujući nizove, logičke vrijednosti, cijele brojeve ili brojeve s pomičnim zarezom. Međutim, u stvarnosti, podaci se pohranjuju kao niz. Ako spremate i dohvaćate nizove, morat ćete koristiti funkcije kao što su parseInt () ili parseFloat () da prevedete rezultirajuće podatke u važeće JavaScript vrste.

    Sučelje za pohranu (
    Dobiti putem getItem (ključ);
    Postavite putem setItema (ključ, podaci);
    };

    Pozivanje setItem () s postojećim imenom ključa tiho će prepisati prethodnu vrijednost. Pozivanje getItem () s nepostojećim ključem vratit će NULL umjesto izbacivanja iznimke.

    Kao i drugi JavaScript objekti, možete se odnositi na objekt localStorage kao na asocijativni niz. Umjesto korištenja metoda getItem () i setItem (), možete jednostavno odrediti uglate zagrade... Na primjer, ovaj dio koda

    var foo = localStorage.getItem ("bar");
    // ...
    localStorage.setItem ("bar", foo);

    može se prepisati pomoću sintakse uglastih zagrada:

    var foo = localStorage ["bar"];
    // ...
    localStorage ["bar"] = foo;

    Postoje i metode za brisanje vrijednosti prema nazivu ključa, kao i brisanje cijele trgovine (odnosno brisanje svih ključeva i vrijednosti u isto vrijeme).

    Sučelje za pohranu (
    Ukloniti putem removeItema (ključ);
    čisto ();
    }

    Pozivanje removeItem () s nepostojećim ključem neće vratiti ništa.

    Konačno, postoji svojstvo za dobivanje ukupnog broja vrijednosti u području pohrane i za ponavljanje svih ključeva po indeksu (dobije ime svakog ključa).

    Sučelje za pohranu (
    duljina
    Dobiti ključ (nenegativan cijeli broj);
    }

    Ako, prilikom pozivanja tipke (), indeks nije u rasponu od 0 do (duljina-1), funkcija će vratiti null.

    Praćenje područja za pohranu HTML5

    Ako želite programski pratiti promjene pohrane, morate uhvatiti događaj pohrane. Ovaj događaj se aktivira na objektu prozora kada se pozove setItem (), removeItem () ili clear () i promijeni nešto. Na primjer, ako postavite postojeću vrijednost ili pozovete clear () kada nema ključeva, događaj se neće pokrenuti jer se područje pohrane nije stvarno promijenilo.

    Događaj pohrane podržan je svugdje gdje radi objekt localStorage, uključujući Internet Explorer 8. IE 8 ne podržava standard W3C addEventListener (iako će konačno biti dodan u IE 9), pa da uhvatite događaj pohrane morate provjeriti koji mehanizam događaja podržava preglednik (ako ste to već učinili s drugim događajima, možete preskočiti ovaj odjeljak do kraja). Presretanje događaja pohrane radi na isti način kao i presretanje drugih događaja. Ako radije koristite jQuery ili neku drugu JavaScript biblioteku za registraciju rukovatelja događajima, to možete učiniti i sa pohranom.

    if (window.addEventListener) (
    window.addEventListener ("pohrana", handle_storage, false);
    ) drugo (
    window.attachEvent ("onstorage", handle_storage);
    };

    Povratni poziv handle_storage bit će pozvan s objektom StorageEvent, osim u Internet Exploreru, gdje su događaji pohranjeni u window.event.

    funkcija handle_storage (e) (
    ako (! e) (e = prozor.događaj;)
    }

    U ovom slučaju, e će biti objekt StorageEvent koji ima sljedeća korisna svojstva.

    * Napomena: svojstvo url izvorno se zvalo uri i neki su preglednici podržavali ovo svojstvo prije promjene specifikacije. Za maksimalnu kompatibilnost, trebali biste provjeriti postoji li svojstvo url, a ako ne, umjesto toga provjerite svojstvo uri.

    Događaj pohrane se ne može otkazati, ne postoji način da se zaustavi promjena unutar handle_storage povratnog poziva. To je samo način na koji vam preglednik kaže: “Hej, to se upravo dogodilo. Ne možete ništa učiniti, samo sam želio da znate."

    Ograničenja u trenutnim preglednicima

    Dok sam govorio o povijesti lokalne pohrane s dodacima trećih strana, spomenuo sam ograničenja svake tehnike. Sjetio sam se da nisam rekao ništa o ograničenjima sada standardne HTML5 pohrane. Dat ću vam odgovore i onda ih objasniti. Odgovori, prema redoslijedu važnosti, su “5 megabajta”, “QUOTA_EXCEEDED_ERR” i “ne”.

    "5 megabajta" - koliko je prostora za pohranu predviđeno prema zadanim postavkama. Ovo je značenje iznenađujuće isto u svim preglednicima, iako je formulirano kao samo prijedlog u HTML5 specifikaciji. Morate razumjeti da pohranjujete nizove, a ne podatke u izvornom formatu. Ako pohranjujete puno cijelih brojeva ili brojeva s pomičnim zarezom, razlika u predstavljanju može biti velika. Svaka znamenka u broju s pomičnim zarezom pohranjuje se kao znak, a ne kao uobičajeni prikaz takvih brojeva.

    "QUOTA_EXCEEDED_ERR" je iznimka koju dobivate ako premašite svoju kvotu od 5 MB. "Ne" je odgovor na sljedeće očito pitanje: "Mogu li zatražiti od korisnika više prostora za pohranu?" U vrijeme pisanja ovog teksta, preglednici nisu implementirali nikakav mehanizam za web programere da zatraže više prostora za pohranu. Neki preglednici (kao što je Opera) dopuštaju korisniku da kontrolira kvote pohrane za svaku stranicu, ali ovo je isključivo inicijativa korisnika, a ne nešto što vi, kao programer, možete ugraditi u svoju web aplikaciju.

    HTML5 pohrana u akciji

    Pogledajmo HTML5 pohranu na djelu. Vratimo se na onu koju smo izgradili u poglavlju o crtanju. Postoji mali problem s ovom igrom: ako zatvorite prozor preglednika usred igre, izgubit ćete rezultate. Ali s HTML5 pohranom možemo zadržati igru ​​na mjestu, u samom pregledniku. Otvorite demo, napravite nekoliko poteza, zatvorite karticu preglednika, a zatim je ponovo otvorite. Ako vaš preglednik podržava HTML5 pohranu, demo stranica će magično zapamtiti točnu poziciju u igri, uključujući koliko ste poteza napravili, položaj svake figure na ploči, pa čak i odabranu figuru.

    Kako radi? Svaki put kada dođe do promjene u igri, nazvat ćemo ovu funkciju.

    funkcija saveGameState () (

    localStorage ["halma.game.in.progress"] = gGameInProgress;
    za (var i = 0; i< kNumPieces; i++) {
    localStorage ["halma.piece." + i + ".red"] = gKomadi [i] .red;
    localStorage ["halma.piece." + i + ".stupac"] = gKomadi [i] .stupac;
    }
    localStorage ["halma.selectedpiece"] = gSelectedPieceIndex;
    localStorage ["halma.selectedpiecehasmoved"] = gSelectedPieceHasMoved;
    localStorage ["halma.movecount"] = gMoveCount;
    vratiti istinito;
    }

    Kao što možete vidjeti, objekt localStorage koristi se za spremanje napretka igre (gGameInProgress, boolean). Zatim iterira sve tokene (gPieces, JavaScript polje) i pohranjuje redak i stupac za svaki od njih. Nakon toga spremaju se neka dodatna stanja igre, uključujući odabranu figuru (gSelectedPieceIndex, cijeli broj), figuru koja se nalazi u sredini dugog niza skokova (gSelectedPieceHasMoved, boolean) i ukupan broj napravljenih poteza (gMoveCount, integer) .

    Kada se stranica učita, umjesto automatskog pozivanja funkcije newGame () koja bi vratila sve varijable na njihove izvorne vrijednosti, pozivamo resumeGame (). Funkcija resumeGame () koristi HTML5 pohranu za provjeru stanja igre u lokalnoj pohrani. Ako postoji, vraća vrijednosti pomoću objekta localStorage.

    funkcija nastavitiGame () (
    if (! supportsLocalStorage ()) (vrati false;)
    gGameInProgress = (localStorage ["halma.game.in.progress"] == "true");
    if (! gGameInProgress) (vrati false;)
    gPieces = novi niz (kNumPieces);
    za (var i = 0; i< kNumPieces; i++) {
    var row = parseInt (localStorage ["halma.piece." + i + ".row"]);
    var stupac = parseInt (localStorage ["halma.piece." + i + ".column"]);
    gPieces [i] = nova ćelija (red, stupac);
    }
    gNumPieces = kNumPieces;
    gSelectedPieceIndex = parseInt (localStorage ["halma.selectedpiece"]);
    gSelectedPieceHasMoved = localStorage ["halma.selectedpiecehasmoved"] == "true";
    gMoveCount = parseInt (localStorage ["halma.movecount"]);
    drawBoard ();
    vratiti istinito;
    }

    Najvažniji dio ove funkcije je upozorenje koje sam spomenuo ranije u ovom poglavlju i ponovit ću ovdje: podaci se pohranjuju kao nizovi. Ako pohranjujete nešto drugo osim nizova, morate ih pretvoriti po primitku. Na primjer, zastavica da je igra u tijeku (gGameInProgress) je boolean tip. U funkciji saveGameState () samo je spremamo i ne brinemo o vrsti podataka.

    localStorage ["halma.game.in.progress"] = gGameInProgress;

    Ali u resumeGame (), moramo promatrati vrijednost koju smo dobili iz lokalne memorije kao string i ručno konstruirati vlastiti boolean.

    gGameInProgress = (localStorage ["halma.game.in.progress"] == "true");

    Isto tako, broj poteza je pohranjen u gMoveCount kao cijeli broj, u funkciji saveGameState () jednostavno ga spremamo.

    localStorage ["halma.movecount"] = gMoveCount;

    Ali u resumeGame (), moramo pretvoriti vrijednost u cijeli broj pomoću ugrađene JavaScript funkcije parseInt ().

    gMoveCount = parseInt (localStorage ["halma.movecount"]);

    Onkraj para ključ/vrijednost: kompetitivna vizija

    Iako je u povijesti bilo mnogo trikova i rješenja, trenutno stanje HTML5 pohrane je iznenađujuće dobro. Novi API je standardiziran i uključen u sve glavne preglednike, platforme i uređaje. Za web developera, ovo se ne viđa svaki dan, zar ne? Ali to je više od 5 megabajta parova ključ/vrijednost, a budućnost trajne lokalne pohrane je... kako reći... pa, neka to bude vizija konkurencije.

    Jedna vizija je akronim koji već znate - SQL. 2007. Google je lansirao Gears, dodatak za više preglednika s otvorenim kodom izvorni kod koji uključuje ugrađenu bazu podataka baziranu na SQLiteu. Ovaj rani prototip kasnije je utjecao na stvaranje specifikacije Web SQL baze podataka. Web SQL baza podataka (prije poznata kao "WebDB") pruža tanki omot oko baze podataka SQL podaci, što vam omogućuje sljedeće stvari iz JavaScripta:

    openDatabase ("dokumenti", "1.0", "Lokalna pohrana dokumenata", 5 * 1024 * 1024, funkcija (db) (
    db.changeVersion ("", "1.0", funkcija (t) (
    t.executeSql ("STVORI TABLICU docids (id, name)");
    ), pogreška);
    });

    Kao što možete vidjeti, većina radnji je na liniji s ExecuteSQL metodom. Ovaj niz može podržati bilo koju SQL naredbu, uključujući SELECT, UPDATE, INSERT i DELETE. To je kao programiranje baze podataka na strani poslužitelja, osim što to radite s JavaScriptom! O radosti!

    Specifikacija Web SQL baze podataka implementirana je u četiri preglednika i platforme.

    Podrška za web SQL bazu podataka
    tj Firefox Safari Krom Opera iPhone Android
    4.0+ 4.0+ 10.5+ 3.0+ 2.0+

    Naravno, ako ste u životu koristili više od jedne baze podataka, onda znate da je "SQL" više marketinški izraz nego čvrst i brz standard (netko bi mogao reći isto za HTML5, ali to nije važno ). Naravno, postoji ažurirana SQL specifikacija (nazvana SQL-92), ali ne postoji poslužitelj baze podataka na svijetu koji je samo u skladu s ovom specifikacijom. Postoji Oracle SQL, Microsoft SQL, SQL u MySQL, SQL u PostgreSQL, SQL u SQLite. Zapravo, svaki od ovih proizvoda s vremenom dodaje nove. SQL funkcije, pa čak ni reći "SQL u SQLite" nije dovoljno. Morate reći "verzija SQL-a koja dolazi s verzijom SQLite-a X.Y.Z".

    Sve nas ovo dovodi do sljedećeg upozorenja, trenutno na vrhu Web SQL specifikacije.

    Specifikacija je u slijepoj ulici: svi zainteresirani programeri koriste SQL na strani poslužitelja (SQLite), ali trebamo više neovisnih implementacija da bismo krenuli na standardizacijski put. Dok su drugi programeri zainteresirani za implementaciju ove specifikacije, opis SQL dijalekta ostavljen je kao redovita referenca na Sqlite, što nije prihvatljivo za standard.

    U tom kontekstu donijet ću vam još jednu konkurentsku viziju za naprednu, trajnu lokalnu pohranu za web aplikacije: API indeksirane baze podataka, ranije poznat kao “WebSimpleDB”, sada od milja nazvan IndexedDB.

    API indeksirane baze podataka pruža ono što se naziva pohrana objekata, s puno ideja posuđenih iz SQL baza podataka. Postoje “baze podataka” s “zapisima”, svaki zapis ima određeni broj “polja”. Svako polje ima specifičan tip podataka koji je definiran prilikom kreiranja baze podataka. Možete odabrati dio zapisa, a zatim ih popisati "kurzorom". Promjene u pohrani objekata obrađuju se "transakcijama".

    Ako ste ikada programirali SQL bazu podataka, ovi pojmovi su vam vjerojatno poznati. Glavna razlika je u tome što pohrana objekata nema strukturirani jezik upita. Ne pišete uvjet poput "ODABIR * od KORISNIKA gdje je AKTIVNO =" Y ". Umjesto toga, koristi metode koje pruža pohrana objekata za otvaranje baze podataka KORISNIKA, nabrajanje zapisa, filtriranje naših zapisa i korištenje metoda pristupa kako bi dobili vrijednost svakog polja u preostalim zapisima. Rani pregled IndexedDB je dobar vodič o tome kako IndexedDB radi i uspoređuje IndexedDB s Web SQL-om.

    U vrijeme pisanja ovog teksta, IndexedDB je implementiran samo u beta verziji Firefoxa 4. Nasuprot tome, Mozilla je izjavila da nikada neće implementirati Web SQL. Google je rekao da razmatra IndexedDB podršku za Chromium i Google Chrome... Čak je i Microsoft rekao da je IndexedDB "izvrstan za web".

    Što možete učiniti kao web programer s IndexedDB? Na ovaj trenutak praktički ništa osim nekih tehnoloških demonstracija. U godini? Može biti.