jquery 2

115
Eduardo Mendes ([email protected]) jQuery e CSS 1

Upload: eduardo-mendes-de-oliveira

Post on 26-Jun-2015

497 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Jquery 2

Eduardo Mendes ([email protected])

jQuery e CSS

1

Page 2: Jquery 2

Eduardo Mendes ([email protected])2

Separation of Concerns

Descrição do Conteúdo

Apresentação do Conteúdo

Controle docomportamento deste Conteúdo

Page 3: Jquery 2

Eduardo Mendes ([email protected])3

jQuery e CSS

.css(<attr>, <value>)$(this).css("font-size", “10px”).css(“border”, “1px solid");

.css({<attr>:<value>, <attr>:<value>,})$(this).css({“font-size”:”10px”,”border" : "1px solid”});

Page 4: Jquery 2

Eduardo Mendes ([email protected])4

jQuery e CSS

.show()$(this).css("display", “block”);

.hide()$(this).css("display", “none”);

Page 5: Jquery 2

Eduardo Mendes ([email protected])5

jQuery e CSS

.addClass() .removeClass()

.toggleClas()

Page 6: Jquery 2

Eduardo Mendes ([email protected])6

jQuery e CSS

$(this).animate({'top': '0px'});

$(this).hasClass('nomeDaClasse');

Page 7: Jquery 2

Eduardo Mendes ([email protected])

Ajax Básico

7

Page 8: Jquery 2

Eduardo Mendes ([email protected])8

Revelar conteúdo

Page 9: Jquery 2

Eduardo Mendes ([email protected])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?

Page 10: Jquery 2

Eduardo Mendes ([email protected])

$.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 funcionacorretamente

executa uma requisição HTTP assíncrona

Page 11: Jquery 2

Eduardo Mendes ([email protected])11

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"> ! </div> </li>

index.html

$.ajax(url [, settings])

Page 12: Jquery 2

Eduardo Mendes ([email protected])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 ret

orna

com sucesso

resposta, que não

é uma página HMTL

completa

Page 13: Jquery 2

Eduardo Mendes ([email protected])

$.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

Page 14: Jquery 2

Eduardo Mendes ([email protected])14

Atalho com $.get$('.bebidas').on('click', 'button', function () { !

!

!

!

!

});

$.ajax('receita.html', { success: function(response) { $(’.receita').html(response).slideDown(); } });

$('.bebidas').on('click', 'button', function () { !

!

!

});

$.get('receita.html', function(response) { $(’.receita').html(response).slideDown(); });

equivalentes

Page 15: Jquery 2

Eduardo Mendes ([email protected])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

Page 16: Jquery 2

Eduardo Mendes ([email protected])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} });

Page 17: Jquery 2

Eduardo Mendes ([email protected])17

Como enviar parâmetros?

$.ajax(‘receita.html’, { success: function(response) { $(".receita").html(response).slideDown(); }, });

<div class=“receita” data-id=“123”>

data: {id: $(“.receita”).data("id") }

Page 18: Jquery 2

Eduardo Mendes ([email protected])

$.ajax(url [, settings])

18

• success: só executa quando a chamada a url funcionacorretamente

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 arequisição deve deve esperar

• beforeSend: executa antes darequisição ajax

• complete: executa após a execuçãoda requisição com sucesso ou erro

Page 19: Jquery 2

Eduardo Mendes ([email protected])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 ocorreum timeout, erro no servidor, ou a requisição é abortada

Page 20: Jquery 2

Eduardo Mendes ([email protected])20

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) { ... }, !

!

!

!

!

!

!

!

}); });

timeout: 3000,beforeSend: function() { $(".bebidas").addClass("carregando"); }complete: function() { $(".bebidas").removeClass("carregando"); }

Page 21: Jquery 2

Eduardo Mendes ([email protected])

JavaScript: Objetos

21

Page 22: Jquery 2

Eduardo Mendes ([email protected])

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

variavelObjeto

idade=10

variavelDoObjeto.nomeDaPropriedade o.idade

Page 23: Jquery 2

Eduardo Mendes ([email protected])

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

Page 24: Jquery 2

Eduardo Mendes ([email protected])

ObjetosLiterais

24

var moto = {cor: "vermelha", rodas: 4, cilindros: 4};

Page 25: Jquery 2

Eduardo Mendes ([email protected])

FunçãoConstrutora

25

function Carro(fabricante, modelo, ano) { this.fabricante = fabricante; this.modelo = modelo; this.ano = ano; }

var outroCarro = new Carro("Hyundai", "Tucson", 2009); !

var aqueleCarro = new Carro("Ford", "Fiesta", 2014);

Page 26: Jquery 2

Eduardo Mendes ([email protected])

Métodos

26

var moto = {cor: "vermelha", rodas: 4, cilindros: 4};

Como foi visto os objetos são formados por propriedades

Page 27: Jquery 2

Eduardo Mendes ([email protected])

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ídaa uma propriedade do objeto

var meuObjeto = { meuMetodo: function(params) { // algum comportamento } };

Page 28: Jquery 2

Eduardo Mendes ([email protected])28

Métodos

function Moto(cor, rodas, cilindros) { this.cor = cor; this.rodas = rodas; this.cilindros = cilindros; !

}

function exibirDados() { var resultado = "Dados da moto: cor - " + this.cor + ", rodas: " + this.rodas + ", cilindros: " + this.cilindros; alert(resultado); }

this.exibirDados = exibirDados;

Page 29: Jquery 2

Eduardo Mendes ([email protected])

Encapsulando comportamento jQuery em objetos

29

Page 30: Jquery 2

Eduardo Mendes ([email protected])30

Refatorando$(document).ready(function () { $(".bebidas").on('click', 'button', function () { $.ajax('receita.html', { success: function(response) { $(".receita").html(response).slideDown(); }, error: function(request, errorType, errorMessage) { alert('Error: ' + errorType + ', mensagem: ' + errorMessage); }, timeout: 3000, beforeSend: function() { $(".bebidas").find("button").addClass("carregando"); }, complete: function() { $(".bebidas").find("button").removeClass("carregando"); } }); }); ! $('.bebidas').on('click', '.expandir', function(event) { event.preventDefault(); $(".bebida").find("img").show(); }); });

Page 31: Jquery 2

Eduardo Mendes ([email protected])31

Refatorandovar 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

Page 32: Jquery 2

Eduardo Mendes ([email protected])32

Refatorandovar receita = { init: function() { !

!

!

!

!

!

!

} };

$(document).ready(function () { receita.init(); }

$('.bebidas').on('click', 'button', function () { $.ajax('receita.html', { ... }); }); !

$('.bebidas').on('click', '.expandir', function(event) {});

Page 33: Jquery 2

Eduardo Mendes ([email protected])33

Refatorandovar receita = { init: function() { !

!

}, !

!

!

!

!

};

$(document).ready(function () { receita.init(); }

$('.bebidas').on('click', 'button', function () {}); $('.bebidas').on('click', '.expandir', function(event) {…}); !

!

!

$.ajax('receita.html', { ... }); carregamentoOk: function() { !

}

Page 34: Jquery 2

Eduardo Mendes ([email protected])34

Refatorandovar receita = { init: function() { !

!

}, !

!

!

!

!

};

$(document).ready(function () { receita.init(); }

$('.bebidas').on('click', 'button', this.carregamentoOK); $('.bebidas').on('click', '.expandir', function(event) {…}); !

!

!

$.ajax('receita.html', { ... }); carregamentoOk: function() { !

}o mesmo pode ser feito para o carregento da imagem

Page 35: Jquery 2

Eduardo Mendes ([email protected])

jQuery com Funções Construtoras

35

Page 36: Jquery 2

Eduardo Mendes ([email protected])36

Objeto Literalvar receita = { init: function() { //inic. da receita } }; !$(document).ready(function () { receita.init(); }

limitada a uma única receita

function Receita(sabor) { //inic. do sabor da receita !

} !

!

$(document).ready(function () { !

!

}

múltiplas bebidas

Função Construtora

var limao = new Receita('limao'); var negro = new Rece‘ta('negro');

Page 37: Jquery 2

Eduardo Mendes ([email protected])37

Refatorandovar receita = { init: function() { $('.bebidas').on('click', 'button', this.carregamentoOK); $('.bebidas').on('click', '.expandir', this.exibirImagem); }, carregamentoOk: function() {…}, exibirImagem: function() {…} };

$(document).ready(function () { receita.init(); }

Page 38: Jquery 2

Eduardo Mendes ([email protected])38

Refatorandofunction 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

Page 39: Jquery 2

Eduardo Mendes ([email protected])39

Refatorandofunction 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

Page 40: Jquery 2

Eduardo Mendes ([email protected])40

Refatorandofunction Receita(el) { this.el = el; !

!

!

!

!

!

!

!

!

!

this.el.on('click', 'button', this.carregamentoOk); this.el.on('click', '.expandir', this.exibirFoto); }

atingirá qualquer elemento de classe receitathis.carregamentoOk = function() {

$.ajax('receita.html', { timeout: 3000, success: function(response) { $('.receita').html(response).slideDown(); } });

Page 41: Jquery 2

Eduardo Mendes ([email protected])41

Refatorandofunction Receita(el) { this.el = el; !

!

!

!

!

!

!

!

!

this.el.on('click', 'button', this.carregamentoOk); this.el.on('click', '.expandir', this.exibirFoto); }

this.carregamentoOk = function() { $.ajax('receita.html', { timeout: 3000, success: function(response) { .html(response).slideDown(); } });

this.receita = this.el.find(".receita");

this.receita

Page 42: Jquery 2

Eduardo Mendes ([email protected])42

Funciona?this incorreto

Page 43: Jquery 2

Eduardo Mendes ([email protected])43

Refatorandofunction Receita(el) { this.el = el; !

!

!

!

!

!

!

!

!

this.el.on('click', 'button', this.carregamentoOk); this.el.on('click', '.expandir', this.exibirFoto); }

this.carregamentoOk = function() { $.ajax('receita.html', { timeout: 3000, success: function(response) { .html(response).slideDown(); } });

this.receita = this.el.find(".receita");

this.receita

dentro da $.ajax, this se refere às configurações

Page 44: Jquery 2

Eduardo Mendes ([email protected])44

Refatorandofunction Receita(el) { this.el = el; !

!

!

!

!

!

!

!

!

!

!

this.el.on('click', 'button', this.carregamentoOk); this.el.on('click', '.expandir', this.exibirFoto); }

this.carregamentoOk = function() { $.ajax('receita.html', { timeout: 3000, !

success: function(response) { this.receita.html(response).slideDown(); } });

this.receita = this.el.find(".receita");var that = this;

context: that,

configura quem é o this dentro do callback

Page 45: Jquery 2

Eduardo Mendes ([email protected])45

Refatorandothis.exibirFoto = function(event) { event.preventDefault(); $(".bebida").find("img").show(); }

Page 46: Jquery 2

Eduardo Mendes ([email protected])46

Refatorandothis.exibirFoto = function(event) { event.preventDefault(); that.el.find("img").show(); }

Page 47: Jquery 2

Eduardo Mendes ([email protected])47

Funciona?

Page 48: Jquery 2

Eduardo Mendes ([email protected])

Forms

48

Page 49: Jquery 2

Eduardo Mendes ([email protected])49

Submetendo via POST com jQuery Ajax

$(document).ready(function () { $('form').on('submit', function(e) { $.ajax('pedidos.html', { type: 'POST' }); }); });

Page 50: Jquery 2

Eduardo Mendes ([email protected])50

Formulário

Page 51: Jquery 2

Eduardo Mendes ([email protected])51

Submetendo via POST com jQuery Ajax

$(document).ready(function () { $('form').on('submit', function(e) { $.ajax('pedidos.html', { type: 'POST' }); }); });

Page 52: Jquery 2

Eduardo Mendes ([email protected])52

Submetendo via POST com jQuery Ajax

$(document).ready(function () { $('form').on('submit', function(event) { event.preventDefault(); $.ajax('pedidos.html', { type: 'POST' }); }); });

e os dados?

Page 53: Jquery 2

Eduardo Mendes ([email protected])53

Submetendo via POST com jQuery Ajax$(document).ready(function () { $('form').on('submit', function(event) { event.preventDefault(); $.ajax('pedidos.html', { type: 'POST' }); }); }); <form action="pedidos.html">

<select name="sabor" id="sabor"> <option>Limao</option> <option>Negro</option> </select> <input type="text" id="quantidade" name="quantidade" value="1"/> <input type="submit" value="FAZER O PEDIDO" /> </form>

Page 54: Jquery 2

Eduardo Mendes ([email protected])54

Submetendo os dados$(document).ready(function () { $('form').on('submit', function(event) { event.preventDefault(); $.ajax('pedidos.html', { type: ‘POST’, !

!

!

!

}); }); });

data: {"sabor": $("#sabor").val(), "quatidade": $("#quantidade").val() }

Page 55: Jquery 2

Eduardo Mendes ([email protected])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

Page 56: Jquery 2

Eduardo Mendes ([email protected])56

Submetendo os dados$(document).ready(function () { $('form').on('submit', function(event) { event.preventDefault(); $.ajax('pedidos.html', { type: ‘POST’, data: !

!

!

!

}); }); });

$('form').serialize()success: function(result) { $('form').remove(); $('#pedido').hide().html(result).fadeIn(); }

Page 57: Jquery 2

Eduardo Mendes ([email protected])57

Funciona?

Page 58: Jquery 2

Eduardo Mendes ([email protected])

jQuery, Ajax e JSON

58

Page 59: Jquery 2

Eduardo Mendes ([email protected])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 NotationUm formato de dados para se utilizar em web

Page 60: Jquery 2

Eduardo Mendes ([email protected])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(); } }); }); });

Page 61: Jquery 2

Eduardo Mendes ([email protected])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ó JSONsolicita que a resposta

seja no formato JSON

Page 62: Jquery 2

Eduardo Mendes ([email protected])62

Este código trabalha com HTML formatadosuccess: 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

Page 63: Jquery 2

Eduardo Mendes ([email protected])63

Refatorando$.ajax('pedidos.html', {…}); <form action=“/pedidos.html”

method=“post"> … </form>

$.ajax(‘pedidos.html’).attr(‘action’), {…});

.attr(<atributo>); .attr(<atributo>, <valor>);

métodos jQuery

Page 64: Jquery 2

Eduardo Mendes ([email protected])64

Código finalizado$('form').on('submit', function (event) { var form = $(this); event.preventDefault(); $.ajax(form.attr('action'), { type: 'POST', dataType: 'json', data: form.serialize(), success: function (result) { form.remove(); var texto = $("<p></p>"); texto.append("Pedido: " + result.pedido + ". "); texto.append("Quantidade: " + result.quantidade + ". "); texto.append("Sanduiche: " + result.sanduiche + ". "); texto.append("Total: " + result.total + ". "); $('#pedido').hide().html(msg).fadeIn(); }, contentType: 'application/json' }); });

Page 65: Jquery 2

Eduardo Mendes ([email protected])

Métodos úteis

65

Page 66: Jquery 2

Eduardo Mendes ([email protected])66

Ajax & JSON

<h1>Bem-vindo ao jQuery Festas</h1> <button>Bebida em Destaque</button> ! <div class="destaque"> <h2>Destaque</h2> <img src=""/> <p></p> </div>

Page 67: Jquery 2

Eduardo Mendes ([email protected])67

Ajax & JSON

<h1>Bem-vindo ao jQuery Festas</h1> <button>Bebida em Destaque</button> ! <div class="destaque"> <h2>Destaque</h2> <img src=""/> <p></p> </div>

$('button').on('click', function () { $.ajax('bebidas/favoritas/1', { contentType: 'application/json', dataType: 'json',

success: function(result) {

{ "nome": "Lemon Breeze", "imagem": "imagens/yellow.gif" }

var destaque = $('.destaque'); destaque.find('p').html(destaque.find('img')

result.nome);

.attr(‘src', result.imagem); } }); });

e se existissem múltiplos destaques?

Page 68: Jquery 2

68

Page 69: Jquery 2

Eduardo Mendes ([email protected])69

JSON com vários resultados

{ "nome": "Lemon Breeze", "imagem": "imagens/yellow.gif" },

[ !

!

!

!

{ "nome": "Dark Juice", "imagem": "imagens/black.gif" }, { "nome": "Chai Tea", "imagem": "imagens/chai.gif" } ]

success: function(result) { var destaque = $('.destaque'); destaque.find('p').html(result.nome); destaque.find('img') .attr('src', result.imagem); }

result

application.js

O resultado é um array de objetos

precisa-se de um laço para cada destaque

Page 70: Jquery 2

Eduardo Mendes ([email protected])70

$.each -> iteração sobre um array

success: function(result) { !

var destaque = $(‘.destaque ); destaque.find(‘p').html( .nome); destaque.find('img') .attr('src', .imagem); !

}

application.js

<li class="destaque-0"> … </li> !

<li class="destaque-1"> … </li> !

<li class="destaque-2"> … </li>

index.html

$.each(colecao, function(<indice>, <objeto>) {});

Executa a função para cada objeto da coleção

$.each(result, function(indice, bebida) {-' + indice

bebida

bebida

Page 71: Jquery 2

Eduardo Mendes ([email protected])

E quando a quantidade de informação for variável?

71

Page 72: Jquery 2

Eduardo Mendes ([email protected])72

E quando a quantidade de informação for variável?

Page 73: Jquery 2

Eduardo Mendes ([email protected])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

Page 74: Jquery 2

Eduardo Mendes ([email protected])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);

Page 75: Jquery 2

Eduardo Mendes ([email protected])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]

Page 76: Jquery 2

Eduardo Mendes ([email protected])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>

Page 77: Jquery 2

Eduardo Mendes ([email protected])77

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; });

[ ]$(‘<h3> Pedido: ’ + pedido.numero + ‘</h3>’).appendTo(item-pedido);$(‘<p>’ + pedido.status + ‘</p>’).appendTo(item-pedido);

<li> <h3>Pedido: 50</h3> <p>Não iniciado</p> </li>

<li> <h3>Pedido: 45</h3> <p>Entregue</p> </li>

<li> <h3>Pedido: 47</h3> <p>Cancelado</p> </li>

Page 78: Jquery 2

Eduardo Mendes ([email protected])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); }); });

Page 79: Jquery 2

Eduardo Mendes ([email protected])

E quando a quantidade de informação for

79

Page 80: Jquery 2

Eduardo Mendes ([email protected])

Plugins

80

Page 81: Jquery 2

Eduardo Mendes ([email protected])

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

Page 82: Jquery 2

Eduardo Mendes ([email protected])

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

Page 83: Jquery 2

Eduardo Mendes ([email protected])

$.fn

83

Todos este métodos estão no objeto $.fn

Novos métodos (plugins) também deverão ser adicionados a ele

Page 84: Jquery 2

Eduardo Mendes ([email protected])84

Caminho simples para o plugin

A forma mais simples é adicionar uma propriedade ao $.fn

$.fn.umPlugin = function() { // lógica encapsulada }

Page 85: Jquery 2

Eduardo Mendes ([email protected])85

Por partes

$ apelido para o objeto jQuery

window.jQuery = window.$ = jQuery

então porque não utilizar:

Page 86: Jquery 2

Eduardo Mendes ([email protected])86

Por partesvar 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

Page 87: Jquery 2

Eduardo Mendes ([email protected])

FunçãoConstrutora

87

function Carro(fabricante, modelo, ano) { this.fabricante = fabricante; this.modelo = modelo; this.ano = ano; }

var outroCarro = new Carro("Hyundai", "Tucson", 2009);

Page 88: Jquery 2

Eduardo Mendes ([email protected])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);

Page 89: Jquery 2

Eduardo Mendes ([email protected])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

Page 90: Jquery 2

Eduardo Mendes ([email protected])90

Um plugin simples“Amarelar" o que se quiser

$.(a).css(“color”, “yellow”);$.fn.amarelar = function() { // lógica encapsulada }

Page 91: Jquery 2

Eduardo Mendes ([email protected])91

Um plugin simples“Amarelar" o que se quiser

$.fn.amarelar = function() { this.css(‘color’, ‘yellow’); }

$(document).ready(function () { $('a').amarelar(); });

Page 92: Jquery 2

Eduardo Mendes ([email protected])92

Encadeamento“Amarelar" o que se quiser

$.fn.amarelar = function() { this.css(‘color’, ‘yellow’); return this; }

$(document).ready(function () { $(‘a’).amarelar().fadeIn(); });

Page 93: Jquery 2

Eduardo Mendes ([email protected])

Para estar disponível

em todas as instâncias

93

utilize $.fn

Page 94: Jquery 2

Eduardo Mendes ([email protected])

E se existirem outros plugins que utilizam parâmetros com mesmos nomes?

94

e quantoà $??

Page 95: Jquery 2

Eduardo Mendes ([email protected])95

Protegendo o escopoUtilize Funções IIFE (Immediately-Invoked Function Expressions)

padrão comum para evitar problemas de sombreamento de variáveis

tudo que for declaradotem escopo somente nesse bloco

(function() { var qualquer = “Hello”; })();

var carro = new Carro(); !

(function(c) { c.ligar(); })(carro);

(function($) { … })(jQuery);

modo jQuery

Page 96: Jquery 2

Eduardo Mendes ([email protected])96

Um plugin com IIFE“Amarelar" o que se quiser

$.fn.amarelar = function() { this.css(‘color’, ‘yellow’); }

$(document).ready(function () { $('a').amarelar(); });

Page 97: Jquery 2

Eduardo Mendes ([email protected])97

Um plugin com IIFE“Amarelar" o que se quiser

(function($) { $.fn.amarelar = function() { this.css(‘color’, ‘yellow’); } })(jQuery);

$(document).ready(function () { $('a').amarelar(); });

Page 98: Jquery 2

Eduardo Mendes ([email protected])

Preços

98

Page 99: Jquery 2

Eduardo Mendes ([email protected])99

index.html <ul class="bebidas"> <li class="bebida" data-preco="15.00"> <p> <img src="imagens/yellow.gif"/> </p> !

<h3>Lemon Breeze</h3> <button>Consultar Preco</button> </li> <li class="bebida" data-preco="20.00"> … </li> <li class="bebida" data-preco="17.00"> … </li>

$('.bebida').precificar();

Page 100: Jquery 2

Eduardo Mendes ([email protected])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();

Page 101: Jquery 2

Eduardo Mendes ([email protected])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(); });

Page 102: Jquery 2

Eduardo Mendes ([email protected])

Preços

102

Page 103: Jquery 2

Eduardo Mendes ([email protected])103

Corrigindo o comportamento

$.fn.precificar = function() { console.log('Chamando preficicar'); console.log(this); }

this.each()…

Page 104: Jquery 2

Eduardo Mendes ([email protected])104

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); }); };

Page 105: Jquery 2

Eduardo Mendes ([email protected])105

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); }); !

};

this.each(function () {

});

Page 106: Jquery 2

Eduardo Mendes ([email protected])106

Plugins com parâmetros$(document).ready(function () { $('.bebida').precificar({ dias:5 }); });

$.fn.precificar = function(opcoes) { … var preco = bebida.data('preco'); var detalhes = $(‘<p>Preco:' + opcoes.dias + ' drinks por ‘ + opcoes.dias * preco + '</p>');

e se fosse necessário parâmetros com valores default?

Page 107: Jquery 2

Eduardo Mendes ([email protected])107

Parâmetros opcionais$(document).ready(function () { $('.bebida').precificar({ dias:5 }); });

$(document).ready(function () { $(‘.bebida').precificar(); });

com ou sem parâmetros

$.fn.precificar = function(opcoes) { …

Page 108: Jquery 2

Eduardo Mendes ([email protected])108

Parâmetros opcionais com $.extendCombina os objetos$.extend(target[, objeto1, objeton]);

$.extend({ dias: 3 }, { preco: 5 }); { dias: 3, preco: 5 }

$.extend({ dias: 3 }, {}); { dias: 3 }

$.extend({ dias: 3 }, { dias: 5 }); { dias: 3 }

a forma de configurar um valor default

Page 109: Jquery 2

Eduardo Mendes ([email protected])109

Adicionando o parâmetro opcional

$.fn.precificar = function (opcoes) { this.each(function () { var bebida = $(this); console.log(bebida); bebida.on('click.precificar', 'button', function () { var preco = bebida.data('preco'); … }); }); };

Page 110: Jquery 2

Eduardo Mendes ([email protected])110

Adicionando o parâmetro opcional

$.fn.precificar = function (opcoes) { this.each(function () { var bebida = $(this); console.log(bebida); bebida.on('click.precificar', 'button', function () { var preco = bebida.data('preco'); … }); }); };

var configuracoes = $.extend({dias: 3}, opcoes);

Page 111: Jquery 2

Eduardo Mendes ([email protected])111

Adicionando o parâmetro opcional

$.fn.precificar = function (opcoes) { this.each(function () { var bebida = $(this); var configuracoes = $.extend({dias: 3}, opcoes); bebida.on('click.precificar', 'button', function () { var preco = bebida.data('preco'); var detalhes = $('<p>Preco:' + configuracoes.dias + ' drinks por ' + configuracoes.dias * preco + '</p>'); $(this).hide(); bebida.append(detalhes); }); }); };

Page 112: Jquery 2

Eduardo Mendes ([email protected])

Refatorando para parâmetros

112

Page 113: Jquery 2

Eduardo Mendes ([email protected])113

Adicionando o parâmetro opcional

$.fn.precificar = function (opcoes) { this.each(function () { var bebida = $(this); var config = $.extend({dias: 3}, opcoes); bebida.on('click.precificar', 'button', function () { var preco = bebida.data('preco'); var detalhes = $('<p>Preco:' + config.dias + ' drinks por ' + config.dias * preco + '</p>'); $(this).hide(); bebida.append(detalhes); }); }); };

Page 114: Jquery 2

Eduardo Mendes ([email protected])114

Adicionando o parâmetro opcional$.fn.precificar = function (opcoes) { this.each(function () { !

var config = $.extend({ dias: 3, bebida: $(this), preco: $(this).data(‘preco') botao: $(this).find(‘button') }, opcoes); config.bebida.on('click.precificar', 'button', function () { var detalhes = $('<p>Preco:' + config.dias + ' drinks por ' + config.dias * config.preco + '</p>'); config.botao.hide(); config.bebida.append(detalhes); }); }); };

config.dias

config.bebida

config.preco

config.botao

Page 115: Jquery 2

Eduardo Mendes ([email protected])115

Mais um botão