9. Eduardo Mendes (edumendes@gmail.com)9
Código sem Ajax
<li class="bebida promocao" data-preco="15.00">
<h3>Lemon Breeze</h3>
<p>R$ 15.00</p>
<button>Veja a Receita</button>
<div class="receita">
<p>Um drinks mais que … </p>
<a href="#" class="expandir">Veja a bebida</a>
<img src="imagens/yellow.gif"/>
</div>
</li>
index.html
$('.bebidas’).on(‘click','button', function () {
$(this).closest(".bebida").find(".receita").slideDown();
});
$('.bebidas').on('click', ‘.expandir', function() {
$(this).closest(".bebida").find("img").show();
});
application.js
apresenta o elemento oculto
quando é clicado
exibe a imagem
quando é clicado
QUal seria a forma
de apresentar este conteúdo
de maneira dinâmica?
10. Eduardo Mendes (edumendes@gmail.com)
$.ajax(url [, settings])
10
url
obrigatória
settings
configurações opcionais
conjunto chave/valor que configura
a requisição AJAX
• success: só executa quando
a chamada a url funciona
corretamente
executa uma requisição
HTTP assíncrona
12. Eduardo Mendes (edumendes@gmail.com)12
Utilizando uma requisição AJAX
$('.bebidas').on('click', 'button', function () {
!
!
!
!
!
});
$.ajax('receita.html', {
success: function(response) {
$(’.receita').html(response).slideDown();
}
});
<p>Um drinks …</p>
<a href="#" class="expandir">Veja a bebida</a>
<img src="imagens/yellow.gif"/>
application.js
receita.html
só executa quando
a resposta retorna
com sucesso
resposta, que não
é uma página HMTL
completa
13. Eduardo Mendes (edumendes@gmail.com)
$.get(url, success)
13
url
obrigatória
success
função a ser executada
quando a resposta for
retornada
executa uma requisição
HTTP assíncrona via HTTP GET
15. Eduardo Mendes (edumendes@gmail.com)15
Como enviar parâmetros?
$.ajax('receita.html', {
success: function(response) {
$(".receita").html(response).slideDown();
}
});
sempre recupera o mesmo arquivo
Como criar um site em que a requisição levasse em conta o ID da receita?
receita.html?id=123
16. Eduardo Mendes (edumendes@gmail.com)16
Como enviar parâmetros?
$.ajax(‘receita.html?id=123', {
success: function(response) {
$(".receita").html(response).slideDown();
}
});
sempre recupera o mesmo arquivo
$.ajax(‘receita.html’, {
success: function(response) {
$(".receita").html(response).slideDown();
},
data: {“id”: 123}
});
18. Eduardo Mendes (edumendes@gmail.com)
$.ajax(url [, settings])
18
• success: só executa quando
a chamada a url funciona
corretamente
executa uma requisição
HTTP assíncrona
• error: executa quando ocorre
um timeout, erro no servidor,
ou a requisição é abortada
• timeout: indica em ms quanto a
requisição deve deve esperar
• beforeSend: executa antes da
requisição ajax
• complete: executa após a execução
da requisição com sucesso ou erro
19. Eduardo Mendes (edumendes@gmail.com)19
Manipulando requisições com falha
$('.bebidas').on('click', 'button', function () {
$.ajax('http://www.fa7.edu.br/pos-si/receita.html', {
success: function(response) {
$(".receita").html(response).slideDown();
}
!
!
!
});
});
,
error: function(request, errorType, errorMessage) {
alert('Error: ' + errorType + ', mensagem: ' + errorMessage);
}
• error: executa quando ocorre
um timeout, erro no servidor,
ou a requisição é abortada
22. Eduardo Mendes (edumendes@gmail.com)
Objetos em
JavaScript
Uma entidade independente com
propriedades e tipo
como em outras linguagens as
propriedades são acessadas pela
notação do ponto
22
variavel
Objeto
idade=10
variavelDoObjeto.nomeDaPropriedade o.idade
23. Eduardo Mendes (edumendes@gmail.com)
Criando objetos
23
var carro = new Object();
!
carro.fabricante = "KIA";
carro.modelo = "Picanto";
carro.ano = 2012;
carro["fabricante"] = "Volks";
carro["modelo"] = "Gol";
carro["ano"] = 2013;
pode ser utilizado como
um array associativo
27. Eduardo Mendes (edumendes@gmail.com)
Métodos
27
variavelDoObjeto.nomeDoMetodo =
nome_funcao;
São funções associadas a um objeto…
ou é uma propriedade de um objeto
que é uma função
!
um método é uma função atribuída
a uma propriedade do objeto
var meuObjeto = {
meuMetodo: function(params) {
// algum comportamento
}
};
31. Eduardo Mendes (edumendes@gmail.com)31
Refatorando
var receita = {
init: function() {
//manipuladores de eventos
//já existentes
}
};
ele vai executar toda a operação
que foi feita dentro de ready
$(document).ready(function () {
receita.init();
}
facilita o entendimento
do que acontece
38. Eduardo Mendes (edumendes@gmail.com)38
Refatorando
function Receita(el) {
this.el = el;
//metodos auxiliares
//manipuladores de eventos
}
um elemento jQuery
que será manipulado
$(document).ready(function () {
var limao = new Receita($("#limao"));
var negro = new Receita($("#negro"));
});
executa o comportamento
para cada bebida
39. Eduardo Mendes (edumendes@gmail.com)39
Refatorando
function Receita(el) {
this.el = el;
!
!
!
!
!
}
$(document).ready(function () {
var limao = new Receita($("#limao"));
var negro = new Receita($("#negro"));
});
this.carregamentoOk = function() {...}
this.exibirFoto = function(event) {...}
!
this.el.on('click', 'button', this.carregamentoOk);
this.el.on('click', '.expandir', this.exibirFoto);
as referências dentro
das funções precisarão
ser revisadas
55. Eduardo Mendes (edumendes@gmail.com)55
Submetendo os dados
$(document).ready(function () {
$('form').on('submit', function(event) {
event.preventDefault();
$.ajax('pedidos.html', {
type: ‘POST’,
data:
!
!
!
});
});
});
$('form').serialize()
.serialize
cria uma string
de submissão
com todos os elementos do
formulário
59. Eduardo Mendes (edumendes@gmail.com)59
<p>
Seu pedido de 4 sanduiches,
do tipo Hamburguer,
foi registrado
no valor de R$ 20.00.
Aguarde ser chamado!
Número do pedido: 86
</p>
{
"pedido": 86,
"sanduiche": "Hambuguer",
"quantidade": 4,
"total": 20.00
}
HTML JSON
Servidor decide como
o HTML é formatado
O servidor fornece os dados que pode ser
apresentado de maneiras diferentes
JSON - Java Script Object Notation
Um formato de dados para se utilizar em web
60. Eduardo Mendes (edumendes@gmail.com)60
Este código trabalha com HTML formatado
$(document).ready(function () {
$('form').on('submit', function(event) {
var form = $(this);
event.preventDefault();
$.ajax('pedidos.html', {
type: 'POST',
data: form.serialize(),
success: function(result) {
form.remove();
$('#pedido').hide().html(result).fadeIn();
}
});
});
});
61. Eduardo Mendes (edumendes@gmail.com)61
Este código trabalha com HTML formatado
$('form').on('submit', function(event) {
var form = $(this);
event.preventDefault();
$.ajax('pedidos.html', {
type: 'POST',
data: form.serialize(),
!
success: function(result) {
form.remove();
$('#pedido').hide().html(result).fadeIn();
}
!
});
});
dataType: 'json',
,
contentType: 'application/json'
transforma a resposta
em JSON
o resultado não é HTML
então é preciso criar um
nó JSON
solicita que a resposta
seja no formato JSON
62. Eduardo Mendes (edumendes@gmail.com)62
Este código trabalha com HTML formatado
success: function(result) {
form.remove();
!
!
!
!
!
!
}
{
"pedido": 86,
"sanduiche": "Hambuguer",
"quantidade": 4,
"total": 20.00
}
result
<p>Pedido: 86. Sanduiche: Hamburguer. Quantidade: 4. Total: R$ 20.00</p>
var texto = $("<p></p>");
texto.append("Pedido: “ + result.pedido + ". ");
texto.append("Quantidade: “ + result.quantidade + “. ");
texto.append("Sanduiche: “ + result.sanduiche + ". ");
texto.append("Total: “ + result.total + ". ");
Json vai ser convertido
em um objeto JavaScript
$('#pedido').hide().html(msg).fadeIn();
Cria e adiciona o nó DOM
73. Eduardo Mendes (edumendes@gmail.com)73
Transforme um array de objetos em HTML
$('.atualizar-pedidos').on('click', function() {
$.ajax('status/todos.json', {
contentType: 'application/json',
dataType: 'json',
success: function (result) {...}
});
});
[
{
"numero": "50",
"status": "Não iniciado"
},
{
"numero": "45",
"status": "Entregue"
},
{
"numero": "47",
"status": "Cancelado"
}
!
]
result
$.getJSON(url, success);
$.getJSON('status/todos.json', function(result) {});
o resultado será um
array de objetos
application.js
74. Eduardo Mendes (edumendes@gmail.com)74
Transforme um array de objetos em HTML
$('.atualizar-pedidos').on('click', function() {
$.getJSON('status/todos.json', function(result) {
!
!
});
});
[
{
"numero": "50",
"status": "Não iniciado"
},
{
"numero": "45",
"status": "Entregue"
},
{
"numero": "47",
"status": "Cancelado"
}
!
]
result
<li>
<h3>numero</h3>
<p>status</p>
</li>
<li>
<h3>…</h3>
<p>…</p>
</li>
<li>
<h3>…</h3>
<p>…</p>
</li>
é precisso transformar
para um formato HTML
application.js
var pedidos = ????
$('ul').html(pedidos);
75. Eduardo Mendes (edumendes@gmail.com)75
Array com $.map()
$.map(colecao, function(<item>, <indice>) {});
a coleção pode ser um array
a ordem é diferente do each
o método map um array modificado a partir do array passado com o parâmetro
var numeros = [1,2,3,4]
!
var numeros-novos = $.map(numeros, function(item, indice) { return item + 1 });
numeros [1, 2, 3, 4]
numeros-novos [2, 3, 4, 5]
76. Eduardo Mendes (edumendes@gmail.com)76
Do JSON para o HTML
!
{
"numero": "50",
"status": "Não iniciado"
},
{
"numero": "45",
"status": "Entregue"
},
{
"numero": "47",
"status": "Cancelado"
}
[ ]$.map(result, function(pedido, indice) {
var item-pedido = $(“<li></li>”);
return item-pedido;
});
[ ]<li></li> <li></li> <li></li>
78. Eduardo Mendes (edumendes@gmail.com)78
Do JSON para o HTML
$.map(result, function (pedido, indice) {
var item_de_pedidos = $('<li></li>');
$('<h2>Pedido: ' + pedido.numero + '</h2>').appendTo(item_de_pedidos);
$('<p>' + pedido.status + '</p>').appendTo(item_de_pedidos);
return item_de_pedidos;
});
$('.atualizar-pedidos').on('click', function () {
$.getJSON('status/todos.json', function (result) {
var pedidos =
retorna-se a lista
alterada
$('ul').html(pedidos);
});
});
81. Eduardo Mendes (edumendes@gmail.com)
Plugin
81
Uma nova funcionalidade que pode
ser chamada a partir de uma
seleção jQuery
Pode ser reutilizada em outros
projetos
encapsulamento
e reaproveitamento
de código
82. Eduardo Mendes (edumendes@gmail.com)
a função $
$.(a).css(“color”, “yellow”);
a coleção pode ser um array
a ordem é diferente do each
Quando se utiliza a função $, o valor retornado é um objeto jQuery
$.(a).css(…)
Este objeto contém todos os métodos jQuery que estamos utilizando
$.(a).click(…) $.(a).addClass(…)
Além de todas as propriedades associadas a eles
86. Eduardo Mendes (edumendes@gmail.com)86
Por partes
var jQuery = function(selector, context) {
return new jQuery.fn.init(selector, context, rootjQuery);
}
jQuery é uma função Objeto
jQuery.fn = jQuery.prototype
uma propriedade que todos
os objetos herdam de Global
88. Eduardo Mendes (edumendes@gmail.com)88
function Carro(fabricante, modelo, ano) {
this.fabricante = fabricante;
this.modelo = modelo;
this.ano = ano;
}
var outroCarro =
new Carro("Hyundai", "Tucson", 2009);
outroCarro.abs = true;
var aqueleCarro =
new Carro("Ford", "Fiesta", 2014);
89. Eduardo Mendes (edumendes@gmail.com)89
function Carro(fabricante, modelo, ano) {
this.fabricante = fabricante;
this.modelo = modelo;
this.ano = ano;
}
var outroCarro =
new Carro("Hyundai", "Tucson", 2009);
outroCarro.abs = true;
var aqueleCarro =
new Carro("Ford", "Fiesta", 2014);
Carro.prototype.abs = true; a propriedade estará disponível
em todas as infâncias do objeto
90. Eduardo Mendes (edumendes@gmail.com)90
Um plugin simples
“Amarelar" o que se quiser
$.(a).css(“color”, “yellow”);
$.fn.amarelar = function() {
// lógica encapsulada
}
91. Eduardo Mendes (edumendes@gmail.com)91
Um plugin simples
“Amarelar" o que se quiser
$.fn.amarelar = function() {
this.css(‘color’, ‘yellow’);
}
$(document).ready(function () {
$('a').amarelar();
});
95. Eduardo Mendes (edumendes@gmail.com)95
Protegendo o escopo
Utilize Funções IIFE (Immediately-Invoked Function Expressions)
padrão comum
para evitar problemas de
sombreamento de variáveis
tudo que for declarado
tem escopo somente nesse bloco
(function() {
var qualquer = “Hello”;
})();
var carro = new Carro();
!
(function(c) {
c.ligar();
})(carro);
(function($) {
…
})(jQuery);
modo jQuery
96. Eduardo Mendes (edumendes@gmail.com)96
Um plugin com IIFE
“Amarelar" o que se quiser
$.fn.amarelar = function() {
this.css(‘color’, ‘yellow’);
}
$(document).ready(function () {
$('a').amarelar();
});
97. Eduardo Mendes (edumendes@gmail.com)97
Um plugin com IIFE
“Amarelar" o que se quiser
(function($) {
$.fn.amarelar = function() {
this.css(‘color’, ‘yellow’);
}
})(jQuery);
$(document).ready(function () {
$('a').amarelar();
});
100. Eduardo Mendes (edumendes@gmail.com)100
Criando um plugin
$.fn.precificar = function() {
console.log('Chamando preficicar');
console.log(this);
}
Disponibiliza o método
como uma função jQuery
o this será o objeto jQuery
onde o plugin foi chamado
$('.bebida').precificar();
101. Eduardo Mendes (edumendes@gmail.com)101
Criando um plugin e adicionando comportamento
$.fn.precificar = function() {
var bebida = this;
bebida.on('click', 'button', function() {
var preco = bebida.data('preco');
var detalhes = $('<p>Preco: ' + preco + '</p>');
$(this).hide();
bebida.append(detalhes);
});
};
$(document).ready(function () {
$('.bebida').precificar();
});