Bygg vedvarende klebrig notater med lokal lagring

HTML5 lokal lagring er som informasjonskapsler på steroider; det er utrolig enkelt å bruke og likevel så kraftig. I denne veiledningen vil jeg vise deg hvordan du lager "klebrig notater" -funksjonalitet, som gjør det mulig for brukerne å ta vedvarende notater mens du surfer på nettstedet ditt.


Trinn 1: HTML

På grunn av den dynamiske naturen til dette prosjektet, er det ikke veldig mye å kode i vei for vanlig gammelt semantisk oppslag. Vi simulerer bare en nettside ved å sette sammen noe fillerinnhold:

     HTML 5 komplett      

Eksempel Artikkel Tittel

Lorem ipsum dolor ...

Copyright 2010 Andrew Burgess

Det er noen viktige ting å legge merke til her: Vi inkluderer to CSS-filer: Den første er den enkle stylingen til siden, som vi har ringt default.css. Deretter har vi spesielle CSS-filer for stiler knyttet til våre klebrig notater; det heter stickies.css, og som du kan se, lever den i mappen "stickies". I bunnen inneholder vi fire skript:

  • jQuery, fra Googles CDN
  • JQuery brukergrensesnitt, fra Googles CDN
  • JSON2, fra Douglas Crockford
  • Vår egen stickies.js, som bor i "stickies" katalogen

Deretter har vi et tomt skript som vi skal bruke for å starte motoren litt senere.

Og det er det for HTML!


Trinn 2: CSS

Innholdet i default.css er utrolig enkelt:

 kropp margin: 0; padding: 0; bakgrunn: #ccc; font: 14px / 1.5 "Helvetica Neue", Helvetica, Arial, san-serif;  artikkel, bunntekst, overskrift display: block;  artikkel bredde: 880px; bakgrunn: #fff; margin: auto; padding: 40px;  artikkeloverskrift farge: # 474747; border-bottom: 1px solid # 474747 artikkelfodre font-size: 90%; farge: #ccc; 

Det er det; nå er det CSS fra stickies.css å ta vare på ... men vi har ikke den merkingen ennå. Så la oss starte litt JavaScript, og når det er gjort, ser vi på CSS for de notatene.


Trinn 3: JavaScript

Her er skjelettet for JavaScript-programmet vårt:

 var STICKIES = (funksjon () var initStickies = funksjon () , openStickies = funksjon () , createSticky = funksjon (data) , deleteSticky = funksjon (id) , saveSticky = function ()  , markUnsaved = function () ; return open: openStickies, init: initStickies; ());

Vi har noen interessante teknikker på gang her. Først er den selvbetjente funksjonen: Det kan se ut som om vi tilordner en funksjon til variabelen Huskelapper, men hvis du ser nøye på slutten av funksjonen, ser du at vi kjører den med en gang. Som et hint - å minne oss om at dette ikke er en vanlig funksjon - vi pakker hele funksjonen i parentes. Så, Huskelapper er ikke en funksjon, det er den returnerte verdien fra den funksjonen, som er et objekt, i dette tilfellet.

Det bringer oss til neste teknikk: lukking. Legg merke til at de seks funksjonene vi lager, er kun to av dem utsatt for brukeren (egentlig er bare en nødvendig for bruken vi planlegger, hvis vi ønsket å bygge støtte for å lage notater på nettstedet ditt, kunne vi avsløre createSticky og deleteSticky). Selv om selve involveringsfunksjonen er fullført før vi selv bruker metodene, kan vi bruke de andre funksjonene som vi har definert.

Ok, la oss gå videre til innholdet i denne funksjonen.


initStickies

Vi starter med å se på initStickies funksjon:

 var initStickies = funksjon initStickies () $ ("
", text:" + "," class ":" add-sticky ", klikk: funksjon () createSticky ();) prependTo (document.body); initStickies = null;,

Dette er ganske enkelt. Vi bruker jQuery til å lage elementer ganske mye, og vi bruker noen spesielle syntaks i v. 1.4: som passerer et objekt bokstavelig med spesifikasjonene for elementet som en andre parameter til jQuery-funksjonen. Her lager vi en knapp for å lage et nytt notat. Det betyr at vi trenger en ny div; Vi setter teksten til "+" og gir den en klasse "add-sticky"; så setter vi inn en klikkbehandler for å ringe createSticky metode (det er viktig å ringe createSticky fra innsiden av en funksjon, og ikke ha klikkhåndteringsanropet direkte til createSticky; Dette er fordi createSticky kan ta en enkelt parameter, og vi vil ikke at det skal være hendelsesobjektet). Til slutt forbereder vi dette div til kroppen. Vi slutter ved å sette inn initStickies til null; Ja, vi blir i hovedsak kvitt funksjonen som vi kjører. Dette forsikrer oss om at denne funksjonen kun vil bli kjørt en gang; Vi vil ikke at brukeren av API-en vår skal utilsiktet legge til flere "legg til notat" knapper til side.

openStickies

La oss gå videre til neste metode, openStickies:

 openStickies = funksjon openStickies () initStickies && initStickies (); for (var i = 0; i < localStorage.length; i++)  createSticky(JSON.parse(localStorage.getItem(localStorage.key(i))));  ,

Vi begynner med å løpe initStickies... men hva med den fancy syntaksen? Vel, du er sikkert kjent med && operatør: den boolske AND-operatøren. Du vil vanligvis bruke den til å sjekke flere forhold i en if-setning. Her er det det egentlig gjør: det evaluerer det første uttrykket, og hvis det kommer ut i sannhet, vil det fortsette å evaluere det andre uttrykket. I dette tilfellet, hvis initStickies har ikke blitt satt til null ennå, vi kjører funksjonen. Dette unngår feilen som vil komme fra å prøve å kjøre null-variabel som en funksjon.

Deretter slår vi over hvert element i localStorage. Her er hva vi gjør i den for-loop (fra innsiden til utsiden):

  • localStorage.key () er en flott funksjon som returnerer nøkkelnavnet til lokal lagring verdi; det tar et nummer som en paramter. Det er en fin måte å løse over hvert element i lokal lagring.
  • Når vi har nøkkelen til et lagret element, kan vi sende det til localStorage.getItem () for å få sin verdi.
  • Så sender vi den verdien til JSON.parse (); Dette kommer fra Crockfords bibliotek. Fordi vi lagrer noen verdier for hvert notat, bruker vi JSON.stringify () i den andre enden for å snu et objekt inn i en JSON-streng, som vi lagrer. Her konverterer vi det fra en streng tilbake til et objekt.
  • Til slutt sender vi det objektet til createSticky (), som setter det tilbake i en klebrig notat.

createSticky

La oss se på det createSticky metode.

 createSticky = funksjon createSticky (data) data = data || id: + ny dato (), topp: "40px", venstre: "40px", tekst: "Merk her" returnere $ ("
", " klasse ":" klebrig "," id ": data.id) .prepend ($ ("
", " class ":" klebrig-header ") .append ($ ("", " class ":" status-sticky ", klikk: saveSticky)) .append ($ ("", " class ":" close-sticky ", tekst:" søppel ", klikk: funksjon () deleteSticky ($ (this) .parents (" klistret "). attr (" id ")) ))) .append ($ ("
", html: data.text, contentEditable: true," class ":" klebrig innhold ", tastetrykk: markUnsaved)) .draggable (håndtak:" div.sticky-header ", stakk:" .sticky " start: markUnsaved, stop: saveSticky) .css (posisjon: "absolutt", "topp": data.top, "left": data.left) .focusout (saveSticky) .appendTo (document.body);,

Ja, det er lenge, men det kommer ikke til å bli for vanskelig. Merk først at denne funksjonen tar et dataobjekt; som vi nettopp så i openStickies, Vi overfører de lagrede dataene til denne funksjonen. Men hvis vi ikke overfører noen data (det vil si, vi lager et helt nytt notat), oppretter vi standardnotatobjektet. Siden alle notater må opprettes på et tidspunkt, begynner alle notater med denne konfigurasjonen. Legg merke til at for notat-ID, bruker vi +ny dato (); den prepended unary pluss operatøren konverterer datoen vi kommer fra ny dato til et tall, så denne setningen resulterer i et tall som representerer antall millisekunder siden 1. januar 1970. Åpenbart vil dette nummeret hele tiden skiftes, så det er en fin måte å Unikt identifisere hver notat.

Resten av funksjonen er en lang rekke kjedede jQuery-metoder. Før vi går gjennom dette, merk at vi returnerer resultatet. Hvis vi eksponerte denne metoden for utviklere ved hjelp av vår mirco-API, ville den returnere en referanse til notat div-elementet.

Så, her er det som skjer:

  • Først oppretter vi div det er skikket av notatet. Ved hjelp av den nyttige jQuery 1.4-syntaksen, gir vi den en klasse av "klebrig" og idet fra dataobjektet.

  • Så prepper vi en div til den ene; dette div får en klasse "klebrig-header". div.sticky-header så får to spenner festet til den. Den første, span.sticky-status, får en klikkbehandler som ringer til saveSticky funksjon. Det er imidlertid en skjult funksjon: Dette spekteret vil vise statusen til den klissete: lagret eller ikke lagret. Det vil være noen måter de klistrede lagrer sine data til lokal lagring; Det er mulig at brukeren vil tro at å klikke på "ikke-lagret" vil lagre notatet, så vi vil gi dem den funksjonaliteten. Det andre spekteret, span.close-klebrig, vil være sletteknappen: Når brukeren klikker på den, fjerner vi klistren fra lokal lagring, via deleteSticky metode. Vi overfører denne metoden notat-ID.

  • Deretter legger vi til en annen div til hoveddelen div.sticky; Legg merke til at vi satte html eiendom til data.text; Når vi lagrer notatets tekst, bruker vi jQuery's html () metode, fordi du bruker tekst() blir kvitt linjeskift. Vi har også satt contenteditable: true på denne div, fordi det er innholdet i notatet. Som sådan blir det også klassen klebrig-innhold. Til slutt, når en nøkkel er trykket på denne diven (som betyr at brukeren endrer innholdet), vil vi markere det som ikke-lagret, så vi ringer den funksjonen (som vi gjør snart).

  • Nå bruker vi jQuery UI-trekkbar funksjonen for å gjøre vårt klebrig notat flyttbart. I vår parameterobjekt bruker vi håndtak eiendom for å gjøre notatene våre bare flyttbare fra topplinjen. De stable Egenskapen er en velger for de trekkbare elementene som vil "stable"; Ved å sette dette, vil det øyeblikkelig slepede notatet alltid komme til toppen. Til slutt, når vi begynner å dra notatet, vil vi markere det som "ikke lagret" (fordi vi må lagre koordinatene også), og når vi slutter å dra, lagrer vi det klebrig.

  • Deretter setter vi inn noen stiler for våre div.sticky; Vi posisjonerer det absolutt, og deretter setter du topp og venstre verdier til de i dataobjektet. På denne måten vil notatet beholde sin posisjon, så vel som innholdet når vi oppdaterer siden.

  • Endelig vil vi sette en hendelsehandler for når vi focusout av den klissete (i hovedsak, klikk utenfor den etter å ha klikket inni den): Vi vil redde den klissete. Til slutt legger vi det til kroppen. Til referanse, her er html-strukturen som vi burde ha generert:

søppel
Merk her

Og det er vårt createSticky funksjon.

deleteSticky

Nå har vi deleteSticky funksjon; det er veldig enkelt:

 deleteSticky = funksjon deleteSticky (id) localStorage.removeItem ("sticky-" + id); $ ("#" + id) .fadeOut (200, funksjon () $ (dette) .remove ();); ,

Som du husker, deleteSticky funksjonen tar ID for et notat som parameter. localStorage.removeItem () er metoden for timen: Vi sender den nøkkelen til en lokalt lagret verdi for å fjerne det nøkkelverdige paret (Legg merke til at når vi lagrer notatdataene, forbereder vi seg "klistrende" til id). Deretter finner vi elementet med det oppgitte id, blekner det vår, og fjerner det. Merk slettet!

saveSticky

Til sist kan det være den viktigste metoden i dag: saveSticky: Dette er limet som gjør det hele til å fungere.

 saveSticky = function saveSticky () var det = $ (dette), klebrig = (that.hasClass ("klebrig status") || that.hasClass ("klebrig innhold"))? that.parents ('div.sticky'): det, obj = id: sticky.attr ("id"), topp: sticky.css ("top"), venstre: sticky.css ("left"), tekst : sticky.children ("klebrig innhold"). html () localStorage.setItem ("sticky-" + obj.id, JSON.stringify (obj)); . Sticky.find ( "klebrig-status ") tekst (" frelst"); ,

Den første linjen er litt oppløsning: det er tre forskjellige elementer vi kan ringe denne funksjonen fra. Først vil vi "jQuerify" dette inn i at; da, hvis elementet har enten klassen "klebrig status" eller "klebrig innhold", får vi foreldre div.sticky; hvis det ikke har noen av disse klassene, så er det det div.sticky selv, så bruker vi bare det.

Da må vi få verdiene vi ønsker å lagre. Som du kan se, får vi id, offset fra toppen og venstre, og barnets html .klebrig-innhold; husk, vi bruker html () i stedet for tekst() fordi vi ønsker å holde linjen bryter. Så bruker vi localStorage.setItem å lagre dataene. Husk at det tar to parametere: nøkkelen og verdien som skal lagres. Siden lokal lagring bare lagrer strenge, vi bruker JSON.stringify () å konvertere objektet til en streng.

Til slutt, endre klistrestatusen til "lagret".

markUnsaved

Vi har en siste funksjon, som bare er en hjelperfunksjon:

 markUnsaved = funksjonsmerkeUnsaved () var that = $ (this), sticky = that.hasClass ("klebrig innhold")? that.parents ("div.sticky"): det; sticky.find ( "klebrig-status. ") tekst (" ulagret."); 

Igjen må vi begynne å løse referansen til div.sticky; Når vi gjør det, kan vi bare finne status spannet og sette teksten til "ikke lagret".

Tro det eller ei, det er alt JavaScript.


Trinn 4: CSS, Revisited

Nå som vi vet hva vårt notatoppslag er, kan vi stile det. Det er ganske enkelt; men se det over, og jeg vil komme med noen kommentarer på slutten:

 : fokus disposisjon: 0;  .add-sticky cursor: default; stilling: absolutt; top: 1px; venstre: 1px; font-size: 200%; bakgrunn: # 000; farge: #fff; grense: 2px solid #fff; border-radius: 40px; -webkit-border-radius: 40px; -moz-border-radius: 40px; tekst-Justering: center; linje-høyde: 25px; bredde: 30px; høyde: 30px;  .add-sticky: svever bakgrunn: # 474747;  .sticky bredde: 300px; bakgrunn: #fdfdbe; boks-skygge: 3px 3px 10px rgba (0,0,0,0,45); -webkit-boks-skygge: 3px 3px 10px rgba (0,0,0,0,45); -moz-boks-skygge: 3px 3px 10px rgba (0,0,0,0,45);  .ticky-innhold min-høyde: 150px; border-left: 3px dobbel rgba (238, 150, 122, 75); margin-left: 30px; padding: 5 px;  .sticky-header padding: 5px; bakgrunn: # f3f3f3; border-bottom: 2px solid #fefefe; boksskygge: 0 3px 5px rgba (0,0,0,0,25); -webkit-boks-skygge: 0 3px 5px rgba (0,0,0,0,25); -moz-boks-skygge: 0 3px 5px rgba (0,0,0,0,25);  .sticky-status farge: #ccc; padding: 5 px;  .close-sticky bakgrunn: # 474747; float: right; markøren: default; farge: #ececec; polstring: 1px 5px; border-radius: 20 piksler; -webkit-border-radius: 20 piksler; -moz-border-radius: 20 piksler; 

Det er noen interessante steder her:

  • Noen nettlesere har en oversikt rundt elementene med contenteditable = true når du redigerer innholdet. Vi vil ikke ha det, så vi blir kvitt det med vår :fokus erklæring.
  • "Add Sticky" -knappen er plassert i øvre venstre hjørne; det ser vettig ut som "Legg til oversikten Widget" i Mac OS X.
  • Vi bruker grensedirektivet og boksskygge CSS3-egenskapene (og deres passende leverandør-prefiks inkarnasjoner).
  • Vi bruker også RGBA () for våre skyggefarger. Det tar fire parametre: de røde, grådige og blå farger, og alfa (gjennomsiktighets) -verdien.

Annet enn det, er det bare din standard CSS. Her er hva et stylet notat skal se ut som:


Trinn 5: Starte Stickies

Nå som vi har laget vår API, er det på tide å få det i gang. det kan vi gjøre fra den ekstra tomme manus tag i vår index.html fil:

 STICKIES.open ();

Konklusjon: Det endelige produktet

Vel, vi er ferdige! Her er det endelige produktet i aksjon:

Det er alt jeg har for i dag; hvordan planlegger du å bruke HTML5 lokal lagring for å spice opp dine webprosjekter? Gi meg beskjed i kommentarene!