Ajax Componentes

Injeta fragmentos HTML same-origin na página, com CSRF automático, efeito de entrada e reinit dos módulos SWCore no conteúdo novo.

O que é

Carrega um pedaço de HTML de outra rota (ou de um elemento escondido na própria página) e injeta em qualquer alvo — sem reload, sem escrever fetch manualmente toda vez. Suporta 3 gatilhos (clique/carregamento/hover), efeito de entrada declarativo, extração de trecho, painel/modal automáticos e API JS.

Como funciona

Ao disparar o trigger: (1) busca o conteúdo — via fetch (sw-ajax) ou copiando de um elemento da própria página (sw-ajax-src, sem rede); (2) sanitiza com SW.html.set(); (3) injeta no destino; (4) chama SW.reinit() nele — qualquer componente SWCore dentro já nasce funcionando; (5) aplica o efeito de entrada, se pedido; (6) dispara sw:ajax:done. Bloqueia origens diferentes por padrão (só libera com sw-ajax-crossorigin) e, em métodos que mudam estado (POST etc.), manda automaticamente o token CSRF de <meta name="csrf-token">.

Exemplos

1. Como funciona Ao vivo
1Trigger dispara — clique, carregamento da página ou hover
2fetch(url) (mesma origem) ou cópia de sw-ajax-src (sem rede)
3Conteúdo passa por SW.html.set() — sanitizado, scripts não executam
4HTML entra no sw-target (ou painel/modal)
5SW.reinit() roda no conteúdo novo — componentes SWCore lá dentro já nascem funcionando
6Efeito de entrada aplicado (se pedido) e evento sw:ajax:done disparado
2. Os 3 gatilhos — click, load e hover Ao vivo

click (padrão)

load — assim que a página abre

hover — passe o mouse aqui

<!-- click (padrão) -->
<button sw-ajax="/produtos" sw-target="#lista">Carregar produtos</button>

<!-- load — carrega ao entrar na página -->
<div sw-ajax="/dashboard/widgets" sw-ajax-trigger="load" sw-target="#widgets"></div>

<!-- hover — pré-carrega no mouseover -->
<a href="/perfil/42" sw-ajax="/perfil/42/preview" sw-ajax-trigger="hover" sw-target="#preview"></a>
3. Efeitos de entrada — catálogo completo, declarativo, zero JavaScript Ao vivo

Clique num efeito — troca o conteúdo (sw-ajax-src, sem requisição HTTP) e reaplica a classe. Os sliders sobrescrevem sw-ajax-duration/sw-ajax-distance ao vivo.

16 entradas únicas — .sw-ani-*

7 contínuas — .sw-loop-* (clique de novo pra parar)

Clique num efeito acima ✨
4. Preload automático durante a busca Ao vivo

Enquanto a requisição está em andamento, o destino ganha a classe .sw-ajax-loading (escurece + spinner) — sem isso, o conteúdo antigo fica parado ali sem nenhum aviso. Local costuma responder rápido demais pra ver o spinner com calma — abra o DevTools → Network → throttling pra observar melhor.

Com preload (padrão)

Sem preload — sw-ajax-loader="off"

<p class="demo-box-sub demo-mb">Enquanto a requisição está em andamento, o destino ganha a classe <code>.sw-ajax-loading</code> (escurece + spinner) — sem isso, o conteúdo antigo fica parado ali sem nenhum aviso. Local costuma responder rápido demais pra ver o spinner com calma — abra o DevTools → Network → throttling pra observar melhor.</p>
<div class="demo-grid">
  <div class="demo-box">
    <p class="demo-box-title">Com preload (padrão)</p>
    <button sw-ajax="../assets/demo-ajax-click.html" sw-target="#ajaxPreloadOn" class="sw-btn sw-btn-sm">Carregar</button>
    <div id="ajaxPreloadOn" class="demo-infinite-note"></div>
  </div>
  <div class="demo-box">
    <p class="demo-box-title">Sem preload — sw-ajax-loader="off"</p>
    <button sw-ajax="../assets/demo-ajax-click.html" sw-target="#ajaxPreloadOff" sw-ajax-loader="off" class="sw-btn sw-btn-sm">Carregar</button>
    <div id="ajaxPreloadOff" class="demo-infinite-note"></div>
  </div>
</div>
5. Ajax Interno — tabs sem nenhuma requisição HTTP Ao vivo
Clique numa aba acima ✨
<!-- Triggers — sw-ajax-effect funciona igual com sw-ajax-src, sem HTTP nenhum -->
<button sw-ajax-src="#tab-1" sw-target="#conteudo" sw-ajax-effect="fade" sw-ajax-duration="250">Tab 1</button>
<button sw-ajax-src="#tab-2" sw-target="#conteudo" sw-ajax-effect="fade" sw-ajax-duration="250">Tab 2</button>

<!-- Destino -->
<div id="conteudo"></div>

<!-- Fontes ocultas — funciona com <template> ou <div hidden> -->
<template id="tab-1"><h4>Conteúdo da Tab 1</h4></template>
<template id="tab-2"><h4>Conteúdo da Tab 2</h4></template>
6. API JavaScript Ao vivo
// GET e injeta
SW.Ajax.load('/api/lista', '#resultado');

// Com opções
SW.Ajax.load('/api/lista', '#resultado', {
  push: true,           // atualiza a URL via history.pushState
  extract: '#conteudo', // extrai só um trecho da resposta
});

// POST com dados (objeto vira JSON automaticamente)
SW.Ajax.post('/api/salvar', { nome: 'João', idade: 30 }, '#resposta');

// POST com FormData (upload de arquivo)
const fd = new FormData(document.querySelector('#meuForm'));
SW.Ajax.post('/api/upload', fd, '#resultado');

// Eventos no elemento trigger
el.addEventListener('sw:ajax:start', ({ detail }) => console.log('Buscando:', detail.url));
el.addEventListener('sw:ajax:done', () => console.log('Concluído.'));
el.addEventListener('sw:ajax:error', ({ detail }) => console.error('Erro:', detail.error));

Atributos

sw-ajax
URL a buscar (GET ou POST, mesma origem por padrão)
sw-ajax-src
alternativa: seletor de um elemento/template na própria página pra copiar o HTML dele, sem rede
sw-target
seletor CSS de onde injetar (quando não é painel/modal)
sw-ajax-target
"panel" ou "modal" — injeta direto num painel/modal (criado automaticamente se sw-panel/sw-modal não apontar pra um existente)
sw-panel / sw-modal
seletor do painel/modal a usar com sw-ajax-target
sw-ajax-trigger
"click" (padrão), "load" (carrega ao entrar na página) ou "hover" (pré-carrega no mouseover)
sw-ajax-method
GET (padrão) ou POST
sw-ajax-extract
seletor CSS pra extrair só um trecho da resposta
sw-ajax-push
atualiza a URL do navegador via history.pushState
sw-ajax-trusted
pula a sanitização de HTML — só use com conteúdo que você mesmo controla
sw-ajax-crossorigin
autoriza buscar URL de outra origem
sw-ajax-timeout
timeout da requisição em ms, 1000–60000 (padrão 15000), via AbortController
sw-ajax-loader
"off" desliga o preload (escurecimento + spinner) durante a busca HTTP
sw-ajax-effect
efeito de entrada ao injetar — nome curto ("fade", "up", "pop"...) vira .sw-ani-*, ou a classe completa pra usar .sw-loop-*
sw-ajax-duration
sobrescreve a duração do efeito (--sw-spd) — ms ou tempo CSS
sw-ajax-distance
sobrescreve a distância percorrida (--sw-dist/--sw-dist-lg) — número (rem) ou com unidade
sw-ajax-delay
atraso antes do efeito começar (animation-delay) — ms ou tempo CSS

Variantes

Nenhum.

Eventos

sw:ajax:start
{ url } — antes da requisição partir
sw:ajax:done
{ sourceSelector } — depois de injetar, reinicializar e aplicar o efeito
sw:ajax:error
{ error } — falha de rede, timeout ou tipo de conteúdo rejeitado

API (JavaScript)

SW.Ajax.load(url, destino, opções?)
GET e injeta no destino — opções: { trusted, crossorigin, push, extract }
SW.Ajax.post(url, dados, destino, opções?)
POST e injeta — dados: objeto (vira JSON) ou FormData (upload de arquivo)

Requisitos

  • Por segurança, só busca URLs da mesma origem por padrão — outra origem exige sw-ajax-crossorigin explícito no elemento.

Limitações — o que ele não faz

  • Sem SW.Trans (transição de página via View Transition API) — o SWCore não tem esse módulo; sem ele, a injeção acontece direto, sem cross-fade automático. Não afeta sw-ajax-effect, que é CSS puro e já funciona independente disso.
  • O efeito de entrada suporta .sw-ani-* (entrada única) e .sw-loop-* (contínua) — o SWCore não tem a família .sw-rev-* (reveal) do SW Framework original sob esse nome; para revelar ao rolar a tela, use o componente Anim (camada Reveal) diretamente no elemento, não via sw-ajax-effect.