JS Module

SW-AJAX Framework

Carregamento dinâmico de conteúdo via fetch com suporte a trigger click/load/hover, efeitos de entrada, reinicialização automática dos módulos SW no destino e API estática. Restrito à mesma origem por padrão, com sanitização e timeout — sem executar scripts do HTML recebido.

1. Como funciona

Adicione sw-ajax (URL) ou sw-ajax-src (elemento interno) em qualquer elemento. Ao disparar o trigger, o SWAjax busca o conteúdo, sanitiza e injeta no destino, reinicializa os módulos SW nele contidos e dispara um evento.

1. Trigger
click / load / hover
2. fetch(url)
GET ou POST, mesma origem
3. Sanitizar
SW.html.set()
4. Injetar
dest.innerHTML
5. Reinit
SW.reinit(dest)
6. Evento
sw:ajax:done

Sanitização por padrão

O HTML recebido passa por SW.html.set() antes de entrar no DOM. Scripts do conteúdo injetado não são executados — use sw-ajax-trusted apenas quando a fonte for realmente confiável.

Restrito à mesma origem

Por padrão só busca URLs da própria origem. Outra origem exige sw-ajax-crossorigin explícito no elemento. Timeout de 15s por padrão (ajustável via sw-ajax-timeout), via AbortController.

2. Triggers

3 modos de disparo — click, load automático e hover prefetch.

click (padrão)

load — carrega ao entrar na página

hover — pré-carrega no mouseover

Resumo dos atributos principais

sw-ajaxURL a buscar
sw-ajax-srcelemento interno, sem HTTP
sw-targetseletor CSS do destino
sw-ajax-triggerclick | load | hover
sw-ajax-methodGET (padrão) | POST

3. Efeitos de Entrada

O conteúdo injetado pode receber qualquer classe de animação real do framework — .sw-ani-* (entrada única), .sw-rev-* (reveal) e .sw-loop-* (contínua), ver catálogo completo. Clique num efeito abaixo — a demo usa sw-ajax-src (sem requisição HTTP) e reaplica a classe a cada clique.

Duração · Distância · Atraso

12 entradas únicas — .sw-ani-*

7 reveal — .sw-rev-* (normalmente disparado por scroll, aqui replicado no clique)

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

Clique em qualquer efeito acima ✨

Declarativo — direto na tag, zero JavaScript

Os 4 atributos abaixo controlam o efeito de entrada sem escrever nenhum código: sw-ajax-effect, sw-ajax-duration (ms), sw-ajax-distance (com unidade) e sw-ajax-delay (ms). O SWAjax lê tudo isso sozinho ao injetar o conteúdo.

Sem JS nenhum — só atributos na tag ✨
// A demo de botões coloridos acima é só JS local da página — troca o
// conteúdo via SW-AJAX (sw-ajax-src) e reaplica a classe de animação
// escolhida manualmente:
box.classList.remove(efeitoAnterior);
void box.offsetWidth;              // força reflow pra poder repetir a animação
box.classList.add('sw-ani-fade');  // ou qualquer outra .sw-ani-* / .sw-rev-* / .sw-loop-*

// Duração, distância e atraso são tokens CSS — dá pra sobrescrever por elemento:
box.style.setProperty('--sw-spd', '0.8s');    // duração
box.style.setProperty('--sw-dist', '4rem');   // distância percorrida
box.style.setProperty('--sw-delay', '0.2s');  // atraso antes de começar

4. Preload (estado de carregamento)

Enquanto a requisição HTTP está em andamento, o destino recebe automaticamente a classe .sw-ajax-loading: o conteúdo antigo escurece e borra, e um spinner real aparece por cima — assim fica claro que algo está carregando, em vez do conteúdo antigo continuar parado ali sem nenhum aviso. Vem ligado por padrão; dá pra desligar por elemento com sw-ajax-loader="off", pra casos onde a troca é rápida o bastante pra não precisar de indicador (ex.: sw-ajax-src, que nunca faz requisição HTTP e por isso nunca mostra o preload).

Com preload (padrão)

Sem preload

Demo — busca de verdade (sw-ajax, mesma origem). No localhost a resposta costuma chegar rápido demais pra ver o spinner com calma; pra observar melhor, abra o DevTools → Network → throttling (ex.: "Slow 3G") antes de clicar. O botão "sem preload" troca o conteúdo sem nenhum aviso visual até a resposta chegar.

Aguardando clique…
Aguardando clique…

5. AJAX Interno

Com sw-ajax-src o conteúdo é copiado de um elemento oculto na própria página — sem requisição HTTP. Ideal pra tabs, accordions e wizards.

Funciona com <template> ou <div hidden> como fonte. Após a injeção, SW.reinit() é chamado automaticamente no destino.

Demo — AJAX Interno

Clique em uma tab acima ✨

6. API JavaScript

Dispare carregamentos programaticamente, sem HTML declarativo.

// Carregar conteúdo via GET
SWAjax.load('/api/lista', '#resultado');

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

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

// POST com FormData (upload de arquivo)
const fd = new FormData(document.querySelector('#meuForm'));
SWAjax.post('/api/upload', fd, '#resultado');
// Eventos disponíveis 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);
});

7. Padrões Reais

Casos de uso comuns em aplicações.

Tabs com AJAX

Widget auto-carregado

Paginação via AJAX

Abrir resultado num modal

8. Reinit Automático

Após cada carregamento, SW.reinit(dest) é chamado automaticamente — todos os módulos SW no novo conteúdo são inicializados sem nenhuma configuração extra.

Se o servidor retornar HTML com botões sw-modal, alertas sw-toast, código swcode ou qualquer outro componente SW — eles serão inicializados automaticamente.

Isso inclui todo módulo registrado via SW.register().

// Manual: reinicializar módulos em um container específico
SW.reinit(document.querySelector('#meu-container'));

9. Segurança

Diferença deliberada em relação a implementações que executam scripts do HTML recebido: o SW-AJAX prioriza segurança por padrão.

RegraComportamento
OrigemSó busca a mesma origem por padrão — outra origem exige sw-ajax-crossorigin explícito.
Timeout15 segundos por padrão, ajustável via sw-ajax-timeout (1–60s), via AbortController.
Content-TypeSó aceita text/html ou text/plain — qualquer outro tipo é rejeitado.
SanitizaçãoConteúdo passa por SW.html.set(); use sw-ajax-trusted só com fonte confiável.
ScriptsNão são executados — SW-AJAX nunca roda <script> do HTML recebido.

10. Quick Reference

AtributoValoresPadrãoDescrição
sw-ajaxstringURL a buscar (GET ou POST, mesma origem por padrão)
sw-ajax-srcseletor CSSFonte interna (elemento/template local, sem HTTP)
sw-targetseletor CSSOnde injetar o HTML (quando não é painel/modal)
sw-ajax-targetpanel | modalInjeta direto no painel ou modal (criado automaticamente se ausente)
sw-panel / sw-modalseletor CSSSeletor do painel/modal a usar
sw-ajax-extractseletor CSSExtrai só um trecho da resposta HTML
sw-ajax-triggerclick | load | hoverclickQuando disparar a requisição
sw-ajax-methodGET | POSTGETMétodo HTTP
sw-ajax-pushbooleanofalseAtualiza a URL via history.pushState
sw-ajax-trustedbooleanofalsePula a sanitização — usar só com fonte confiável
sw-ajax-crossoriginbooleanofalseAutoriza buscar URL de outra origem
sw-ajax-timeoutms (1000–60000)15000Timeout da requisição via AbortController
sw-ajax-loaderoffligadoDesliga o preload (spinner + escurecimento) durante a busca HTTP
sw-ajax-effectnome curto (fade, up, pop...) ou classe completa (sw-rev-*, sw-loop-*)Efeito de entrada aplicado ao injetar — sem JS
sw-ajax-durationms ou tempo CSS0.45sSobrescreve --sw-spd no elemento injetado
sw-ajax-distancenúmero (rem) ou com unidade2.4remSobrescreve --sw-dist no elemento injetado
sw-ajax-delayms ou tempo CSS0sSobrescreve --sw-delay — atraso antes do efeito começar
Método estáticoParâmetrosDescrição
SWAjax.load()url, dest, opts?
opts: { trusted, crossorigin, push, extract }
GET e injeta no destino (seletor CSS)
SWAjax.post()url, data, dest, opts?
data: objeto (vira JSON) ou FormData
POST e injeta no destino
EventoDetalheQuando
sw:ajax:start{ url }Antes da requisição partir
sw:ajax:done{ sourceSelector }Após injetar e reinicializar o destino
sw:ajax:error{ error }Falha de rede, timeout ou tipo de conteúdo rejeitado