Introdução ao jQuery
O jQuery é uma biblioteca JavaScript projetada para simplificar a interação com o Document Object Model (DOM), o tratamento de eventos, a criação de animações e a realização de solicitações Ajax. Seu princípio fundamental, "escrever menos, fazer mais", visa mitigar as incompatibilidades entre navegadores e reduzir a verbosidade do código JavaScript puro. A sua ampla adoção é notável, sendo utilizada em uma grande porcentagem dos sites mais visitados globalmente.
Para começar a usar o jQuery, é necessário incluir a biblioteca na sua página. Você pode hospedar o arquivo localmente ou utilizar um Content Delivery Network (CDN):
<!-- Inclusão Local -->
<head>
<script src="caminho/para/jquery-3.6.0.min.js"></script>
</head>
<!-- Inclusão via CDN (Exemplo Google) -->
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
O código a seguir demonstra um exemplo básico, vinculando um manipulador de eventos de clique a um botão após o carregamento do documento:
<html>
<head>
<title>Exemplo Básico jQuery</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<button id="gatilho">Clique Aqui</button>
<script>
$(function() {
var $botao = $('#gatilho');
$botao.on('click', function() {
alert('O evento de clique foi tratado pelo jQuery!');
});
});
</script>
</body>
</html>
Ponto Chave: O símbolo $ é um apelido para a função principal do jQuery. Passar uma função para $(function() { ... }) é equivalente a usar window.onload, garantindo que o código execute após o DOM estar pronto.
A Função Central e Objetos jQuery
A função $() é multifuncional. Seu comportamento varia com o argumento recebido:
- Uma função: Executa a função quando o DOM está pronto.
- Uma string HTML: Cria um novo elemento DOM. Ex:
$('<div class="novo"></div>'). - Uma string de seletor: Seleciona elementos do DOM. Ex:
$('#meuId'),$('.minhaClasse'). - Um objeto DOM: Envolva um elemento DOM em um objeto jQuery. Ex:
$(elementoDom).
Objeto jQuery vs. Objeto DOM: Um objeto jQuery é um wrapper (invólucro) em torno de um ou mais objetos DOM nativos, fornecendo métodos adicionais. Um objeto DOM, obtido via document.getElementById por exemplo, é o elemento nativo do navegador. Para converter entre eles:
// DOM para jQuery
var elementoDOM = document.getElementById('meuId');
var $elementojQuery = $(elementoDOM);
// jQuery para DOM (acessando o primeiro elemento da coleção)
var elementoDOMNovamente = $elementojQuery[0];
// ou
var elementoDOMNovamente = $elementojQuery.get(0);
Seletores Poderosos
Os seletroes do jQuery permitem localizar elementos de maneira precisa.
Seletores Básicos e Hierárquicos
// Seletores Básicos
$('#principal'); // Por ID
$('.destaque'); // Por classe
$('article'); // Por tag
$('*'); // Todos os elementos
$('h1, .intro, #rodape'); // Combinação
// Seletores Hierárquicos
$('nav ul'); // 'ul' descendente de 'nav'
$('form > input'); // 'input' filho direto de 'form'
$('label + input'); // 'input' imediatamente após um 'label'
$('div ~ p'); // 'p' irmão subsequente de 'div'
Filtros Avançados
Os filtros refinam a seleção com base em posição, conteúdo, atributos ou estado.
// Filtros de Posição
$('li:first'); // Primeiro 'li'
$('li:last'); // Último 'li'
$('li:eq(2)'); // Terceiro 'li' (índice 0)
$('li:even'); // 'li' com índice par (0, 2, 4...)
$('li:odd'); // 'li' com índice ímpar (1, 3, 5...)
// Filtros de Conteúdo e Atributo
$(':contains("jQuery")'); // Contém o texto "jQuery"
$('[data-role="menu"]'); // Possui o atributo data-role="menu"
$('input[type^="text"]'); // Atributo 'type' começa com "text"
$('input[name$="email"]'); // Atributo 'name' termina com "email"
// Filtros de Estado para Formulários
$(':enabled'); // Elementos habilitados
$(':disabled'); // Elementos desabilitados
$(':checked'); // Caixas de seleção/rádio marcados
$('option:selected'); // Opções selecionadas em listas
Manipulação de Atributos, Propriedades e CSS
jQuery fornece métodos para manipular diferentes aspectos dos elementos.
// Manipulação de Conteúdo
$('.caixa').html('<b>Conteúdo dinâmico</b>'); // Define innerHTML
var conteudo = $('.caixa').html(); // Obtém innerHTML
$('.caixa').text('Apenas texto puro'); // Define innerText
var texto = $('.caixa').text(); // Obtém innerText
// Manipulação de Valor em Formulários
$('#campoInput').val('Novo valor'); // Define o valor
var valorAtual = $('#campoInput').val(); // Obtém o valor
// Manipulação de Atributos vs. Propriedades
$('input:checkbox').attr('data-custom', 'info'); // Atributos customizados
$('input:checkbox').prop('checked', true); // Propriedades booleanas (checked, disabled, etc.)
// Adicionando e removendo classes CSS
$('.item').addClass('ativo destaque');
$('.item').removeClass('inativo');
$('.item').toggleClass('visivel');
// Manipulação direta de estilo
$('.painel').css({
'background-color': '#f0f0f0',
'padding': '20px',
'border': '1px solid #ccc'
});
// Obtendo e definindo posição/offset
var posicao = $('.fixo').offset(); // {top: ..., left: ...}
$('.fixo').offset({top: 100, left: 200});
Prática: Manipulação de Tabela Dinâmica
O exemplo abaixo demonstra a adição e remoção dinâmica de linhas em uma tabela, incluindo a delegação de eventos para botões criados posteriormente.
<html>
<head>
<title>Tabela Dinâmica</title>
<style>
table { border-collapse: collapse; margin: 20px; }
td, th { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.remover-btn { cursor: pointer; color: #d9534f; }
</style>
</head>
<body>
<table id="tabelaDados">
<thead>
<tr>
<th>Nome</th>
<th>Função</th>
<th>Ação</th>
</tr>
</thead>
<tbody>
<tr>
<td>Maria Silva</td>
<td>Desenvolvedora</td>
<td><span class="remover-btn">X</span></td>
</tr>
</tbody>
</table>
<div id="formAdicao">
<input type="text" id="inputNome" placeholder="Nome">
<input type="text" id="inputFuncao" placeholder="Função">
<button id="btnAdicionar">Adicionar Registro</button>
</div>
<script>
$(function() {
// Função para remover linha
var removerLinha = function() {
if (confirm('Remover este registro?')) {
$(this).closest('tr').remove();
}
return false; // Previne comportamento padrão se aplicável
};
// Delegação de evento: lida com cliques em .remover-btn, mesmo que sejam adicionados depois
$('#tabelaDados').on('click', '.remover-btn', removerLinha);
// Adicionar novo registro
$('#btnAdicionar').on('click', function() {
var nome = $('#inputNome').val().trim();
var funcao = $('#inputFuncao').val().trim();
if (nome && funcao) {
var novaLinha = $('<tr>') // Cria um objeto jQuery para a nova linha
.append($('<td>').text(nome))
.append($('<td>').text(funcao))
.append($('<td>').html('<span class="remover-btn">X</span>'));
$('#tabelaDados tbody').append(novaLinha); // Adiciona ao corpo da tabela
$('#inputNome, #inputFuncao').val(''); // Limpa os inputs
} else {
alert('Preencha todos os campos.');
}
});
});
</script>
</body>
</html>
Animações e Efeitos
jQuery simplifica a criação de animações suaves.
// Animações de Exibição
$('#painel').hide(300); // Esconde em 300ms
$('#painel').show(500); // Mostra em 500ms
$('#painel').toggle(200); // Alterna visibilidade em 200ms
// Animações de Opacidade (Fade)
$('#aviso').fadeIn(); // Aparece gradualmente
$('#aviso').fadeOut(1000); // Desaparece em 1 segundo
$('#aviso').fadeTo(500, 0.5); // Muda a opacidade para 0.5 em 500ms
// Animações de Dimensão
$('.conteudo').slideUp(); // Desliza para cima (esconde)
$('.conteudo').slideDown('slow'); // Desliza para baixo (mostra) lentamente
$('.conteudo').slideToggle(); // Alterna o deslize
// Animação Personalizada com .animate()
$('.caixa').animate({
left: '+=100px', // Move 100px para a direita
opacity: 0.5,
height: 'toggle'
}, 1000, function() {
// Callback executado após a animação
console.log('Animação concluída!');
});
Eventos Avançados
Além de click, o jQuery suporta uma vasta gama de eventos e fornece mecanismos para tratamento eficiente.
// Eventos de Mouse e Teclado
$('#elemento').on('mouseenter', function() { /* Lógica para mouse entrando */ });
$('#elemento').on('mouseleave', function() { /* Lógica para mouse saindo */ });
$('#campo').on('keydown', function(event) {
console.log('Tecla pressionada:', event.key);
});
// Vinculando múltiplos eventos a uma única função
$('#botao').on('click mouseenter', function(evento) {
if (evento.type === 'click') {
console.log('Clicado!');
} else if (evento.type === 'mouseenter') {
console.log('Mouse sobre o botão!');
}
});
// Vinculando um evento que só ocorre uma vez
$('#botaoUnico').one('click', function() {
alert('Este alerta aparecerá apenas uma vez.');
$(this).prop('disabled', true);
});
// Prevenindo o Bubble (Propagação) de Eventos
$('.interno').on('click', function(event) {
event.stopPropagation(); // Impede que o evento chegue ao pai '.externo'
alert('Clique no elemento interno.');
});
// Uso do objeto Event
$('#campo').on('focus', function(eventoDeFoco) {
// Acessa informações do evento, como timestamp
console.log('Campo focado em:', eventoDeFoco.timeStamp);
});
Requisições AJAX Simplificadas
O jQuery abstrai a complexidade das requisições assíncronas.
// Requisição GET simples para obter dados
$.get('/api/dados', function(resposta) {
console.log('Dados recebidos:', resposta);
}, 'json'); // Espera uma resposta JSON
// Requisição POST para enviar dados
var dadosParaEnviar = {
nome: 'Novo Usuário',
email: 'novo@exemplo.com'
};
$.post('/api/usuarios', dadosParaEnviar)
.done(function(resposta) {
console.log('Sucesso:', resposta);
})
.fail(function(jqXHR, textStatus, errorThrown) {
console.error('Erro na requisição:', textStatus, errorThrown);
});
// Requisição AJAX completa e configurável
$.ajax({
url: '/api/endpoint',
method: 'PUT', // Pode ser GET, POST, PUT, DELETE, etc.
contentType: 'application/json',
data: JSON.stringify({ id: 123, status: 'ativo' }),
dataType: 'json',
timeout: 5000, // Timeout de 5 segundos
success: function(dados) {
// Sucesso na requisição
$('#resultado').html('<p>Atualizado com sucesso!</p>');
},
error: function(jqXHR, textStatus, errorThrown) {
// Tratamento de erro
console.error('Falha na requisição:', errorThrown);
}
});
Internacionalização (i18n) com Java e JSTL
A internacionalização permite que uma aplicação adapte sua interface a diferentes idiomas e regiões. No ecossistema Java, isso é comumente gerenciado com a classe ResourceBundle e, em páginas JSP, com a biblioteca de tags JSTL fmt.
Configuração Base
Crie arquivos de propriedades para cada localidade. A convenção de nomenclatura é nomeBase_local.properties.
# i18n_pt_BR.properties
titulo_pagina=Bem-vindo
rotulo_nome=Nome
rotulo_email=Email
botao_enviar=Enviar
# i18n_en_US.properties
titulo_pagina=Welcome
rotulo_nome=Name
rotulo_email=Email
botao_enviar=Submit
Uso no Código Java
import java.util.Locale;
import java.util.ResourceBundle;
public class ExemploI18n {
public String obterTraducao(String idioma) {
Locale localidade;
if ("en".equals(idioma)) {
localidade = Locale.US;
} else {
localidade = new Locale("pt", "BR"); // ou Locale.getDefault()
}
ResourceBundle mensagens = ResourceBundle.getBundle("i18n", localidade);
return mensagens.getString("titulo_pagina");
}
}
Uso em JSP com JSTL fmt
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title><fmt:message key="titulo_pagina"/></title>
</head>
<body>
<!-- Define o Locale e o bundle de recursos -->
<fmt:setLocale value="${param.lang}" />
<fmt:setBundle basename="i18n" />
<h1><fmt:message key="titulo_pagina"/></h1>
<form>
<label><fmt:message key="rotulo_nome"/>: <input type="text" name="nome"></label><br/>
<label><fmt:message key="rotulo_email"/>: <input type="email" name="email"></label><br/>
<button type="submit"><fmt:message key="botao_enviar"/></button>
</form>
<p>
<a href="?lang=pt_BR">Português</a> |
<a href="?lang=en_US">English</a>
</p>
</body>
</html>