Este documento fornece uma introdução à biblioteca JavaScript jQuery:
1) É uma biblioteca cross-browser para manipulação de DOM, eventos e efeitos visuais.
2) Fornece funcionalidades como seleção de elementos, manipulação do DOM, vinculação de eventos e requisições Ajax.
3) É altamente utilizado pela comunidade web devido à sua simplicidade e extensibilidade.
5. jQuery
• É possível manipular elementos no html através de
• $(‘seletor’).método();
Seleções
<h3 class="teste">cabeçalho
<p> Subtitulo</p>
</h3>
<h3 id="teste">id</h3>
<h3 teste="">atributo</h3>
$('h3'); //Todos os h3
$('h3#teste'); //Todos os h3 com id = 'teste'
$('#teste'); //Todos os elementos com id = 'teste'
$('.teste'); //Todos os elementos com classe = 'teste'
$('h3[teste]'); //Todos os h3 com que contenham atributo 'teste'
$('h3:even');//todos os h3 pares
$('h3:odd');//todos os h3 impares
$('h3 > p');//todos os 'p' que sejam filhos de 'h3'
$('qualquer seletor css');
6. jQuery
• Pseudo-Seletores
Seleções
$('a.external:first'); // primeiro <a> com classe "external"
$('tr:odd'); // <tr>s impares
$('#myForm :input'); // todos os elementos input num formulário
$('div:visible'); // apenas divs visiveis
$('div:gt(2)'); // todos exceto as três primeiras divs
$('div:animated'); // todas as divs com animação
$('div:nth-child(3)'); // terceiro filho do elemento selecionado
8. jQuery
• Se movendo pelo DOM
Seleções
$('h1').next('p');
$('div:visible').parent();
$('input[name=first_name]').closest('form');
$('#myList').children();
9. jQuery
• Getters e Setters
Ao invocar um valor sem passar argumentos, automaticamente subentende-se que
é um get de propriedade.
Ao passar um valor por parâmetro, o comportamento é de sobreescrever o valor
anterior, pois é interpretado como um set.
$('div').html();
$('p').text();
$('input').val();
$('div').html (“novo");
$('p').text (“texto");
$('input').val(“aqui");
11. jQuery
Atributos
Classes
var $h1 = $('h1');
$h1.addClass('big');
$h1.removeClass('big');
$h1.toggleClass('big');
$h1.hasClass('big');
Dimensões
$('h1').width('50px'); // seta a largura de todos os elementos h1
$('h1').width(); // obtém a largura do primeiro h1
$('h1').height('50px'); // seta a altura de todos os elementos h1
$('h1').height(); // obtém a altura do primeiro h1
$('h1').position(); // retorna um objeto contendo informações
// sobre a posição do primeiro h1 relativo
// a seu pai
12. jQuery
• Encapsulando seleções
Seleções
O valor da seleção pode ser encapsulado numa variável qualquer
Por convenção usa-se $ antes da variável para identificar que é um
Objeto jQuery
var $linhas = $('tr>td');
console.log($linhas.length);
$linhas.text();
13.
14. Usando o arquivo index.html, faça o seguinte:
1. Selecione todos os elementos DIV que têm a classe "module".
2. Obtenha o terceiro item na lista não-ordenada #myList.
3. Selecione o label para o input de busca usando um seletor de atributo.
4. Encontre quantos elementos na página estão escondidos (dica: .length).
5. Encontre quantos elementos na página têm um atributo alt.
6. Selecione todas as linhas ímpares no corpo da tabela.
15. Usando o arquivo index.html, faça o seguinte:
1. Selecione todos os elementos de imagem na página; logue o atributo alt de cada
imagem.
2. Selecione a caixa de texto de busca, então vá para o form e adicione uma classe nele.
3. Selecione o item de lista dentro de #myList que possui uma classe "current" e remova
esta classe dele; adicione uma classe "current" no próximo item de lista.
4. Selecione o elemento select dentro de #specials; se mova para o botão de submit.
5. Selecione o primeiro item de lista no elemento #slideshow; adicione a classe "current" a
ele e então adicione a classe "disabled" para seus elementos sibling.
16.
17. jQuery
• Movendo Elementos
• Clonando Elementos
Manipulação do DOM
// faz o primeiro item da lista se tornar o último
var $li = $('#myList li:first').appendTo('#myList');
// outra forma de resolver o mesmo problema
$('#myList').append($('#myList li:first'));
// copia o primeiro item da lista para o fim
$('#myList li:first').clone().appendTo('#myList');
Se você precisa copiar dados e eventos relacionados, esteja certo de passar true como um
argumento para $().clone.
18. jQuery
• Removendo elementos
• .remove() elimina o elemento da pagina junto com seus eventos
• .detach() apenas remove o elemento daquele contexto especifico
• Prefira .detach() se pretende usar os elementos com seus eventos em outro
lugar
Manipulação do DOM
var $li = $('#myList li:first').remove();
$('#myList').detach();
19. jQuery
• Criando elementos
Manipulação do DOM
$('<p>Este é um novo parágrafo</p>');
$('<li class="new">novo item de lista</li>');
//Criando um novo elemento com um objeto
$('<a/>', {
html : 'Este é um link <strong>new</strong>',
'class' : 'new',
href : 'foo.html' });
20. jQuery
• Manipulando atributos
Manipulação do DOM
//Manipulando um único atributo
$('#myDiv a:first').attr('href', 'novoDestino.html');
//Manipulando múltiplos atributos
$('#myDiv a:first').attr({
href : 'novoDestino.html',
rel : 'super-special‘
});
//Usando uma função para determinar um novo valor de atributo
$('#myDiv a:first').attr({
rel : 'super-special',
href : function() {
return '/new/' + $(this).attr('href');
}
});
$('#myDiv a:first').attr('href', function() {
return '/new/' + $(this).attr('href');
});
21.
22. Usando o arquivo index.html, faça o seguinte:
1. Adicione cinco novos itens de lista no fim da lista não ordenada #myList. Dica:
for (var i = 0; i<5; i++) { ... }
2. Remova os itens ímpares
3. Adicione outro h2 e outro parágrafo à última div.module
4. Adicione outra opção para o elemento select; dê ao option o valor "Quarta-Feira".
5. Adicione uma nova div.module à página depois da última; coloque uma cópia de uma
das imagens
existentes dentro dela.
23.
24. jQuery
• $.trim() – remove o espaço em branco de um texto
• $.each() ou $(‘seletor’).each() – aplica um call-back à todos os
elementos da lista
Métodos Utilitários
$.trim(' espaços em branco '); // retorna 'espaços em branco‘
$.each(['foo', 'bar', 'baz'], function (id, val) {
console.log('elemento ' + id + 'é ' + val);
});
$.each({ foo: 'bar', baz: 'bim' }, function (prop, val) {
console.log(prop + ' : ' + val);
});
25. jQuery
• $.extend() – estende as propriedades de um objeto baseado no outro
Métodos Utilitários
var objA = { nome: 'junior', idade: '14' };
var objB = { nome: 'lucas' };
var objAB = $.extend({}, objA, objB);
console.log(objAB); // nome:"lucas",idade:14
26. Estado
Civil Novo
Profissão
Nova
Nome
Idade
Estado
Civil
Profissão
{}
jQuery
• $.extend() – estende as propriedades de um objeto baseado no outro
Métodos Utilitários
ObjBObjA
Nome
Idade
Estado
Civil
Profissão
$.extend(objA, objB); var objC = $.extend({},objA, objB);
ObjA
Nome
Idade
Estado
Civil
Profissão
ObjC
Estado
Civil Novo
Profissão
Nova
ObjB
Estado
Civil Novo
Profissão
NovaProfissão
Nova
Estado
Civil Novo
29. Estado
Civil Novo
Profissão
Nova
Nome
Idade
Estado
Civil
Profissão
{}
jQuery
• $.extend() – estende as propriedades de um objeto baseado no outro
Métodos Utilitários
ObjBObjA
Nome
Idade
Estado
Civil
Profissão
$.extend(objA, objB); var objC = $.extend({},objA, objB);
ObjA
Nome
Idade
Estado
Civil
Profissão
ObjC
Estado
Civil Novo
Profissão
Nova
ObjB
Estado
Civil Novo
Profissão
NovaProfissão
Nova
Estado
Civil Novo
Nome
Idade
30. Estado
Civil Novo
Profissão
Nova
Nome
Idade
Estado
Civil
Profissão
{}
jQuery
• $.extend() – estende as propriedades de um objeto baseado no outro
Métodos Utilitários
ObjBObjA
Nome
Idade
Estado
Civil
Profissão
$.extend(objA, objB); var objC = $.extend({},objA, objB);
ObjA
Nome
Idade
Estado
Civil
Profissão
ObjC
Estado
Civil Novo
Profissão
Nova
ObjB
Estado
Civil Novo
Profissão
NovaProfissão
Nova
Estado
Civil Novo
Nome
Idade
31. jQuery
Tipos
var meuValor = [1, 2, 3];
// Usando o operador typeof do JavaScript para testar tipos primitivos
typeof meuValor == 'string'; // false
typeof meuValor == 'number'; // false
typeof meuValor == 'undefined'; // false
typeof meuValor == 'boolean'; // false
// Usando o operador de igualdade estrita para verificar null
meuValor === null; // false
// Usando os métodos do jQuery para verificar tipos não primitivos
jQuery.isFunction(meuValor); // false
jQuery.isPlainObject(meuValor); // false
jQuery.isArray(meuValor); // true
32.
33. jQuery
• jQuery fornece atalho para a maioria dos eventos convenientes
$(‘seletor’).click(callback);
$(‘seletor’).change(callback);
$(‘seletor’).keypress(callback);
$(‘seletor’).submit(callback);
$(‘seletor’).focus(callback);
Para eventos gerais:
$(‘seletor’).on(‘evento’,callback);
$(‘seletor’).bind(‘evento’,callback);
Eventos
//Vinculando Eventos Usando um Método próprio
$('p').click(function() {
console.log('clique');
});
//Vinculando eventos usando o método $().on
$('p').bind('click', function() {
console.log('clique');
});
// Vinculando eventos usando o método $().bind com dados
$('input').bind( 'click change',
{ foo : 'bar' }, // passa dados
function(eventObject) {
console.log(eventObject.type, eventObject.data);
} );
34. jQuery
• Remover um evento
$(‘seletor’).off(‘evento’);
$(‘seletor’).unbind(‘evento’);
• Configurar para chamar uma
única vez
$(‘seletor’).one(‘evento’);
• Disparar
$(‘seletor’).trigger(‘evento’);
Eventos
//Vinculando Eventos Usando um Método próprio
$('p').click(function() {
console.log('clique');
});
//Vinculando eventos usando o método $().on
$('p').bind('click', function() {
console.log('clique');
});
// Vinculando eventos usando o método $().bind com dados
$('input').bind( 'click change',
{ foo : 'bar' }, // passa dados
function(eventObject) {
console.log(eventObject.type, eventObject.data);
} );
35.
36. Usando o arquivo index.html, faça o seguinte:
1. Adicione um evento no onChange do campo de
pesquisa para alterar o conteúdo do botão abaixo para
“Go to: <termo>”
2. Crie um bind do evento click no item de lista que:
• Adicione uma classe "current" para o item de lista clicado.
• Remova a classe "current" do outro item de lista.
37.
38. Efeitos
• jQuery fornece métodos que deixam efeitos visuais são triviais que
nem parece que é feito de tanto CSS
41. jQuery
• Realizar chamadas ao servidor.
• Independente de back-end.
• Execução assíncrona.
• As chamdas ajax sempre retornam promises.
• Restrição ao mesmo domínio.
• Requisições cross-domain são rejeitadas por padrão.
• Carrega vários tipos de dados
• html
• xml
• json
• csv
Ajax
45. jQuery
• Extensões desenvolvidas pela comunidade para a biblioteca jQuery.
• Grande maioria são grátis.
• Métodos estáticos
• Criados utilizando o objeto $.
• Disponíveis através da sintaxe $.nomeDoPlugin(...)
• Métodos de instancias.
• Criados utilizando o objeto $.fn.
• Disponíveis através da sintaxe $(“seletor”).nomeDoPlugin(...)
Plugins
46. jQuery
Plugins – Melhores práticas
• Básico
• Cadeia de chamadas
• Protegendo o escopo
• Aceitando opções
• Minimizando a poluição
• Preparando para múltiplos
elementos
• Esqueleto padrão
• Versão final
47.
48. jQuery
• Inicialização do jQuery.
• Funciona bem se:
• Tem total controle do ambiente a ser executado.
• A performance de carregamento não é importante.
Melhores práticas
$("document").ready(function() {
// Pagina esta carregada
//O resto do código
});
$(function() {
// Pagina esta carregada
//O resto do código
});
// IIFE - Immediately Invoked Function Expression
(function($, window, document) {
// A variável $ esta no escopo local
// Cria o handler do evento da página carregada
$(function() {
// Página carrega
});
//O resto do código
}(window.jQuery, window, document));
// O objecto global jQuery é passado como parâmetro
49. jQuery
• Manipulação do DOM.
• Funciona bem se:
• Gosta de código repetitivo.
• A performance de carregamento não é importante.
• Boas práticas não é uma preocupação.
Melhores práticas
$(".container input#elem").attr("title", $(".container input#elem").text());
$(".container input#elem").css("color", "red");
$(".container input#elem").fadeOut();
var $elem = $("#elem");
$elem.attr("title", elem.text())
.css("color", "red")
.fadeOut();
50. jQuery
• Manipulação do DOM.
• Funciona bem se:
• Gosta de ficar mudando o DOM repetidamente.
• Gosta de websites lentos.
• Seu cliente possui um alienware.
Melhores práticas
var localArr = ["Item 1", "Item 2", "Item 3", "Item 4"],
$list = $("ul.items");
$.each(localArr, function(index, value) {
$list.append("<li id=" + index + ">" + value + "</li>");
});
var localArr = ["Item 1", "Item 2", "Item 3", "Item 4"],
$list = $("ul.people"),
dynamicItems = "";
$.each(localArr, function(index, value) {
dynamicItems += "<li id=" + index + ">" + value + "</li>";
});
$list.append(dynamicItems);
51. jQuery
• Manipulação de eventos
• Funciona bem se:
• Gosta de usar muita memória pra gerenciar os eventos.
• Possui poucos elementos DOM.
• Nunca vai precisar alterar esses seletores.
Melhores práticas
$("#longlist li").on("mouseenter", function() {
$(this).text("Evento de mouse hover");
});
$("#longlist li").on("click", function() {
$(this).text("Evento de click");
});
var list = $("#longlist");
$list
.on("mouseenter", "li", function(){
$(this).text("Evento de mouse hover");
})
.on("click", "li", function() {
$(this).text("Evento de click");
});
52. jQuery
• Documentação oficial:
• http://api.jquery.com/
• Melhores práticas para criação de plugins:
• http://learn.jquery.com/plugins/
• Melhores práticas de jQuery:
• http://lab.abhinayrathore.com/jquery-standards/
• http://gregfranko.com/jquery-best-practices/
Referências
53.
54. Quiz
O que esse seletor irá retornar?
$('h1.header>p#information');
1. uma <header>
2. uma <p> com id information
3. uma <h1> com a classe header dentro de um <p>
55. Quiz
O que esse seletor irá retornar?
$('h1.header>p#information');
1. uma <header>
2. uma <p> com id information
3. uma <h1> com a classe header dentro de um <p>
Exercícios
Selecionando
Abra o arquivo/exercises/index.html no seu navegador. Use o arquivo /exercises/js/
sandbox.js ou trabalhe no Firebug para fazer o seguinte:
1. Selecione todos os elementos DIV que têm a classe "module".
2. Escreva três seletores que você pode usar para obter o terceiro item na lista não-ordenada #myList.
Qual é o melhor para se usar? Por quê?
3. Selecione o label para o input de busca usando um seletor de atributo.
O básico de jQuery
35
4. Encontre quantos elementos na página estão escondidos (dica: .length).
5. Encontre quantos elementos na página têm um atributo alt.
6. Selecione todas as linhas ímpares no corpo de uma tabela.
Atravessamento
Abra o arquivo/exercises/index.html no seu navegador. Use o arquivo /exercises/js/
sandbox.js ou trabalhe no Firebug para fazer o seguinte:
1. Selecione todos os elementos de imagem na página; logue o atributo alt de cada imagem.
2. Selecione a caixa de texto de busca, então atravesse para o form e adicione uma classe nele.
3. Selecione o item de lista dentro de #myList que possui uma classe "current" e remova esta classe dele;
adicione uma classe "current" no próximo item de lista.
4. Selecione o elemento select dentro de #specials; atravesse para o botão de submit.
5. Selecione o primeiro item de lista no elemento #slideshow; adicione a classe "current" a ele e então
adicione a classe "disabled" para seus elementos sibling.
Manipulando
Abra o arquivo/exercises/index.html no seu navegador. Utilize o arquivo /exercises/js/
sandbox.js ou use o Firebug para realizar o seguinte:
1. Adicione cinco novos itens de lista no fim da lista não ordenada #myList. Dica:
for (var i = 0; i<5; i++) { ... }
2. Remova os itens ímpares
3. Adicione outro h2 e outro parágrafo à última div.module
4. Adicione outra opção para o elemento select; dê ao option o valor "Quarta-Feira".
5. Adicione uma nova div.
Criando uma dica de Input
Abra o arquivo /exercises/index.html no seu navegador. Use o arquivo /exercises/js/
inputHint.js ou trabalhe no Firebug. Sua tarefa é usar o texto do label para o input da busca para
criar um texto de "hint" para o input da busca. Os passos são os seguintes:
1. Sete o valor do input de busca para o texto do elemento label
2. Adicione uma classe "hint" ao input de busca
3. Remova o elemento label
4. Faça um Bind do evento focus no input de busca que remove o texto de hint e a classe "hint".
5. Faça um bind do evento blur para o input de busca que restaura o texto de hint e a classe "hint" se
nenhum texto for informado.
Quais outras considerações poderiam haver se você estivesse criando esta funcionalidade para um site real?
Adicionando navegação por abas
Abra o arquivo/exercises/index.html no seu navegador. Use o arquivo /exercises/js/
tabs.js. Sua tarefa é criar uma navegação por abas para os dois elementos div.module. Para fazer isto:
1. Esconda todos os modules.
2. Crie uma lista não-ordenada antes do primeiro módulo.
3. Itere sobre os módulos usando $.fn.each. Para cada módulo, use o texto para o elemento h2 como
o texto para um item da lista.
4. Crie um bind do evento click no item de lista que:
• Exiba o módulo relacionado e esconda qualquer outro módulo.
• Adicione uma classe "current" para o item de lista clicado.
• Remova a classe "current" do outro item de lista.
5. Por último, mostre a primeira tabela.