Když jste chtěli s webem psaným v HTML 4.01 uložit nějaká data do počítače uživatele, měli jste prakticky k dispozici pouze cookies. Ty jsou ovšem použitelné jen pro velmi krátké informace, například o přihlášení uživatele nebo o nějakém nastavení. Při načtení stránky jsou prohlížečem posílány do webu.
Další možnost nabízely různé pokusy ala Google Gears - určitě si pamatujete na offline podobu Gmailu nebo Google Docs, které potřebovaly právě Google Gears.
HTML5 přichází s mnohem lepším konceptem lokálního ukládání, než jsou cookies, a tato technologie je zabudována přímo v prohlížečích, které HTML5 podporují. Místní úložiště v HTML5 nabídne webové stránce kapacitu několik MB (podle prohlížeče od 3 do 5 MB) a na rozdíl od cookies z něj nejsou data odesílána na web automaticky při načtení stránky. Ke komunikaci dochází až ve chvíli, kdy si stránka načtení nebo zápis dat vyžádá. Samozřejmě se web dostane jen k těm datům, která mu patří.
Místní úložiště je v HTML5 k dispozici ve dvou variantách. V článku vám ukážu práci s localStorage, které ukládá data na neomezenou dobu. Úplně stejným způsobem se pak pracuje také se sessionStorage. Rozdíl je v tom, že ve druhém případě dojde k odstranění dat poté, co uživatel zavře okno prohlížeče. S oběma úložišti pracujete pomocí JavaScriptu.
Podívejme se tedy na jednoduché využití localStorage, které poslouží k ukládání rozpracovaného článku. Každému z nás se asi někdy stalo, že při psaní nějakého textu do redakčního systému nebo jinde na webu spadl prohlížeč. Čím více textu jste měli ve formuláři, tím více budete rozladěni z toho, že po pádu prohlížeče nebo jeho nechtěném zavření budete muset text psát znovu. S využitím localStorage můžete obsah formuláře ukládat na disk počítače na neomezenou dobu, přečká zavření prohlížeče a především jeho ukládání nebo načítání nevyžaduje žádnou komunikaci se serverem - je tedy maximálně rychlé.
Připravte si formulář
Začněme tím, že si připravíme formulář. Zrecykloval jsem ukázku z minulého článku o HTML5, kdy jsme se dívali na možnosti stylování formuláře. HTML kód tedy bude následující:
<form> <label for=nadpis>Nadpis článku</label> <input type=text name=nadpis id=nadpis required> <br><br> <label for=clanek>Text článku</label> <textarea name=clanek id=clanek required rows=10></textarea> <br><br> <label for=url>URL adresa článku</label> <input type="url" pattern="https?://.+" name=url id=url required> <br><br> <input type=submit value=Odeslat class=submit> <button type=button onclick="save();">Uložit koncept</button> <button type=button onclick="load();">Načíst koncept</button> <span class=cleaner></span> <div id=status></div> </form>
Formulář se skládá ze dvou vstupních políček input a jedné textové oblasti, ke každému je přiřazen popisek label. Všechny položky formuláře jsou povinné k vyplnění, což zajistí atribut required. Pokud uživatel nevyplní data, formulář se neodešle.
Připomínám, že v HTML5 je k dispozici celá řada nových typů prvku input. V ukázce vidíte typ url - prohlížeče s dotykovým ovládáním jej dovedou rozpoznat a upravit klávesnici na obrazovce tak, aby uživatel mohl například rychle zadat doménu v adrese webu.
Dále je zde atribut pattern sloužící k rychlému ověřování vstupu uživatele. V tomto případě jej použijeme k ověření, zda uživatel zadal webovou adresu. Ověření probíhá v prohlížeči, ještě před odesláním na server. Není třeba psát nějakou JavaScriptovou obsluhu, vše vyřeší jen správný regulární výraz v atributu pattern. Více o tomto ověřování v článku Formuláře v HTML5: nové typy polí a automatická validace.
Následuje odesílací tlačítko, tedy opět prvek input s typem submit. K němu přidejte ještě dvě tlačítka button, která poslouží pro ukládání dat do localStorage a pro jejich načítání do formuláře. Posledním prvkem bude značka DIV, do které budeme psát různé informace po stisku tlačítek.
Opáčko: CSS3 pro formulář v HTML5
V článku Úprava vzhledu formuláře v HTML5 pomocí CSS3 jsme se dívali na stylování formulářů s využitím nových technik v HTML5. Formulář tedy z větší části zrecyklujeme i se styly z minula:
body{ font-family: Arial; font-size: 12px; color: #333; } form{ background: #F8F8F8; margin: 10px; padding: 10px; width: 400px; background-image: linear-gradient(bottom, rgb(153,153,153) 44%, rgb(204,204,204) 72%); background-image: -o-linear-gradient(bottom, rgb(153,153,153) 44%, rgb(204,204,204) 72%); background-image: -moz-linear-gradient(bottom, rgb(153,153,153) 44%, rgb(204,204,204) 72%); background-image: -webkit-linear-gradient(bottom, rgb(153,153,153) 44%, rgb(204,204,204) 72%); background-image: -ms-linear-gradient(bottom, rgb(153,153,153) 44%, rgb(204,204,204) 72%); background-image: -webkit-gradient(linear,left bottom,left top,color-stop(0.44, rgb(153,153,153)),color-stop(0.72, rgb(204,204,204))); -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; -webkit-box-shadow: 1px 1px 1px 1px #ccc; -moz-box-shadow: 1px 1px 1px 1px #ccc; box-shadow: 1px 1px 1px 1px #ccc; } label{ font-weight: bold; width: 150px; } input, textarea{ width: 100%; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; border: none; padding: 3px; } input:valid, textarea:valid { background: #ccffcc; } input:invalid, textarea:invalid { background: #ffcccc; } input.submit, input.submit:valid{ border: #fff; color: #fff; cursor: pointer; font-weight: bold; background: #0066CC; text-transform: uppercase; float: right; width: auto; padding: 5px 10px; background-image: linear-gradient(bottom, rgb(0,102,204) 44%, rgb(87,171,255) 72%); background-image: -o-linear-gradient(bottom, rgb(0,102,204) 44%, rgb(87,171,255) 72%); background-image: -moz-linear-gradient(bottom, rgb(0,102,204) 44%, rgb(87,171,255) 72%); background-image: -webkit-linear-gradient(bottom, rgb(0,102,204) 44%, rgb(87,171,255) 72%); background-image: -ms-linear-gradient(bottom, rgb(0,102,204) 44%, rgb(87,171,255) 72%); background-image: -webkit-gradient(linear,left bottom,left top,color-stop(0.44, rgb(0,102,204)),color-stop(0.72, rgb(87,171,255))); margin: 0px 2px; } button{ border: #fff; color: #fff; cursor: pointer; font-weight: bold; background: #333; text-transform: uppercase; float: right; padding: 5px 10px; margin: 0px 2px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .cleaner{ clear: both; display: block; }
Styly už nebudu podrobně komentovat a odkáži vás na zmíněný článek. Jen ve stručnosti. U definice vzhledu formuláře používáme nový zápis pro nastavení přechodové výplně bez toho, že by bylo nutné používat nějaký fyzický obrázek jako podklad. Objevuje se zde také nastavení zaoblených rohů a stínování.
Od minula přibylo jen pár nových definic. Vysvětlení si zaslouží selectory :valid a :invalid. S jejich pomocí můžete různě nastylovat formulářová políčka podle toho, zda obsahují hodnotu vyhovující validátoru. V naší ukázce jsou tedy nevyhovující políčka (:invalid) podbarvena červeně a vyhovující (:valid) zeleně.
Jelikož je každé pole nutné vyplnit, jsou při načtení formuláře všechna červená. Jakmile do nich zadáte alespoň jeden znak, podkres se změní na zelený. Navíc, u políčka pro zadání url je ještě ověřovací vzorek v atributu pattern, takže pole se podbarví zeleně až v momentě, kdy do něj vložíte správně zadanou adresu.
Formulář by tedy měl vypadat následovně:
Formulář v HTML5 s podbarvováním vyhovujících hodnot
Ukládání a načítání dat z localStorage
Formulář máme, zbývá k tlačítkům pro jeho ukládání a načítání doplnit funkcionalitu. Do události onclick jsme u tlačítek button přidali volání JavaScriptových funkcí save() a load(). Do hlavičky webu (nebo klidně do samostatného souboru) tedy doplníme definici těchto funkcí, které budou pracovat s HTML5 úložištěm localStorage.
function save(){ if (localStorage) { localStorage.nadpis = document.getElementById('nadpis').value; localStorage.clanek = document.getElementById('clanek').value; localStorage.url = document.getElementById('url').value; document.getElementById('status').innerHTML = 'Formulář byl uložen do lokálního úložiště.
'; } else{ alert('Váš prohlížeč bohužel nepodporuje místní úložiště'); } } function load(){ if (localStorage) { document.getElementById('nadpis').value = localStorage.nadpis; document.getElementById('clanek').value = localStorage.clanek; document.getElementById('url').value = localStorage.url; document.getElementById('status').innerHTML = 'Formulář byl načten z lokálního úložiště.
'; } else{ alert('Váš prohlížeč bohužel nepodporuje místní úložiště'); } }
Struktura obou funkcí je podobná. V první řadě pomocí podmínky ověříme, zda prohlížeč localStorage podporuje. Pokud ne, zobrazíme uživateli upozorňující hlášku. S úložištěm můžete pracovat velmi jednoduše. Při ukládání prakticky stačí vzít objekt localStorage, za tečku doplnit označení hodnoty (klíč) a následně nějakou hodnotu přiřadit. Při čtení dat z localStorage přistupujete k údajům stejným způsobem, tedy localStorage.klíč.
V obou funkcích ještě po uložení nebo načtení dat z localStorage naplníme stavový DIV na spodu formuláře a uživateli zobrazíme informaci, že data byla načtena nebo uložena.
Zbývá vše jen vyzkoušet. Vyplňte formulář, uložte data, zavřete prohlížeč, znovu jej otevřete a ve formuláři zkuste data znovu načíst.
Možná vylepšení
Kromě naprosto jednoduchého ukládání a načítání dat podporuje localStorage (nebo i jeho zmíněná obdoba sessionStorage) další metody. Voláním localStorage.clear() můžete místní úložiště pro daný web vyprázdnit. Pomocí localStorage.length a localStorage.remainingSpace (funguje zatím jen v IE) zjistíte obsazené nebo volné místo v úložišti. Voláním localStorage.removeItem(klíč) můžete odstranit jednu hodnou z úložiště.
Do stavových informací po načtení nebo uložení dat můžete ještě doplnit jejich velikost, případně informaci o zbývajícím volném místě. Dalším vylepšením by mohlo být automatické ukládání bez toho, že by uživatel musel ručně kliknout na tlačítko. Stačí napsat nějakou JavaScriptovou obsluhu. A samozřejmě pro univerzální použití by bylo vhodné doplnit smyčky pro procházení všech polí ve formuláři místo toho, abyste je ručně definovali do ukládacích a načítacích funkcí.
Další informace o úložištích zjistíte na adrese dev.w3.org/html5/webstorage. V příloze článku najdete jako vždy soubor s kompletní ukázkou.
Příloha | Velikost |
---|---|
html5_localstorage.html_.zip | 1.33 KB |
Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.
Přidat komentář