<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos storage event html5 - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/storage-event-html5/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/storage-event-html5/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Wed, 21 Oct 2026 03:56:45 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://webzoneware.com/wp-content/uploads/icon-webzoneware-150x150.png</url>
	<title>Arquivos storage event html5 - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/storage-event-html5/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTML5 Web Storage: LocalStorage e Session &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-html/web-storage-localstorage-sessionstorage/</link>
					<comments>https://webzoneware.com/web-academy/curso-html/web-storage-localstorage-sessionstorage/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 03:56:45 +0000</pubDate>
				<category><![CDATA[Curso de HTML & HTML5]]></category>
		<category><![CDATA[html5 web storage]]></category>
		<category><![CDATA[localstorage javascript]]></category>
		<category><![CDATA[salvar dados no navegador]]></category>
		<category><![CDATA[sessionstorage html5]]></category>
		<category><![CDATA[storage event html5]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29343</guid>

					<description><![CDATA[<p>Antes da chegada do HTML5, a única maneira de persistir pequenas informações ou preferências do usuário no navegador era através dos tradicionais Cookies HTTP. No entanto, os cookies possuem um limite rígido de apenas 4 KB e, pior ainda, são enviados compulsoriamente nos cabeçalhos de rede a cada nova requisição (até mesmo ao carregar imagens [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/web-storage-localstorage-sessionstorage/">HTML5 Web Storage: LocalStorage e Session | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Antes da chegada do HTML5, a única maneira de persistir pequenas informações ou preferências do usuário no navegador era através dos tradicionais <strong>Cookies HTTP</strong>. No entanto, os cookies possuem um limite rígido de apenas 4 KB e, pior ainda, são enviados compulsoriamente nos cabeçalhos de rede a cada nova requisição (até mesmo ao carregar imagens e estilos). A <strong>HTML5 Web Storage API</strong> revolucionou esse cenário ao fornecer um mecanismo nativo de armazenamento chave-valor local de até 5 a 10 MB por domínio, mantendo os dados estritamente no cliente sem degradar o tráfego de rede.
</p>
<h2>1. A Diferença Fundamental: LocalStorage vs SessionStorage</h2>
<p>
    A especificação do Web Storage divide o armazenamento em dois mecanismos complementares que compartilham exatamente os mesmos métodos, diferindo apenas pelo seu ciclo de vida:
</p>
<div class="wzw-table-responsive">
<table class="wzw-tech-table">
<thead>
<tr>
<th>Característica</th>
<th>LocalStorage</th>
<th>SessionStorage</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Tempo de Vida</strong></td>
<td>Permanente. Sobrevive ao fechamento da aba, do navegador e à reinicialização do sistema operacional.</td>
<td>Temporário. Os dados são apagados automaticamente quando a aba específica é fechada.</td>
</tr>
<tr>
<td><strong>Sobrevive ao Reload (F5)?</strong></td>
<td>Sim, permanece intacto.</td>
<td>Sim, permanece intacto durante a mesma sessão.</td>
</tr>
<tr>
<td><strong>Compartilhamento entre Abas</strong></td>
<td>Compartilhado entre todas as abas e janelas da mesma origem (mesmo domínio/porta).</td>
<td>Isolado exclusivamente na aba onde foi criado (não vaza para outras abas).</td>
</tr>
<tr>
<td><strong>Capacidade Típica</strong></td>
<td>Em torno de 5 MB por origem.</td>
<td>Em torno de 5 MB por origem.</td>
</tr>
<tr>
<td><strong>Cenário Ideal</strong></td>
<td>Tema escuro/claro, preferências de layout e rascunhos persistentes.</td>
<td>Etapas de checkout, filtros de busca temporários e dados de um assistente de formulário.</td>
</tr>
</tbody>
</table>
</div>
<h2>2. Métodos Essenciais da API de Armazenamento</h2>
<p>
    Tanto o <code>window.localStorage</code> quanto o <code>window.sessionStorage</code> implementam a interface <code>Storage</code>:
</p>
    <div class="wzw-ide-card" id="wzw-code-21081" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">15 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-21081', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-21081', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// 1. Gravar um item (Chave, Valor)</span></span>
<span class="wzw-code-line">localStorage.<span class="wzw-tk-fn">setItem</span>(<span class="wzw-tk-str">&#039;preferenciaTema&#039;</span>, <span class="wzw-tk-str">&#039;dark&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 2. Recuperar um item (Retorna string ou null se não existir)</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> temaAtual = localStorage.<span class="wzw-tk-fn">getItem</span>(<span class="wzw-tk-str">&#039;preferenciaTema&#039;</span>);</span>
<span class="wzw-code-line">console.<span class="wzw-tk-fn">log</span>(temaAtual);<span class="wzw-tk-comment"> // ___WZW_STR_0___</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 3. Remover uma chave específica</span></span>
<span class="wzw-code-line">localStorage.<span class="wzw-tk-fn">removeItem</span>(<span class="wzw-tk-str">&#039;preferenciaTema&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 4. Limpar todos os registros do domínio de uma vez</span></span>
<span class="wzw-code-line">localStorage.<span class="wzw-tk-fn">clear</span>();</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 5. Saber quantos itens estão armazenados</span></span>
<span class="wzw-code-line">console.<span class="wzw-tk-fn">log</span>(localStorage.length);</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// 1. Gravar um item (Chave, Valor)
localStorage.setItem(&#039;preferenciaTema&#039;, &#039;dark&#039;);

// 2. Recuperar um item (Retorna string ou null se não existir)
const temaAtual = localStorage.getItem(&#039;preferenciaTema&#039;);
console.log(temaAtual); // &quot;dark&quot;

// 3. Remover uma chave específica
localStorage.removeItem(&#039;preferenciaTema&#039;);

// 4. Limpar todos os registros do domínio de uma vez
localStorage.clear();

// 5. Saber quantos itens estão armazenados
console.log(localStorage.length);</textarea>
        </div>
    </div>
    
<h2>3. Salvando Objetos e Arrays com JSON</h2>
<p>
    O Web Storage só aceita valores no formato de <strong>strings de texto puro</strong>. Se você tentar passar um objeto diretamente para o <code>setItem()</code>, o JavaScript converterá o dado para a inútil string <code>"[object Object]"</code>.
</p>
<p>
    Para contornar essa característica, usamos a serialização com <code>JSON.stringify()</code> ao salvar e a restauração com <code>JSON.parse()</code> ao ler:
</p>
    <div class="wzw-ide-card" id="wzw-code-47248" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">19 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-47248', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-47248', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-kw">const</span> configuracoesUsuario = {</span>
<span class="wzw-code-line">    nome: <span class="wzw-tk-str">&#039;Carlos Eduardo&#039;</span>,</span>
<span class="wzw-code-line">    notificacoes: <span class="wzw-tk-kw">true</span>,</span>
<span class="wzw-code-line">    idioma: <span class="wzw-tk-str">&#039;pt-BR&#039;</span>,</span>
<span class="wzw-code-line">    itensPorPagina: <span class="wzw-tk-num">25</span></span>
<span class="wzw-code-line">};</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// ❌ FORMA ERRADA:</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// localStorage.setItem(&#039;config&#039;, configuracoesUsuario); // grava &quot;[object Object]&quot;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// ✅ FORMA CORRETA (Serializando para texto JSON):</span></span>
<span class="wzw-code-line">localStorage.<span class="wzw-tk-fn">setItem</span>(<span class="wzw-tk-str">&#039;config&#039;</span>, JSON.<span class="wzw-tk-fn">stringify</span>(configuracoesUsuario));</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Recuperando e convertendo de volta para objeto real:</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> salvo = localStorage.<span class="wzw-tk-fn">getItem</span>(<span class="wzw-tk-str">&#039;config&#039;</span>);</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">if</span> (salvo) {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> objetoRestaurado = JSON.<span class="wzw-tk-fn">parse</span>(salvo);</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(objetoRestaurado.nome);<span class="wzw-tk-comment"> // ___WZW_STR_0___</span></span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>const configuracoesUsuario = {
    nome: &#039;Carlos Eduardo&#039;,
    notificacoes: true,
    idioma: &#039;pt-BR&#039;,
    itensPorPagina: 25
};

// ❌ FORMA ERRADA:
// localStorage.setItem(&#039;config&#039;, configuracoesUsuario); // grava &quot;[object Object]&quot;

// ✅ FORMA CORRETA (Serializando para texto JSON):
localStorage.setItem(&#039;config&#039;, JSON.stringify(configuracoesUsuario));

// Recuperando e convertendo de volta para objeto real:
const salvo = localStorage.getItem(&#039;config&#039;);
if (salvo) {
    const objetoRestaurado = JSON.parse(salvo);
    console.log(objetoRestaurado.nome); // &quot;Carlos Eduardo&quot;
}</textarea>
        </div>
    </div>
    
<h2>4. Código Prático Completo: Seletor de Tema Persistente (Dark Mode)</h2>
<p>
    No exemplo abaixo, implementamos a troca de tema visual da página. A escolha do usuário é gravada no <code>localStorage</code> e restabelecida automaticamente sempre que ele retornar ao site:
</p>
    <div class="wzw-ide-card" id="wzw-code-91129" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-91129', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-91129', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;wzw-theme-box&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3&gt;</span>🎨 Personalização de Tema da Página<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p&gt;</span>Alterne o modo de exibição. Sua escolha continuará ativa mesmo se fechar o navegador:<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;btnAlternarTema&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-theme&quot;</span><span class="wzw-tk-tag">&gt;</span>🌙 Ativar Modo Escuro<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;wzw-theme-box&quot;&gt;
    &lt;h3&gt;🎨 Personalização de Tema da Página&lt;/h3&gt;
    &lt;p&gt;Alterne o modo de exibição. Sua escolha continuará ativa mesmo se fechar o navegador:&lt;/p&gt;
    &lt;button id=&quot;btnAlternarTema&quot; class=&quot;btn-theme&quot;&gt;🌙 Ativar Modo Escuro&lt;/button&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-89526" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">34 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-89526', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-89526', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Cores padrão (Modo Claro) */</span></span>
<span class="wzw-code-line">body {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#ffffff</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transition</span>: background-color <span class="wzw-tk-num">0.3s</span>, color <span class="wzw-tk-num">0.3s</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Cores quando a classe dark-theme estiver no body */</span></span>
<span class="wzw-code-line">body.dark-theme {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#0f172a</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.wzw-theme-box {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">20px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#cbd5e1</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">max-width</span>: <span class="wzw-tk-num">480px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">body.dark-theme .wzw-theme-box {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn-theme {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">18px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#3b82f6</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#fff</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border</span>: none;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">cursor</span>: pointer;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">font-weight</span>: 600;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Cores padrão (Modo Claro) */
body {
    background-color: #ffffff;
    color: #1e293b;
    transition: background-color 0.3s, color 0.3s;
}

/* Cores quando a classe dark-theme estiver no body */
body.dark-theme {
    background-color: #0f172a;
    color: #f8fafc;
}

.wzw-theme-box {
    padding: 20px;
    border: 1px solid #cbd5e1;
    border-radius: 8px;
    max-width: 480px;
}

body.dark-theme .wzw-theme-box {
    border-color: #334155;
    background-color: #1e293b;
}

.btn-theme {
    padding: 10px 18px;
    background-color: #3b82f6;
    color: #fff;
    border: none;
    border-radius: 6px;
    cursor: pointer;
    font-weight: 600;
}</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-58949" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">29 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-58949', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-58949', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-kw">const</span> botaoTema = document.<span class="wzw-tk-fn">getElementById</span>(<span class="wzw-tk-str">&#039;btnAlternarTema&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 1. Ao carregar a página, verifica se já existe tema salvo</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">function</span> <span class="wzw-tk-fn">aplicarTemaInicial</span>() {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> temaSalvo = localStorage.<span class="wzw-tk-fn">getItem</span>(<span class="wzw-tk-str">&#039;wzw_tema&#039;</span>);</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">if</span> (temaSalvo === <span class="wzw-tk-str">&#039;dark&#039;</span>) {</span>
<span class="wzw-code-line">        document.body.classList.<span class="wzw-tk-fn">add</span>(<span class="wzw-tk-str">&#039;dark-theme&#039;</span>);</span>
<span class="wzw-code-line">        botaoTema.textContent = <span class="wzw-tk-str">&#039;☀️ Ativar Modo Claro&#039;</span>;</span>
<span class="wzw-code-line">    } <span class="wzw-tk-kw">else</span> {</span>
<span class="wzw-code-line">        document.body.classList.<span class="wzw-tk-fn">remove</span>(<span class="wzw-tk-str">&#039;dark-theme&#039;</span>);</span>
<span class="wzw-code-line">        botaoTema.textContent = <span class="wzw-tk-str">&#039;🌙 Ativar Modo Escuro&#039;</span>;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 2. Alterna o tema e grava a nova preferência</span></span>
<span class="wzw-code-line">botaoTema.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;click&#039;</span>, () =&gt; {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">const</span> modoEscuroAtivo = document.body.classList.<span class="wzw-tk-fn">toggle</span>(<span class="wzw-tk-str">&#039;dark-theme&#039;</span>);</span>
<span class="wzw-code-line">    </span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">if</span> (modoEscuroAtivo) {</span>
<span class="wzw-code-line">        localStorage.<span class="wzw-tk-fn">setItem</span>(<span class="wzw-tk-str">&#039;wzw_tema&#039;</span>, <span class="wzw-tk-str">&#039;dark&#039;</span>);</span>
<span class="wzw-code-line">        botaoTema.textContent = <span class="wzw-tk-str">&#039;☀️ Ativar Modo Claro&#039;</span>;</span>
<span class="wzw-code-line">    } <span class="wzw-tk-kw">else</span> {</span>
<span class="wzw-code-line">        localStorage.<span class="wzw-tk-fn">setItem</span>(<span class="wzw-tk-str">&#039;wzw_tema&#039;</span>, <span class="wzw-tk-str">&#039;light&#039;</span>);</span>
<span class="wzw-code-line">        botaoTema.textContent = <span class="wzw-tk-str">&#039;🌙 Ativar Modo Escuro&#039;</span>;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">});</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Executa na inicialização</span></span>
<span class="wzw-code-line"><span class="wzw-tk-fn">aplicarTemaInicial</span>();</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>const botaoTema = document.getElementById(&#039;btnAlternarTema&#039;);

// 1. Ao carregar a página, verifica se já existe tema salvo
function aplicarTemaInicial() {
    const temaSalvo = localStorage.getItem(&#039;wzw_tema&#039;);
    if (temaSalvo === &#039;dark&#039;) {
        document.body.classList.add(&#039;dark-theme&#039;);
        botaoTema.textContent = &#039;☀️ Ativar Modo Claro&#039;;
    } else {
        document.body.classList.remove(&#039;dark-theme&#039;);
        botaoTema.textContent = &#039;🌙 Ativar Modo Escuro&#039;;
    }
}

// 2. Alterna o tema e grava a nova preferência
botaoTema.addEventListener(&#039;click&#039;, () =&gt; {
    const modoEscuroAtivo = document.body.classList.toggle(&#039;dark-theme&#039;);
    
    if (modoEscuroAtivo) {
        localStorage.setItem(&#039;wzw_tema&#039;, &#039;dark&#039;);
        botaoTema.textContent = &#039;☀️ Ativar Modo Claro&#039;;
    } else {
        localStorage.setItem(&#039;wzw_tema&#039;, &#039;light&#039;);
        botaoTema.textContent = &#039;🌙 Ativar Modo Escuro&#039;;
    }
});

// Executa na inicialização
aplicarTemaInicial();</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer testar o LocalStorage e a persistência de tema agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>5. Sincronização entre Abas com o Evento Storage</h2>
<p>
    Uma funcionalidade surpreendente do <code>localStorage</code> é que, sempre que outra aba do mesmo domínio altera um item, o navegador dispara o evento <code>storage</code> em todas as outras abas abertas simultaneamente:
</p>
    <div class="wzw-ide-card" id="wzw-code-15600" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">10 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-15600', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-15600', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">window.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;storage&#039;</span>, (event) =&gt; {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">`Chave alterada em outra aba: ${event.key}`</span>);</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">`Valor anterior: ${event.oldValue}`</span>);</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">`Novo valor: ${event.newValue}`</span>);</span>
<span class="wzw-code-line">    </span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">// Se o usuário mudou o tema na aba 2, atualiza a aba 1 automaticamente!</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">if</span> (event.key === <span class="wzw-tk-str">&#039;wzw_tema&#039;</span>) {</span>
<span class="wzw-code-line">        <span class="wzw-tk-fn">aplicarTemaInicial</span>();</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">});</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>window.addEventListener(&#039;storage&#039;, (event) =&gt; {
    console.log(`Chave alterada em outra aba: ${event.key}`);
    console.log(`Valor anterior: ${event.oldValue}`);
    console.log(`Novo valor: ${event.newValue}`);
    
    // Se o usuário mudou o tema na aba 2, atualiza a aba 1 automaticamente!
    if (event.key === &#039;wzw_tema&#039;) {
        aplicarTemaInicial();
    }
});</textarea>
        </div>
    </div>
    
<div class="wzw-pro-tip">
<h4>⚠️ Alerta de Segurança Crítico: XSS e Tokens Sensíveis</h4>
<p>
        O Web Storage é acessível por qualquer script JavaScript executado na página. Isso significa que, se sua aplicação sofrer um ataque de injeção de código malicioso (<strong>XSS &#8211; Cross-Site Scripting</strong>), o invasor poderá roubar todo o conteúdo com uma simples chamada <code>localStorage.getItem()</code>.
    </p>
<p>
        <strong>A regra de ouro da indústria:</strong> Nunca salve dados financeiros, senhas ou tokens de autenticação críticos (como JWTs com permissões administrativas) no <code>localStorage</code>. Para autenticação segura de sessões, utilize <strong>Cookies HTTP com as diretivas <code>HttpOnly</code>, <code>Secure</code> e <code>SameSite=Strict</code></strong>, que impedem o acesso do script ao cookie.
    </p>
</div>
<h2>6. Ferramentas Relacionadas &#038; Próximos Passos</h2>
<p>
    Continue expandindo sua arquitetura web com as ferramentas e lições da nossa suíte:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/central-dev/">Central do Desenvolvedor Web</a>: Conversores JSON, geradores de hashes e manipuladores de strings.</li>
<li><a href="https://webzoneware.com/web-ferramentas/hub-imagens/">Hub Master de Imagens</a>: Otimize ativos visuais salvos em cache ou convertidos para Base64.</li>
<li><a href="https://webzoneware.com/web-academy/html/geolocalizacao-api-html5/">Lição 37: API de Geolocalização</a>: Combine a captura de coordenadas com salvamento no LocalStorage.</li>
<li><a href="https://webzoneware.com/web-academy/html/web-workers-multithreading-html5/">Lição 39: Web Workers &#038; Multithreading</a>: Processe tarefas pesadas em background sem travar a interface do usuário.</li>
</ul>
<h2>7. Referências Técnicas &#038; Especificações Oficiais</h2>
<ul>
<li><a href="https://html.spec.whatwg.org/multipage/webstorage.html" target="_blank" rel="noopener">WHATWG HTML Living Standard: Web Storage Specification</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API" target="_blank" rel="noopener">MDN Web Docs: Web Storage API Guide</a></li>
<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#local-storage" target="_blank" rel="noopener">OWASP Foundation: HTML5 Web Storage Security Cheat Sheet</a></li>
</ul>
<p><!-- Schema.org TechArticle JSON-LD --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "HTML5 Web Storage: LocalStorage e SessionStorage na Prática",
  "description": "Aprenda a salvar dados no navegador com LocalStorage e SessionStorage no HTML5, com JSON e sem a lentidão dos cookies.",
  "url": "https://webzoneware.com/web-academy/html/web-storage-localstorage-sessionstorage/",
  "inLanguage": "pt-BR",
  "proficiencyLevel": "Intermediate",
  "articleSection": "Web Academy - Curso de HTML & HTML5 Completo",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "url": "https://webzoneware.com"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "logo": {
      "@type": "ImageObject",
      "url": "https://webzoneware.com/wp-content/themes/astra-child/assets/images/logo.png"
    }
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/web-storage-localstorage-sessionstorage/">HTML5 Web Storage: LocalStorage e Session | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-html/web-storage-localstorage-sessionstorage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
