Lokal lagring html5 hvordan fjerne. Bruker localStorage for JavaScript-behov

Oversettelse av artikkelen: Hvordan bruke lokal lagring for JavaScript.
Sara Vieira.

Å bli kjent med det grunnleggende om JavaScript-programmering begynner ofte med å lage enkle applikasjoner, for eksempel den elektroniske notatboken vi bruker til å registrere ting og hendelser som vi kan glemme. Men slike applikasjoner har ett problem - etter at siden er lastet inn på nytt, forsvinner listen over alle tidligere venstre oppføringer, det vil si at applikasjonen går tilbake til sin opprinnelige tilstand.

Det er en veldig enkel vei ut av denne situasjonen, som innebærer å bruke den lokale lagringsmekanismen localStorage. På grunn av det faktum at localStorage lar oss lagre de nødvendige dataene på brukerens datamaskin, vil listen over planlagte oppgaver og hendelser nevnt ovenfor fortsatt være tilgjengelig etter en sideinnlasting, i tillegg er localStorage en overraskende veldig enkel måte å lagre data og få tilgang til det når det er nødvendig.

Hva er localStorage?

Dette er en lokal datalagringsmekanisme som er en del av Web Storage-teknologien levert av HTML5-spesifikasjonen. Det er to alternativer for datalagring tillatt av denne spesifikasjonen:

  • Lokal lagring: lar deg lagre informasjon uten begrensninger på lagringsperioder. Det er dette alternativet vi skal bruke, siden listen over oppgaver i vårt eksempel må lagres permanent.
  • Bruk av økter: sikrer sikkerheten til data bare i løpet av en økt, det vil si etter at brukeren lukker fanen på applikasjonen vår og åpner den på nytt, vil all informasjon som er nødvendig for videre drift av applikasjonen bli slettet.

Enkelt sagt, alt Web Storage gjør er å lagre data i skjemaet navngitt nøkkel/verdi lokalt og i motsetning til de to andre metodene, som hver har sine egne ulemper ( Lagring av øktinformasjon innebærer bruk av serversiden for dette, dessuten, etter at brukerens økt er stengt, slettes denne informasjonen, og informasjonskapsler, selv om de bruker klientsiden til lagring, er ikke pålitelige fordi brukeren kan avbryte sin støtte gjennom nettleserinnstillingene. ) lagrer data selv i så fall hvis du lukker nettleseren eller slår av datamaskinen. ( *Jeg tok meg friheten til å endre litt og legge til innholdet i dette avsnittet, fordi jeg mener at forfatteren har gjort unøyaktigheter i originalen.)

HTML

Hvis vi holder oss til vårt eksempel, der vi ønsker å lage en elektronisk versjon av en notatbok, er alle nødvendige komponenter for implementeringen nedenfor:

  • Felt for å legge inn nye oppføringer (hendelser, gjøremål osv.).
  • Knapp for å bekrefte den angitte oppføringen.
  • En knapp for å slette en allerede opprettet gjøremålsliste.
  • En uordnet liste som vil fylles på med elementer i form av nye oppføringer.
  • Til slutt trenger vi en div som en beholder som inneholder meldinger som skal vises til brukeren, for eksempel en advarsel om at han glemte å skrive inn verdien til neste oppføring, slik at inndatafeltet er tomt.

Som et resultat bør markeringen vår se omtrent slik ut:








Dette er en helt standard HTML-mal som vi kan fylle med dynamisk generert innhold ved hjelp av JavaScript.

JavaScript

Gitt strukturen til den enkle notisblokkapplikasjonen i vårt eksempel, er det første vi må gjøre å gi sporing for knappen-klikk-hendelsen "Legg til oppføring" og sjekk om det er lagt inn informasjon i tekstfeltet for oppføringen, det vil si at i det øyeblikket knappen trykkes, skal den ikke være tom. Noe sånt som dette:

$("#add").click(function() (
//hvis tekstfeltet er tomt
$("#alert").html(" Oppmerksomhet! Skriv inn oppføringen i tekst
felt.");
returner falsk;
}

Dette er hva vi gjør med denne kodebiten. Når knappen trykkes "Legg til oppføring" vi sjekker om brukeren har skrevet inn noe i det nye feltet. Hvis han ikke gjorde dette, vises div-en vi oppga for å vise meldinger, og informerer brukeren om at oppføringsfeltet for oppføringen ikke er fylt ut, og deretter, etter 1000ms (1 sekund), div-elementet, og følgelig meldingen, forsvinner. Funksjonen returnerer deretter false , hvoretter nettleseren slutter å kjøre resten av skriptet og applikasjonen er igjen klar til å legge inn en ny oppføring.

Vårt neste trinn vil være å legge til verdien som er angitt i oppføringsfeltet til begynnelsen av listen ved å generere et nytt listeelement. Når brukeren legger til en annen oppføring, vil den derfor alltid bli plassert i begynnelsen av listen over planlagte gjøremål og forventede hendelser. Etter dette er alt vi trenger å gjøre å lagre listen ved å bruke localStorage-mekanismen:

// Legg til en oppføring i den eksisterende listen
$("#todos").prepend("

  • "+Beskrivelse+"
  • ");
    // Tøm inntastingsfeltet
    $("#form").reset();

    returner falsk;
    });

    Som du kanskje har lagt merke til er det ikke noe uvanlig her, standardversjonen av jQuery-koden brukes. Der vi får tilgang til localStorage-objektet, må vi spesifisere dataene vi lagrer i nøkkel/verdi-form. Du kan bruke et vilkårlig navn for nøkkelen, og jeg ga den navnet "todos", så må vi indikere hva vi faktisk trenger å lagre i minnet. I dette tilfellet er det et komplett fragment av HTML-markering inkludert i en uordnet liste (plassert mellom kodene), ved hjelp av hvilken alle oppføringer som tidligere er lagt inn av brukeren, vises. Fra koden kan du se at vi ganske enkelt henter fragmentet vi trenger ved å bruke jQuery .html()-metoden og på slutten, etter å ha fullført alle nødvendige handlinger, setter vi returverdien til funksjonen til false , som forhindrer skjemadataene fra å bli sendt inn og derfor laste inn siden vår på nytt.

    La oss nå si at brukeren vår tidligere har gjort flere oppføringer, og for videre normal drift av applikasjonen må vi sjekke om localStorage inneholder informasjon som tidligere er lagret på datamaskinen, og i så fall vise den for brukeren. Siden nøkkelnavnet vårt er "todos", bør vi sjekke om det eksisterer slik:

    // hvis det allerede er data i den lokale lagringen, vis den

    }

    For å sjekke for tilstedeværelsen av data, brukte vi en vanlig if-setning, og hvis betingelsen vi spesifiserte ble oppfylt, hentet vi ganske enkelt alle dataene fra lokal lagring, og plasserte dem som HTML-oppmerking i en uordnet liste, som viser oppføringene som er lagt inn tidligere. av brukeren.

    Hvis du sjekker driften av den enkle applikasjonen din, vil du finne at etter å ha lastet inn siden på nytt, forblir alt på plass. Og nå, det siste vi trenger å gjøre er å lage en funksjon som brukeren, om nødvendig, kan slette alle sine oppføringer med. Dette implementeres ved å tømme localStorage og laste inn siden på nytt for å aktivere endringene som er gjort. Deretter setter vi, som i forrige tilfelle, false som returverdien til funksjonen, som forhindrer hashen i å vises i URL-en. ( *og ruller ikke opp på siden.):

    // Fullfør opprydding av localStorage
    window.localStorage.clear();
    location.reload();
    returner falsk;
    });

    Som et resultat har vi en fullt fungerende applikasjon. Og setter vi alle de ovennevnte fragmentene sammen, får vi den komplette søknadskoden:

    $("#add").click(function() (
    var Beskrivelse = $("#description").val();
    if($("#description").val() == "") (
    $("#alert").html(" Oppmerksomhet! Skriv inn oppføring i
    tekstfelt.");
    $("#alert").fadeIn().delay(1000).fadeOut();
    returner falsk;
    }
    $("#todos").prepend("

  • "
    + Beskrivelse + "
  • ");
    $("#form").reset();
    var todos = $("#todos").html();
    localStorage.setItem("todos", todos);
    returner falsk;
    });

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

    $("#clear").click(function() (
    window.localStorage.clear();
    location.reload();
    returner falsk;
    });

    Nettleserstøtte.

    HTML5-spesifikasjonen gir ganske kraftig støtte for Web Storage-teknologi, på grunn av hvilken den også implementeres av de fleste populære nettlesere, til og med IE8. Det eneste problemet er fortsatt IE7, hvis du fortsatt er interessert.

    Konklusjon.

    I slike små applikasjoner kan localStorage-mekanismen ganske vellykket erstatte bruken av databaser. For å lagre små mengder data er det ikke nødvendig å bruke mer komplekse alternativer.

    * Oversetterens notat.

    Visninger av innlegg: 475

    Jeg sendte deg en artikkel med en historie om HTML5 LocalStorage i nettlesere. Vi gir ham ordet.

    Jeg prøvde å skrive den enkleste og mest forståelige veiledningen for bruk av lokal lagringsteknologi. Artikkelen viste seg å være ganske kort, på grunn av det faktum at selve teknologien og virkemidlene for å jobbe med den ikke er kompliserte. For å komme i gang trenger du bare å kunne litt JavaScript. Så bruk 10 minutter på denne artikkelen, og du kan trygt legge til linjen "Jeg kan jobbe med localStorage" på CV-en din.

    Hva er localStorage?

    Slik ser et JavaScript-objekt ut:

    Var myCar = ( hjul: 4, dører: 4, motor: 1, navn: "Jaguar" )

    Og slik ser JSON ut. Nesten det samme som et vanlig js-objekt, bare alle egenskaper må være omgitt av anførselstegn.

    ( "firstName": "Ivan", "lastName": "Ivanov", "address": ( "streetAddress": "Moskovskoe sh., 101, leilighet 101", "city": "Leningrad", "postalCode": 101101 ), "phoneNumbers": [ "812 123-1234", "916 123-4567" ] )

    For å forstå hva localStorage er, se for deg at det et sted i nettleseren din er et slikt objekt innebygd som vi kan bruke. Samtidig sletter ikke dette objektet verdiene som vi skriver der hvis vi laster inn siden på nytt eller til og med lukker nettleseren helt.

    I JavaScript-termer er localStorage en egenskap til det globale nettleserobjektet (vinduet). Den kan nås som window.localStorage eller ganske enkelt localStorage.

    Det er også verdt å si at nettleseren har en localStorage-klone kalt sessionStorage. Deres eneste forskjell er at sistnevnte lagrer data bare for én fane (økt) og vil ganske enkelt rydde plass så snart vi lukker fanen

    La oss se på det live. For eksempel, i Google Chrome må du åpne DevTools (F12), gå til "Ressurser" -fanen og i venstre rute vil du se localStorage for dette domenet og alle verdiene som det inneholder.

    Du bør forresten vite hvordan localStorage fungerer med domener. For hvert domene oppretter nettleseren din sitt eget localStorage-objekt, og det kan bare redigeres eller vises på det domenet. Mydomain-1.com-domenet kan for eksempel ikke få tilgang til localStorage til mydomain-2.com .

    Hvorfor trenger jeg localStorage?

    LocalStorage er nødvendig for bare én ting - å lagre visse data mellom brukerøkter. Du kan tenke på tusen og én ting som kan lagres i nettleserens lokale lagring. For eksempel nettleserspill som bruker den som en lagringsfil, eller registrerer øyeblikket da brukeren stoppet mens han så en video, ulike data for skjemaer, etc.

    Hvordan kommer jeg i gang med localStorage?

    Veldig enkelt.

    Å jobbe med localStorage er veldig likt å jobbe med objekter i JavaScript. Det er flere metoder for å jobbe med det.

    localStorage.setItem("nøkkel", "verdi")

    En metode som legger til en ny nøkkel med en verdi til localStorage (og hvis en slik nøkkel allerede eksisterer, overskriver den den med en ny verdi). Vi skriver for eksempel localStorage.setItem('myKey', 'myValue');

    localStorage.getItem("nøkkel")

    Vi tar en bestemt verdi fra nøkkellageret.

    localStorage.removeItem("Nøkkel")

    Ta ut nøkkelen

    localStorage.clear()

    Rydder all lagring

    Nå kan du åpne fanen localStorage i nettleseren din og øve deg på å registrere og hente data fra denne lagringen selv. Hvis noe skjer, skriver vi all koden i en js-fil.

    //Legg til eller endre verdien: localStorage.setItem("myKey", "myValue"); //nå har du nøkkelen "myKey" med verdien "myValue" lagret i localStorage //Output den til konsollen: var localValue = localStorage.getItem("myKey"); console.log(localValue); //"myValue" //remove: localStorage.removeItem("myKey"); //tøm hele lagringen localStorage.clear() Det samme, bare med hakeparenteser: localStorage["Key"] = "Verdi" //setting av verdien localStorage["Key"] //Få verdien delete localStorage[" Key"] // Fjern verdi

    Jeg vil også merke meg at localStorage fungerer utmerket med nestede strukturer, for eksempel objekter.

    //opprett et objekt var obj = ( item1: 1, item2: , item3: "hei" ); var serialObj = JSON.stringify(obj); //serialize it localStorage.setItem("myKey", serialObj); //skriv den til lagringen med nøkkelen "myKey" var returnObj = JSON.parse(localStorage.getItem("myKey")) //parse den tilbake som et objekt

    Du bør også vite at nettlesere allokerer 5 MB til lokal lagring. Og hvis du overskrider det, vil du motta et QUOTA_EXCEEDED_ERR-unntak. Du kan forresten bruke den til å sjekke om det fortsatt er plass på lageret ditt.

    Prøv ( localStorage.setItem("nøkkel", "verdi"); ) catch (e) ( if (e == QUOTA_EXCEEDED_ERR) ( alert("Grensen overskredet"); ) )

    I stedet for en konklusjon

    Jeg vil at utviklere skal trekke en enkel konklusjon fra denne korte artikkelen at denne teknologien allerede kan brukes i sin helhet på prosjektene dine. Den har god standardisering og utmerket støtte, som bare utvikler seg over tid.

    Svært ofte er den første JavaScript-applikasjonen en Todo-liste, men problemet med slike applikasjoner er at etter at siden er oppdatert, forsvinner alle elementene i listen.

    En enkel løsning på dette problemet er å bruke lokal lagring(Lokal lagring). Lokal lagring lar deg lagre data på brukerens maskin og du kan enkelt laste ned listen fra den etter å ha oppdatert siden. I denne artikkelen vil vi skrive en liten gjøremålsliste ved å bruke lokal lagring.

    Hva er lokal lagring?

    Lokal lagring ("nettlagring") var opprinnelig en del av HTML5-spesifikasjonen, men har nå blitt flyttet til sin egen. Det er to måter å lagre data på:

    • Lokal lagring: vedvarende lagring, dette er hva vi skal bruke.
    • Øktlagring: lagrer data kun for denne økten, hvis brukeren lukker siden, vil dataene gå tapt.

    Lokal lagring lar deg lagre data i form av nøkkelverdi-par på brukerens datamaskin, og disse dataene vil være tilgjengelige selv etter at du har lukket nettleseren eller slått av datamaskinen.

    HTML

    For å lage en gjøremålsliste trenger vi:

    • Tekstinntasting for å legge inn elementets innhold.
    • Knapp for å legge til et element i listen.
    • Knapp for å tømme listen.
    • Selve listen (
        ).
      • Og en ekstra div for å vise feil.

      Så HTML-markeringen vil se slik ut:

      En ganske enkel struktur som vi vil bringe til live med JavaScript.

      Fordi vi bruker jQuery, vi må koble det i tillegg.

      JavaScript

      Først må vi spore klikket på legg til-knappen og sjekke at inndatafeltet ikke er tomt:

      $("#add").click(function() ( var Beskrivelse = $("#description").val(); if($("#description").val() == "") ( $( "#alert").html(" Advarsel! Du lot gjøremålet stå tomt"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; )

      Denne koden sjekker verdien av tekstinndata, og hvis den er tom, viser den en feil og returnerer false slik at resten av koden ikke kjøres og elementet ikke legges til i listen.

      // sett inn oppføring $("#todos").prepend("

    • "+Beskrivelse+"
    • "); // slett alt som er igjen i tekstfeltet $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("todos", todos ); return false ));

      For å jobbe med lokal lagring må du oppgi en nøkkel og dens tilsvarende verdi. I vårt tilfelle, la oss kalle nøkkelen 'todos', og verdien vil være all HTML-koden som finnes i listen (i taggen

        ). Denne koden er enkel å få med jQuery. Og til slutt returnerer vi false for å forhindre at skjemaet sendes inn og ikke laster inn siden på nytt.

        Det neste trinnet er å sjekke den lokale lagringen, hvis det er en verdi med nøkkelen 'todos', last deretter inn listen fra den lokale lagringen:

        If (localStorage.getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); )

        Fordi vi lagrer den ferdige HTML-en i lagring, så setter vi ganske enkelt inn denne koden i listen.

        Todo-listen vår er nesten klar, alt som gjenstår er å implementere listen rensefunksjonen. Når brukeren klikker på knappen, vil hele listen bli slettet og den lokale lagringen tømmes:

        $("#clear").click(function() ( window.localStorage.clear(); location.reload(); return false; ));

        Ferdig! Den komplette koden ser slik ut:

        $(document).ready(function() ( $("#add").click(function() ( var Beskrivelse = $("#description").val(); if ($("#description"). val() == "") ( $("#alert").html(" Advarsel! Du lot gjøremålet stå tomt"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; ) $("#todos").prepend("

      • "+Beskrivelse+"
      • "); $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("todos", todos); return false; )); if (localStorage .getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); ) $("#clear").click(function() ( window.localStorage.clear( ); location.reload();

        Nettleserstøtte

        Nettlagring støttes av alle større nettlesere, selv IE8. Du bør bare være forsiktig med IE7 og lavere.

        Konklusjon

        Lokal lagring i så små applikasjoner kan være en utmerket erstatning for en database. Å lagre små mengder informasjon bør ikke være vanskelig.

        Å lage en oppgaveliste-app er vanligvis den første appen du lager når du lærer JavaScript, men problemet med alle disse appene er at når du laster inn siden på nytt, forsvinner alle disse listene.
        Det er en enkel løsning - bruk av lokal lagring. Fordelen med lokal lagring er at du kan lagre biter av data på brukerens datamaskin, og når siden er lastet inn på nytt, er alle oppgavelistene der fortsatt.

        Hva er lokal lagring?

        Lokal datalagring er en del av et lagringsnettverk, som i seg selv er en del av HTML5-spesifikasjonen. Det er to alternativer for å lagre data i en spesifikasjon:

        • Lokal lagring: Lagrer data uten en utløpsdato, og dette er alternativet vi vil bruke fordi vi vil at oppføringene våre skal forbli på siden så lenge som mulig.
        • Sesjonslagring: Lagrer kun data for én økt, så hvis en bruker lukker en fane og åpner den på nytt, vil alle dataene deres gå tapt.

        Enkelt sagt, alt nettlagring gjør er å lagre nøkkel/verdi-par med et navn lokalt, og i motsetning til informasjonskapsler, lagres disse dataene selv om du lukker nettleseren eller slår av datamaskinen.

        Hvis vi tenker på en gjøremålsliste, trenger du følgende:

        • Inngangsparti hvor du kan legge ut listen vår
        • Enter-knapp for å legge til liste
        • Knapp for å tømme hele dagboken
        • En uordnet listebeholder der listen vår vil bli plassert i en liste over elementer
        • Og til slutt trenger vi en DIV-beholder for å vise et varsel når du prøver å legge inn en tom oppgave.

        Så HTML-koden vår skal se omtrent slik ut:

        Dette er en ganske standard HTML-beholder, og med JavaScript kan vi fylle det hele med dynamisk innhold.

        Siden vi skal bruke JQuery i dette eksemplet, bør du også inkludere det i HTML-dokumentet ditt.

        JavaScript

        Hvis vi tenker på strukturen til en enkel "to-do list"-applikasjon, er det første vi må gjøre å sjekke om inngangen er tom når brukeren klikker på "legg til" eller "valider"-knappen:

        $("#add").click(function() ( var Beskrivelse = $("#description").val(); //hvis gjøremålet er tomt if($("#description").val( ) == "") ( $("#alert").html(" Advarsel! Du lot gjøremålet stå tomt"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; )

        Alt vi gjorde var å teste klikket på Legg til-knappen og kjøre en enkel test for å se om brukeren fylte inn input med noe. Hvis ikke, dukker div-varselet opp og blir værende i 1000ms og forsvinner deretter.

        Det neste vi må gjøre er å sette inn et listeelement med en verdi i inndatalinjen, og vi vil innlede dette slik at når brukeren legger til en oppgave, vil den alltid gå til toppen av listen, og deretter lagre listen element til lokal lagring, slik:

        // legg til listeelementet $("#todos").prepend("

      • "+Beskrivelse+"
      • "); // slett det som er i inngangen $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("todos", todos); return falsk;

        Som du kan se, er dette ganske standard jQuery, og når det kommer til lokal lagring må vi lagre nøkkelen og verdien. Nøkkelen er et navn vi gir oss selv, i dette tilfellet vil vi bare kalle det "Todos", så må vi definere hva vi vil lagre, og i dette tilfellet er det all HTML som er inne i Todos uordnet liste. Som du kan se, fanget vi alt ved hjelp av jQuery, og returnerte til slutt false slik at skjemaet ikke skulle feile og siden vår ikke oppdateres.

        Vårt neste trinn er å sjekke om vi har noe lagret på lokal lagring. Hvis det er det, må vi plassere det på siden, gitt at vi har gitt nøkkelen vår navnet "todos", må vi sjekke om den eksisterer. Slik:

        // hvis vi har noe på lokal lagringsplass som if(localStorage.getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); )

        Hvis du tester applikasjonen vår og laster inn siden på nytt, vil du se at den allerede fungerer. Alt vi trenger å gjøre er å lage en funksjon som skal være ansvarlig for å tømme hele listen. Vi sletter all lokal lagring, laster inn siden på nytt for at endringen skal tre i kraft, og returnerer deretter "false" for å forhindre hashen før URL-en slik:

        // slett all lokal lagring $("#clear").click(function() ( window.localStorage.clear(); location.reload(); return false; ));

        Den komplette koden ser slik ut:

        $("#add").click(function() ( var Beskrivelse = $("#description").val(); if($("#description").val() == "") ( $( "#alert").html(" Advarsel! Du lot gjøremålet stå tomt"); $("#alert").fadeIn().delay(1000).fadeOut(); return false; ) $("#todos").prepend("

      • "+Beskrivelse+"
      • "); $("#form").reset(); var todos = $("#todos").html(); localStorage.setItem("todos", todos); return false; )); if(localStorage .getItem("todos")) ( $("#todos").html(localStorage.getItem("todos")); ) $("#clear").click(function() ( window.localStorage.clear( ); location.reload();

        Nettleserstøtte

        Web Storage-støtte er ganske bra for HTML5-spesifikasjoner, den støttes av alle store nettlesere og til og med IE8.

        Oversettelse: Vlad Merzhevich

        Vedvarende lokal lagring er et område hvor klientapplikasjoner har fordeler fremfor serverapplikasjoner. Applikasjoner som operativsystemet gir et abstraksjonslag for lagring og henting av data som innstillinger eller utførelsesstatus. Disse verdiene kan lagres i registeret, INI-filer, XML-filer eller andre steder avhengig av prinsippene til plattformen. Hvis klientapplikasjonen din trenger lokal lagring for mer enn bare et nøkkel/verdi-par, kan du sette inn din egen database, komme opp med ditt eget filformat eller en rekke andre løsninger.

        Historisk sett har webapplikasjoner ikke hatt noen av disse luksusene. Informasjonskapsler ble oppfunnet tidlig i Internetts historie og kan brukes til å permanent lagre små mengder data lokalt. Men de har tre potensielle ulemper:

        • Informasjonskapsler er inkludert i hver HTTP-forespørsel, og bremser dermed nettapplikasjonen din ved å unødvendig overføre de samme dataene om og om igjen;
        • Informasjonskapsler er inkludert i hver HTTP-forespørsel når data overføres over Internett i ukryptert form (selv om hele nettapplikasjonen overføres over SSL);
        • Informasjonskapsler er begrenset til ca. 4KB med data - nok til å bremse applikasjonen din (se ovenfor), men ikke nok til å være nyttig.

        Her er hva vi virkelig ønsker:

        • rikelig med lagringsplass;
        • arbeid på klientsiden;
        • ta hensyn til sideoppdateringer;
        • ingen sending til serveren.

        Før HTML5 mislyktes til slutt alle forsøk på å oppnå dette på ulike måter.

        En kort historie om lokal lagring før HTML5

        I begynnelsen var det bare én Internet Explorer. Det var i hvert fall det Microsoft ønsket at verden skulle tenke. For dette formål, som en del av den første store nettleserkrigen, oppfant Microsoft mange ting og inkluderte dem i sin nettleser-som-sluttet-krigen, Internet Explorer. En av disse tingene ble kalt DHTML Behaviours, og en av atferdene ble kalt userData.

        UserData lar en nettside lagre opptil 64 KB med data per domene i en hierarkisk XML-lignende struktur. Klarerte domener som intranettsider kan lagre ti ganger mer. Og hei, 640 KB burde være nok for alle. IE har ikke gitt noen måte å endre disse konvensjonene på, så det er ingen måte å øke mengden tilgjengelig minne på.

        I 2002 introduserte Adobe en funksjon i Flash 6 som mislyktes og ble misvisende kalt «Flash-informasjonskapsler». I Flash-miljøet er denne funksjonen mer kjent som Local Shared Objects (LSOer). Kort sagt lar det Flash-objekter lagre opptil 100 KB data per domene. Brad Neuberg, som utviklet en tidlig prototype av en bro mellom Flash og JavaScript, kalte den AMASS (AJAX Massive Storage System), men den var begrenset av noen særtrekk ved Flash-design. I 2006, med introduksjonen av ExternalInterface i Flash 8, ble tilgang til LSOer via JavaScript en størrelsesorden enklere og raskere. Brad omskrev AMASS og integrerte den i det populære Dojo Toolkit under aliaset dojox.storage. Flash gir hvert domene 100 kb lagringsplass "gratis". I tillegg tilbyr den brukeren, på forespørsel, å øke lagringsvolumet med en størrelsesorden (1 MB, 10 MB, etc.).

        if (Modernizr.localstorage) (
        // window.localStorage er tilgjengelig!
        ) annet (
        // ingen innebygd støtte for HTML5-lagring
        }

        Bruker HTML5-lagring

        HTML5-lagring er basert på nøkkel/verdi-parnavn. Du lagrer informasjon basert på nøkkelnavnet, og deretter kan du hente disse dataene med samme nøkkel. Nøkkelnavnet er en streng. Dataene kan være alle typer som JavaScript støtter, inkludert strenger, booleaner, heltall eller flyttall. Imidlertid er dataene i virkeligheten lagret som en streng. Hvis du lagrer og henter ikke-strenger, må du bruke funksjoner som parseInt() eller parseFloat() for å konvertere de mottatte dataene til riktige JavaScript-typer.

        Lagringsgrensesnitt (
        Få via getItem(key);
        Sett via setItem(nøkkel, data);
        };

        Å kalle setItem() med et eksisterende nøkkelnavn vil stille overskrive forrige verdi. Å kalle getItem() med en ikke-eksisterende nøkkel vil returnere NULL i stedet for å kaste et unntak.

        Som andre JavaScript-objekter kan du få tilgang til localStorage-objektet som en assosiativ matrise. I stedet for å bruke metodene getItem() og setItem(), kan du ganske enkelt spesifisere hakeparenteser. For eksempel denne kodebiten

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

        kan skrives om ved å bruke firkantet parentes syntaks:

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

        Det finnes også metoder for å slette verdier etter nøkkelnavn, samt tømme hele butikken (det vil si å slette alle nøkler og verdier på en gang).

        Lagringsgrensesnitt (
        Fjern via removeItem(key);
        klar();
        }

        Å ringe removeItem() med en ikke-eksisterende nøkkel vil ikke returnere noe.

        Til slutt er det en egenskap for å få det totale antallet verdier i lagringsområdet og å iterere over alle nøklene etter indeks (får navnet på hver nøkkel).

        Lagringsgrensesnitt (
        lengde
        Hent nøkkel(ikke-negativt heltall);
        }

        Hvis, når key() kalles, indeksen ikke er i området fra 0 til (lengde-1), vil funksjonen returnere null .

        HTML5-lagringsområdeovervåking

        Hvis du vil spore lagringsendringer programmatisk, må du fange opp lagringshendelsen. Denne hendelsen oppstår på vindusobjektet når setItem() , removeItem() eller clear() kalles og endrer noe. For eksempel, hvis du angir en eksisterende verdi eller kaller clear() når det ikke er noen nøkler, vil ikke hendelsen utløses fordi lagringsområdet faktisk ikke har endret seg.

        Lagringshendelsen støttes uansett hvor localStorage-objektet kjører, inkludert Internet Explorer 8. IE 8 støtter ikke W3C addEventListener-standarden (selv om den til slutt vil bli lagt til i IE 9), så for å fange opp lagringshendelsen må du sjekke hvilken hendelsesmotor støtter nettleseren (hvis du har gjort dette før med andre arrangementer, kan du hoppe til slutten av denne delen). Å avskjære lagringshendelsen fungerer på samme måte som å avskjære andre hendelser. Hvis du foretrekker å bruke jQuery eller et annet JavaScript-bibliotek for å registrere hendelsesbehandlere, kan du også gjøre dette med lagring.

        if (window.addEventListener) (
        window.addEventListener("lagring", handle_storage, false);
        ) annet (
        window.attachEvent("onstorage", handle_storage);
        };

        Handle_storage-tilbakekallingen vil bli kalt opp med StorageEvent-objektet, bortsett fra i Internet Explorer, hvor hendelser lagres i window.event .

        funksjon handle_lagring(e) (
        if (!e) ( e = vindu.hendelse; )
        }

        I dette tilfellet vil variabelen e være et StorageEvent-objekt, som har følgende nyttige egenskaper.

        *Merk: url-egenskapen ble opprinnelig kalt uri og noen nettlesere støttet denne egenskapen før spesifikasjonen ble endret. For å sikre maksimal kompatibilitet bør du sjekke om url-egenskapen eksisterer, og hvis ikke, sjekke uri-egenskapen i stedet.

        Lagringshendelsen kan ikke avbrytes, og det er ingen måte å stoppe endringen i handle_storage tilbakeringingsfunksjonen. Det er bare nettleserens måte å fortelle deg: «Hei, dette skjedde nettopp. Det er ingenting du kan gjøre, jeg ville bare at du skulle vite det."

        Begrensninger i gjeldende nettlesere

        Når jeg snakket om historien til lokal lagring ved bruk av tredjeparts plugins, nevnte jeg begrensningene for hver teknikk. Jeg husket at jeg ikke sa noe om begrensningene til den nå standard HTML5-lagringen. Jeg vil gi deg svarene og deretter forklare dem. Svarene, i viktig rekkefølge, er "5 megabyte", "QUOTA_EXCEEDED_ERR" og "ingen".

        "5 megabyte" - hvor mye lagringsplass som er gitt som standard. Denne verdien er overraskende konsistent på tvers av alle nettlesere, selv om den ikke er angitt som noe mer enn et forslag i HTML5-spesifikasjonen. Du må forstå at du lagrer strenger, ikke data i det opprinnelige formatet. Hvis du lagrer mange heltall eller flyttall, kan forskjellen i representasjon være stor. Hvert siffer i et flyttallsnummer lagres som et tegn, i stedet for i den vanlige representasjonen for slike tall.

        "QUOTA_EXCEEDED_ERR" er unntaket du vil motta hvis du overskrider 5 MB-kvoten. "Nei" er svaret på det neste åpenbare spørsmålet: "Kan jeg be brukeren om mer lagringsplass?" I skrivende stund implementerer ikke nettlesere noen mekanisme for at webutviklere kan be om mer lagringsplass. Noen nettlesere (som Opera) lar brukeren kontrollere lagringskvoter på per-side-basis, men dette er rent brukerinitiativ og ikke relatert til alt du som utvikler kan bygge inn i nettapplikasjonen din.

        HTML5-lagring i aksjon

        La oss ta en titt på HTML5-lagring i aksjon. La oss gå igjen til den vi bygde i kapittelet om tegning. Det er et lite problem med dette spillet: hvis du lukker nettleservinduet midt i spillet, vil du miste resultatene. Men med HTML5-lagring kan vi lagre spillprosessen lokalt, i selve nettleseren. Åpne demoen, gjør noen bevegelser, lukk nettleserfanen og åpne den igjen. Hvis nettleseren din støtter HTML5-lagring, vil demosiden på magisk vis huske den nøyaktige posisjonen i spillet, inkludert hvor mange trekk du gjorde, plasseringen til hver brikke på brettet, og til og med den valgte brikken.

        Hvordan fungerer dette? Hver gang det er en endring i spillet, vil vi kalle denne funksjonen.

        funksjon saveGameState() (

        localStorage["halma.game.in.progress"] = gGameInProgress;
        for (var i = 0; i< kNumPieces; i++) {
        localStorage["halma.piece." + i + ".row"] = gPieces[i].rad;
        localStorage["halma.piece." + i + ".column"] = gPieces[i].column;
        }
        localStorage["halma.selectedpiece"] = gSelectedPieceIndex;
        localStorage["halma.selectedpiecehasmoved"] = gSelectedPieceHasMoved;
        localStorage["halma.movecount"] = gMoveCount;
        return true;
        }

        Som du kan se, brukes localStorage-objektet til å lagre spillets fremdrift (gGameInProgress, boolsk type). Deretter itereres alle delene (gPieces, en JavaScript-matrise) og en rad og kolonne lagres for hver av dem. Noen ekstra spilltilstander lagres deretter, inkludert den valgte brikken (gSelectedPieceIndex, et heltall), brikken som er midt i en lang serie med hopp (gSelectedPieceHasMoved, en boolean), og det totale antallet trekk som er gjort (gMoveCount, en heltall).

        Når siden laster, i stedet for automatisk å kalle newGame()-funksjonen, som vil returnere alle variabler til sine opprinnelige verdier, kaller vi resumeGame() . ResumeGame()-funksjonen bruker HTML5-lagring for å sjekke statusen til spillet i lokal lagring. Hvis den er tilstede, gjenoppretter den verdiene ved å bruke localStorage-objektet.

        funksjon resumeGame() (
        if (!supportsLocalStorage()) ( return usann; )
        gGameInProgress = (localStorage["halma.game.in.progress"] == "true");
        if (!gGameInProgress) ( return false; )
        gPieces = new Array(kNumPieces);
        for (var i = 0; i< kNumPieces; i++) {
        var row = parseInt(localStorage["halma.piece." + i + ".row"]);
        var column = parseInt(localStorage["halma.piece." + i + ".column"]);
        gPieces[i] = ny celle(rad, kolonne);
        }
        gNumPieces = kNumPieces;
        gSelectedPieceIndex = parseInt(localStorage["halma.selectedpiece"]);
        gSelectedPieceHasMoved = localStorage["halma.selectedpiecehasmoved"] == "true";
        gMoveCount = parseInt(localStorage["halma.movecount"]);
        drawBoard();
        return true;
        }

        Den viktigste delen av denne funksjonen er en advarsel som jeg nevnte tidligere i dette kapittelet og vil gjenta her: data lagres som strenger. Hvis du lagrer noe annet enn strenger, må du konvertere dem når du mottar dem. For eksempel er flagget som et spill pågår (gGameInProgress) en boolsk type. I saveGameState()-funksjonen lagrer vi den ganske enkelt og bekymrer oss ikke for datatypen.

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

        Men i funksjonen resumeGame() må vi se på verdien hentet fra lokal lagring som en streng og manuelt konstruere vår egen boolske verdi.

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

        På samme måte lagres antall trekk i gMoveCount som et heltall, i saveGameState()-funksjonen lagrer vi det ganske enkelt.

        localStorage["halma.movecount"] = gMoveCount;

        Men i funksjonen resumeGame() må vi konvertere verdien til et heltall ved å bruke JavaScripts innebygde parseInt()-funksjon.

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

        Utover nøkkel-/verdipar: Konkurransedyktig visjon

        Selv om det har vært mange triks og løsninger gjennom historien, er den nåværende tilstanden til HTML5-lagring overraskende sunn. Det nye API-et er standardisert og inkludert i alle større nettlesere, plattformer og enheter. For en webutvikler er det ikke noe du ser hver dag, er det vel? Men det er mer enn "5 megabyte nøkkel/verdi-par" og fremtiden for vedvarende lokal lagring er... hvordan skal jeg si det... vel, la oss si at det er en konkurransevisjon.

        En visjon er et akronym du allerede kjenner - SQL. I 2007 lanserte Google Gears, en åpen kildekodeplugin for flere nettlesere som inkluderer en innebygd SQLite-basert database. Denne tidlige prototypen påvirket senere opprettelsen av Web SQL Database-spesifikasjonen. Web SQL Database (tidligere kjent som "WebDB") gir en tynn omslag rundt en SQL-database som lar deg gjøre følgende ting fra JavaScript:

        openDatabase("dokumenter", "1.0", "Lokal dokumentlagring", 5*1024*1024, funksjon (db) (
        db.changeVersion("", "1.0", funksjon (t) (
        t.executeSql("CREATE TABLE docids (id, name)");
        ), feil);
        });

        Som du kan se, er det meste av handlingen i tråd med ExecuteSQL-metoden. Denne strengen kan støtte enhver SQL-kommando, inkludert SELECT, UPDATE, INSERT og DELETE. Det er akkurat som databaseprogrammering på serversiden, bortsett fra at du gjør det med JavaScript! Å glede!

        Web SQL-databasespesifikasjonen er implementert i fire nettlesere og plattformer.

        Web SQL databasestøtte
        Dvs. Firefox Safari Chrome Opera iPhone Android
        4.0+ 4.0+ 10.5+ 3.0+ 2.0+

        Selvfølgelig, hvis du har brukt mer enn én database i livet ditt, vet du at "SQL" er mer et markedsføringsbegrep enn en hard og rask standard (noen vil kanskje si det samme om HTML5, men det spiller ingen rolle) . Selvfølgelig er det en gjeldende SQL-spesifikasjon (kalt SQL-92), men det er ingen databaseserver i verden som kun samsvarer med denne spesifikasjonen. Det er Oracle SQL, Microsoft SQL, SQL i MySQL, SQL i PostgreSQL, SQL i SQLite. Faktisk legger hvert av disse produktene til ny SQL-funksjonalitet over tid, så selv å si "SQL i SQLite" er ikke nok. Du bør si "versjon av SQL som følger med SQLite versjon X.Y.Z".

        Alt dette bringer oss til neste ansvarsfraskrivelse, som for øyeblikket er lagt ut øverst i Web SQL-spesifikasjonen.

        Spesifikasjonen har nådd en blindvei: alle interesserte utviklere bruker server-side SQL (SQLite), men vi trenger flere uavhengige implementeringer for å gå mot standardisering. Mens andre utviklere er interessert i å implementere denne spesifikasjonen, har SQL-dialektbeskrivelsen blitt stående som en ren referanse til Sqlite, som ikke er akseptabelt for standarden.

        Det er på denne bakgrunnen jeg vil fortelle deg om en annen konkurransedyktig visjon for den avanserte, vedvarende lokale lagringen for webapplikasjoner: Indexed Database API, tidligere kjent som "WebSimpleDB", nå kjærlig kalt IndexedDB.

        Indexed Database API gir det som kalles objektlagring, med mange ideer lånt fra SQL-databaser. Det er "databaser" med "poster", hver post har et visst antall "felt". Hvert felt har en bestemt datatype, som bestemmes når databasen opprettes. Du kan velge et undersett av poster, og deretter liste dem opp med "markøren". Endringer i objektlageret behandles med «transaksjoner».

        Hvis du noen gang har programmert SQL-databaser, er disse begrepene sannsynligvis kjent for deg. Hovedforskjellen er at objektlagring ikke har et strukturert spørrespråk. Du skriver ikke en betingelse som "SELECT * from USERS der ACTIVE = "Y"". I stedet bruker vi metodene gitt av objektlageret for å åpne USERS-databasen, telle opp postene, filtrere postene våre og bruke tilgangsmetoder for å få verdien av hvert felt av de gjenværende postene. En tidlig gjennomgang av IndexedDB er en god veiledning om hvordan IndexedDB fungerer og hvordan IndexedDB sammenlignes med Web SQL.

        I skrivende stund har IndexedDB bare blitt implementert i Firefox 4 beta. Derimot har Mozilla uttalt at den aldri vil implementere Web SQL. Google har uttalt at de vurderer IndexedDB-støtte for Chromium og Google Chrome. Og til og med Microsoft sa at IndexedDB er "en flott løsning for nettet."

        Hva kan du gjøre som webutvikler med IndexedDB? For øyeblikket nesten ingenting bortsett fra noen teknologidemonstrasjoner. Om et år? Kanskje.