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.
click / load / hover
GET ou POST, mesma origem
SW.html.set()
dest.innerHTML
SW.reinit(dest)
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-ajax | URL a buscar |
| sw-ajax-src | elemento interno, sem HTTP |
| sw-target | seletor CSS do destino |
| sw-ajax-trigger | click | load | hover |
| sw-ajax-method | GET (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)
SW Framework
Conteúdo carregado via sw-ajax-src — sem requisição HTTP.
SW-AJAX
Reaproveita as animações reais do catálogo .sw-ani-* pra dar entrada suave ao conteúdo.
Zero dependências
Animações puras em CSS — sem biblioteca externa.
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.
// 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.
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
O que é AJAX Interno?
Com sw-ajax-src o conteúdo é lido de um elemento oculto na própria
página — zero requisição HTTP, zero servidor necessário. Ideal para tabs, accordions,
wizards e qualquer troca de conteúdo local.
Recursos suportados
- Qualquer HTML — incluindo componentes SW
- Reinit automático de todos os módulos no destino
- Funciona com
<template>ou<div hidden> - Também injeta em painel/modal via
sw-ajax-target
Como usar
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.
| Regra | Comportamento |
|---|---|
| Origem | Só busca a mesma origem por padrão — outra origem exige sw-ajax-crossorigin explícito. |
| Timeout | 15 segundos por padrão, ajustável via sw-ajax-timeout (1–60s), via AbortController. |
| Content-Type | Só aceita text/html ou text/plain — qualquer outro tipo é rejeitado. |
| Sanitização | Conteúdo passa por SW.html.set(); use sw-ajax-trusted só com fonte confiável. |
| Scripts | Não são executados — SW-AJAX nunca roda <script> do HTML recebido. |
10. Quick Reference
| Atributo | Valores | Padrão | Descrição |
|---|---|---|---|
sw-ajax | string | — | URL a buscar (GET ou POST, mesma origem por padrão) |
sw-ajax-src | seletor CSS | — | Fonte interna (elemento/template local, sem HTTP) |
sw-target | seletor CSS | — | Onde injetar o HTML (quando não é painel/modal) |
sw-ajax-target | panel | modal | — | Injeta direto no painel ou modal (criado automaticamente se ausente) |
sw-panel / sw-modal | seletor CSS | — | Seletor do painel/modal a usar |
sw-ajax-extract | seletor CSS | — | Extrai só um trecho da resposta HTML |
sw-ajax-trigger | click | load | hover | click | Quando disparar a requisição |
sw-ajax-method | GET | POST | GET | Método HTTP |
sw-ajax-push | booleano | false | Atualiza a URL via history.pushState |
sw-ajax-trusted | booleano | false | Pula a sanitização — usar só com fonte confiável |
sw-ajax-crossorigin | booleano | false | Autoriza buscar URL de outra origem |
sw-ajax-timeout | ms (1000–60000) | 15000 | Timeout da requisição via AbortController |
sw-ajax-loader | off | ligado | Desliga o preload (spinner + escurecimento) durante a busca HTTP |
sw-ajax-effect | nome curto (fade, up, pop...) ou classe completa (sw-rev-*, sw-loop-*) | — | Efeito de entrada aplicado ao injetar — sem JS |
sw-ajax-duration | ms ou tempo CSS | 0.45s | Sobrescreve --sw-spd no elemento injetado |
sw-ajax-distance | número (rem) ou com unidade | 2.4rem | Sobrescreve --sw-dist no elemento injetado |
sw-ajax-delay | ms ou tempo CSS | 0s | Sobrescreve --sw-delay — atraso antes do efeito começar |
| Método estático | Parâmetros | Descriçã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 |
| Evento | Detalhe | Quando |
|---|---|---|
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 |