Abstraindo.com

RSS Twitter Facebook

16
dez

E aí galerinha, como estão?

Hoje eu vou mostrar como utilizar as interfaces SessionStorage e LocalStorage do HTML5.

Estas duas interfaces fazem parte da especificação Web Storage da W3C.

Esta API tem a finalidade de acabar com os famosos Cookies, salvando uma grande quantidade de informação no cliente e resgatando a informação salva de uma forma simples e segura.

Então vamos pensar em que funcionalidades a Storage API tem vantagem sobre os cookies. Vou listar algumas vantagens bem relevantes da Storage API:

  • Storage API pode salvar até 5MB de espaço no disco do usuário, enquanto os Cookies armazenam míseros 4kb;
  • Os dados não são trafegados a cada requisição do servidor, como acontece nos Cookies;
  • Funciona como um Array Associativo (key, value);
  • Diferente dos Cookies, não possui data de expiração (falarei sobre isso abaixo)

A SessionStorage e a LocalStorage possuem os seguintes métodos:

  • key(n) para retornar o nome da chave que está nesta posição da Storage
  • getItem(key) para retornar o valor associado a uma chave
  • setItem(key,value) para associar um determinado valor a uma chave, ou criar a chave e associar um valor a ela
  • removeItem(key) para remover determinada chave e o valor associado a ela
  • clear() para limpar o Storage

As duas interfaces além destes métodos possuem o atributo length, que mostra o número de chaves na interface.

Agora vocês devem estar pensando “As duas interfaces tem o mesmos atributos e métodos. Por que diabos existes as duas?”.

A diferença entre as duas interfaces está em quando os dados são expirados.

Na SessionStorage os dados salvos expiram quando o usuário fecha o navegador. Na LocalStorage os dados salvos simplesmente não expiram. Sim, os dados não tem data de expiração. Só são apagados quando o desenvolvedor ou o usuário os apagam.

Uma coisa importante é que se você deve ficar atento com o domínio que está sendo utilizado na sua aplicação. Uma Storage funciona apenas para o domínio corrente, diferente dos cookies. Então se eu salvar uma LocalStorage em http://hussani.com.br, o site http://www.abstraindo.com não terá acesso aos dados. O mesmo acontece quando você salva dados sem o “www.” e tenta acessar os dados em um endereço do mesmo domínio com o “www.” (exemplo: os dados salvos em http://www.abstraindo.com não podem ser acessados por http://abstraindo.com). Isso garante que os dados não fiquem abertos para que qualquer site vasculhe nas informações contidas nas Storages.

Então galera, cuidado com os endereços da sua aplicação.

A Storage API está disponível para IE8+, Firefox 5+, Chrome 4+, Safari 4+, Opera 10.5+, e também está disponível em todas as versões de Android Browser e iOS Safari. Então vamos codar!

Vamos colocar a mão na massa com uma pequena demonstração. Vocês podem ver a demostração aqui.

Nesta demonstração é apresentado um exemplo simples de como usar a interface LocalStorage. Poderíamos utilizar SessionStorage também, o resultado seria o mesmo.

Só irei colocar as partes importantes do código e se vocês quiserem o código da demonstração completa podem baixar aqui.

Esta é a estrutura principal da página

    <div class="wrapper">
        <section id="com-storage" class="box-list">
            <h3>Com Local Storage</h3>
            <ul id="stored-list" contenteditable="true">
                <li></li>
            </ul>
            <button id="clear">Limpar</button>
        </section>

        <section id="sem-storage" class="box-list">
            <h3>Sem Local Storage</h3>
            <ul id="not-stored-list" contenteditable="true">
                <li> </li>
            </ul>
        </section>
    </div>

Neste bloco criamos duas seções com listas editáveis. Em um usaremos a LocalStorage para salvar os dados e na outra não usaremos nenhum Storage.

Agora vamos montar o Storage. Utilizei o jQuery para auxiliar na manipulação de JavaScript, nada difícil, e a biblioteca Modernizr para verificar se o browser tem suporte a API de Storage. Para verificar se há suporte fiz desta forma:

$(function(){
  if(Modernizr.localstorage){
    /* codigo aqui */
  }else{
/* callback se o browser não suportar a localstorage */
}
});

Simples, não é?
Vamos agora salvar os dados da lista quando o usuário editá-la

$("#stored-list").keypress(function(){
  localStorage.setItem('minha-lista', $("#stored-list").html());
});

O que eu fiz acima: quando algo for alterado na lista com o id “stored-list” eu salvo o conteúdo html da lista em um localstorage com a chave “minha-lista”.

Pronto já salvamos conteúdo em um LocalStorage. \o/

Agora vamos recuperar o valor da chave “minha-lista” sempre que página for recarregada.

if(localStorage.getItem('minha-lista')){
  $('#stored-list').html(localStorage.getItem('minha-lista'));
}

Note que antes de retornar o valor, nós verificamos se existe algo relacionado a chave. Se houver algum valor ele é escrito dentro da lista.

Pronto! Agora nós conseguimos salvar os conteúdos e conseguimos resgatar eles. Mas e se eu quiser apagar a lista e fazer uma nova?

$('#clear').click(function(){
  localStorage.clear();
  $('#stored-list').html('<li> </li>');
});

Muito simples também! Quando eu clicar no botão com id “clear” eu aciono o método clear que apaga todos os dados do LocalStorage.

Como só utilizamos uma chave para armazenar a lista, podemos apagar ela de uma outra forma:

$('#clear').click(function(){
  localStorage.removeItem('minha-lista');
  $('#stored-list').html('<li> </li>');
});

Isso apaga apenas a chave “minha-lista” e seu conteúdo.

Bem galera, acho que é isso. Espero que vocês tenham gostado.

Qualquer dúvida, crítica ou aflição deixe um comentário.

Até a próxima pessoal.

, ,

14:30 - 16 de dezembro de 2011
  • squiter disse:
    16 de dezembro de 2011 às 15:53

    Grande post Hussani! Eu não conhecia essa feature do HTML 5 =D

  • @osuissa disse:
    16 de dezembro de 2011 às 16:25

    Muito bom o artigo, espero que mais pessoas possam usar. Eu ja escrevi um artigo para o iMasters com alguns exemplos a mais sobre isso, acharia interessante vc escrever sobre a parte de trasnformação de JSON em strings para que possam ser armazenadas.

  • @osuissa disse:
    16 de dezembro de 2011 às 16:27

    Ah estou lendo este artigo no exato momento em que estou escrevendo um activeRecord para os diferentes Storages em js.

  • Hussani disse:
    16 de dezembro de 2011 às 17:43

    Grande Suissa!
    Obrigado pelo feedback!
    O conteúdo do post é bem introdutório mesmo, apenas para o pessoal ver como funciona.
    Mas vou apresentar abordagens mais específicas em um outro post.
    Implementações mais avançadas sempre despertam curiosidade, vou aproveitar disso também. :D

Deixe seu comentário




(*)campos obrigatórios.



Stop SOPA