Escolar Documentos
Profissional Documentos
Cultura Documentos
Cobrir
Conteú do resumido
Índice
Introduçã o
requisitos de sistema
Requisitos de hardware
Requisitos de software
Pratique exercícios
Agradecimentos
Manter contato
Capítulo 1: Introduçã o ao Visua l Studio 2012 e Blend for Visual Studio 2012
Suporte CSS3
Suporte a JavaScript
Revisã o da aula
Explorando a mistura
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Exercício 1: Hello World com Visual Studio Express 2012 para Windows 8
Respostas
Liçã o 1
Liçã o 2
Resumo da liçã o
Revisã o da aula
Les resumo filho
Revisã o da aula
Pratica exercícios
Exercício 1: Crie um site simples usando o Visual Studio Express for Web
Respostas
Liçã o 1
Liçã o 2
Compreendendo o JavaScript
Usando declaraçõ es
Programaçã o condicional
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Capítulo 4: Primeiros passos com CSS3
Resumo da liçã o
Revisã o da aula
Definindo seletores
Usando especificidade
Entendendo a herança
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Anotando conteú do
Trabalhando com listas
Resumo da liçã o
Revisã o da aula
Colunas de estilo
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Implementando namespaces
Implementando herança
Resumo da liçã o
Revisã o da aula
Apresentando jQuery
Introduçã o ao jQuery
Usando jQuery
Resumo da liçã o
Revisã o da aula
Pratique exercícios
Liçã o 1
Liçã o 2
Resumo da liçã o
Revisã o da aula
Estilizando as validaçõ es
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Instalando Node.js
Les resumo filho
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Falha de manuseio
Atualizando progresso
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Formatos de vídeo
Definir a fonte
Acessando faixas
Resumo da liçã o
Revisã o da aula
Formatos de á udio
O elemento <audio>
Definir a fonte
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Implementando o can vas
Desenho de texto
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Exercício 1: Crie uma pá gina da web usando uma tela
Respostas
Liçã o 1
Liçã o 2
Arrastando
Droppi ng
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Manipulaçã o de erros
Abordando privacidade
Especificando opçõ es
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Explorando localStorage
Resumo da liçã o
Revisã o da aula
Inscrever-se em eventos
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Usando transaçõ es
Liçã o summa ry
Revisã o da aula
Usando lojas de objetos
Usando transaçõ es
Excluindo um registro
Recuperando um registro
Compreendendo os cursores
Resumo da liçã o
Revisã o da aula
Gravando em um arquivo
Lendo um arquivo
Excluindo um arquivo
Resumo da liçã o
Revisã o da aula
Suporte de navegador
Atualizando o cache
Entendendo eventos
Resumo da liçã o
Revisã o da aula
Pratica exercícios
Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Liçã o 4
Índice
Sobre o autor
Mapeamento de objetivos
Pá gina de pesquisa
Programaçã o
em HTML5 com
JavaScript e
CSS3
Glenn Johnson
PUBLICADO POR
Microsoft Press
ISBN: 978-0-7356-7438-7
Segunda Impressã o
Este livro expressa os pontos de vista e opiniõ es do autor. As informaçõ es contidas neste
livro sã o fornecidas sem qualquer garantia expressa, estatutá ria ou implícita. Nem os
autores, a Microsoft Corporation, nem seus revendedores ou distribuidores
serã o responsá veis por quaisquer danos causados ou alegadamente causados direta ou
indiretamente por este livro.
Indexador: Lucie Haskins
[09/08/2013]
Conteúdo resumido
Introdução xxi
CAPÍTULO 1
CAPÍTULO 2
CAPÍTULO 3
Introdução ao JavaScript
65
CAPÍTULO 4
137
CAPÍTULO 5
Mais HTML5
205
CAPÍTULO 6
261
CAPÍTULO 7
311
CAPÍTULO 8
Sites e serviços
341
CAPÍTULO 9
Operações assíncronas
393
CAPÍTULO 10
Comunicações WebSocket
415
CAPÍTULO 11
437
CAPÍTULO 12
459
CAPÍTULO 13
Arrastar e soltar
507
CAPÍTULO 14
539
CAPÍTULO 15
555
CAPÍTULO 16
581
Índice 621
Conteúdo
Introdução
xix
xx
requisitos de sistema
xx
Pratica exercícios
xxi
Agradecimentos xxi
xxi
xxi
Manter contato
xxi
Suporte CSS3
Suporte a JavaScript
Resumo da liçã o
14
Revisã o da aula
15
Explorando a mistura
16
Resumo da liçã o
22
Revisã o da aula
23
para Windows 8
24
para web
25
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
32
33
34
35
43
Resumo da liçã o
45
Revisã o da aula
46
47
49
50
Incorporando conteú do de plug-in
53
Resumo da liçã o
55
Revisã o da aula
56
56
59
61
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
65
Compreendendo o JavaScript
66
vi
Conteúdo
67
Usando declaraçõ es
71
73
77
78
78
Programaçã o condicional
80
84
Manipulaçã o de erros
87
Resumo da liçã o
88
Revisã o da aula
88
90
100
Lidar com navegadores que nã o suportam JavaScript
101
102
102
103
Resumo da liçã o
107
Revisã o da aula
107
108
112
Resumo da liçã o
120
Revisã o da aula
121
121
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,134
137
139
Conteúdo
vii
139
140
140
141
Resumo da liçã o
144
Revisã o da aula
145
Definindo seletores
146
Compreender os estilos integrados do navegador
159
159
159
160
Usando especificidade
161
Entendendo a herança
162
Resumo da liçã o
163
Revisã o da aula
164
166
173
175
176
Posicionando elementos < div >
178
186
189
190
193
Resumo da liçã o
193
Revisã o da aula
194
195
197
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
viii
Conteúdo
205
Liçã o 1: Pensando na semâ ntica do HTML5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
206
206
207
207
213
213
Anotando conteú do
213
221
Resumo da liçã o
228
Revisã o da aula
229
230
231
232
233
238
241
Colunas de estilo
241
Resumo da liçã o
242
Revisã o da aula
243
244
246
252
261
262
Conteúdo
ix
263
263
265
266
271
274
Implementando namespaces
276
Implementando herança
278
Resumo da liçã o
283
Revisã o da aula
284
Apresentando jQuery
285
Introduçã o ao jQuery
286
Usando jQuery
287
291
294
295
295
295
Resumo da liçã o
296
Revisã o da aula
296
297
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,308
311
312
316
316
Usando o elemento < label >
318
319
319
Conteúdo
321
321
Usando restriçõ es de envio de dados
322
322
Resumo da liçã o
323
Revisã o da aula
324
325
327
329
Estilizando as validaçõ es
330
Resumo da liçã o
330
Revisã o da aula
330
331
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
341
Instalando Node.js
342
342
344
345
354
354
Resumo da liçã o
363
Revisã o da aula
363
364
Criaçã o de um serviço da Web RESTful usando Node.js
366
368
380
Conteúdo
XI
Resumo da liçã o
381
Revisã o da aula
382
Pratique exercícios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
382
386
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Capítulo 9 Operações assíncronas
393
394
Falha de manuseio
397
397
398
398
400
Atualizando progresso
400
401
Resumo da liçã o
402
Revisã o da aula
403
404
Resumo da liçã o
405
Revisã o da aula
406
406
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Capítulo 10 Comunicações We bSocket
415
416
416
xii
Conteúdo
417
420
422
422
423
Resumo da liçã o
424
Revisã o da aula
424
425
429
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
437
Formatos de vídeo
438
Implementando o elemento < video >
438
Definir a fonte
439
Configurando o elemento < video >
441
Acessando faixas
441
Resumo da liçã o
442
Revisã o da aula
443
Formatos de á udio
444
O elemento < audio >
444
Definir a fonte
445
Configurando o elemento < audio >
445
Resumo da liçã o
446
Revisã o da aula
446
447
447
449
450
Conteúdo
xiii
Resumo da liçã o
451
Revisã o da aula
451
Pratique exercícios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
452
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
459
A referência do elemento < canvas >
460
460
Implementando a tela
462
463
465
475
Desenho de texto
488
490
Resumo da liçã o
494
Revisã o da aula
495
Usando o elemento < svg >
496
499
Resumo da liçã o
501
Revisã o da aula
502
502
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,506
Capítulo 13 Arrastar e soltar
507
Arrastando 509
510
xiv
Conteúdo
Descartando 511
513
Resumo da liçã o
516
Revisã o da aula
516
517
Resumo da liçã o
521
Revisã o da aula
521
522
Exercício 2: adicionar arrastar e soltar ao jogo
526
530
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
539
540
541
Manipulaçã o de erros
543
Endereço privacidade ing
544
Especificando opçõ es
544
Resumo da liçã o
545
Revisã o da aula
546
548
Resumo da liçã o
549
Revisã o da aula
549
550
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Conteúdo
xv
555
Entendendo os cookies
556
556
557
557
Compreender o armazenamento HTML5
558
Explorando localStorage
560
563
Resumo da liçã o
564
Revisã o da aula
564
566
566
Inscrever-se em eventos
567
Resumo da liçã o
568
Revisã o da aula
568
Uma resposta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Liçã o 1
579
Liçã o 2
580
581
582
582
583
Usando transaçõ es
584
xvi
Conteúdo
Resumo da liçã o
588
Revisã o da aula
589
590
591
Usando transaçõ es
593
594
594
Excluindo um registro
595
Recuperando um registro
595
Compreendendo os cursores
596
599
Resumo da liçã o
599
Revisã o da aula
600
601
602
Gravando em um arquivo
602
Lendo um arquivo
603
Excluindo um arquivo
604
604
605
605
Resumo da liçã o
606
Revisã o da aula
606
Suporte de navegador
608
Atualizando o cache
609
Entendendo eventos
610
Conteúdo
xvii
Resumo da liçã o
610
Revisã o da aula
611
611
Respostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Índice 621
x viii
Conteúdo
Introdução
Este guia de treinamento foi criado para profissionais de tecnologia da informaçã o (TI) que
desenvolvem ou planejam desenvolver documentos HTML, como pá ginas da Web ou
aplicativos da Windows Store. Presume-se que, antes de começar a usar este guia, você
esteja familiarizado com o desenvolvimento da Web e as tecnologias comuns da Internet.
Este livro cobre alguns dos tó picos e habilidades que sã o objeto do exame de certificaçã o
Microsoft 70-480. Se você estiver usando este livro para complementar seus materiais de
estudo, pode achar esta informaçã o ú til. Observe que este livro foi elaborado para ajudá -lo
nessa funçã o; pode nã o abranger todos os tó picos do exame. Se você estiver se preparando
para o exame, deverá usar materiais de estudo adicionais para ajudar a fortalecer sua
experiência no mundo real. Para sua referência, um mapeamento dos tó picos deste livro
para os objetivos do exame está incluído no final do livro.
■■ Crie folhas de estilo em cascata (CSS) que formatam visualmente seu documento HTML.
xix
A maior parte do có digo neste livro é escrita usando o Internet Explorer 10, que é instalado
com o Windows 8. Além disso, muitos, mas nem todos os exemplos de có digo foram
testados usando os seguintes navegadores.
■■ Firefox 17.0.1
■■ Opera 12.11
■■ Apple Safari 5.1.7
requisitos de sistema
A seguir estã o os requisitos mínimos do sistema que seu computador precisa atender para
completar os exercícios prá ticos deste livro.
Requisitos de hardware
Esta seçã o apresenta os requisitos de hardware para usar o Visual Studio 2012.
■■ Placa de vídeo compatível com DirectX 9 rodando em resoluçã o de tela de 1024 × 768
ou superior.
xx Introdução
Software requireme nts
■■ Visual Studio 2012 Professional, Visual Studio 2012 Premium ou Visual Studio 2012
Final. Você deve pagar por essas versõ es, mas em vez de uma delas, você pode
instalar todas as seguintes versõ es expressas gratuitas.
■■ Visual Studio Express 2012 para Windows 8. Esta instalaçã o também instala o Blend for
Vis ual Studio 2012. Disponível em http://www.microsoft.com/visualstudio/eng
/ downloads # d-express-web .
Pratica exercícios
Este livro apresenta exercícios prá ticos para reforçar os tó picos que você aprendeu. Esses
exercícios sã o organizados por capítulo e você pode carregá -los em http://aka.ms
/ TGProgHTML5 / files.
Agradecimentos
■■ A Carol Dillingham, por seu feedback construtivo durante todo o processo de redaçã o
deste livro . Agradeço também por ter paciência enquanto os meses de férias de inverno
passavam e meu desejo e capacidade de escrever eram constantemente interrompidos.
A todos os outros editores e artistas que contribuíram para a divulgaçã o de meu livro ao
pú blico , obrigado por seu trabalho á rduo e por fazer com que este livro seja uma
experiência positiva para mim.
Fizemos todos os esforços para garantir a precisã o deste livro e do conteú do que o
acompanha.
Todos os erros relatados desde a publicaçã o deste livro estã o listados em nosso site da
Microsoft Press em Oreilly.com:
http://aka.ms/TGProgHTML5/errata
Introdução x xi
Se você encontrar um erro que ainda nã o esteja listado, pode relatá -lo para nó s por meio da
mesma pá gina.
Se precisar de suporte adicional, envie um e-mail para Microsoft Press Book Support
em mspinput@microsoft.com.
Na Microsoft Press, sua satisfaçã o é nossa principal prioridade e seus comentá rios, nosso
bem mais valioso. Diga-nos o que você acha deste livro em:
http://aka.ms/tel press
Manter contato
xxii Introdução
CAPÍTULO 1
Começando com o Visual
Este capítulo apresenta as principais ferramentas de que você precisa, Microsoft Visual
Studio 2012
e o Blend for Visual Studio 2012, que sã o usados nas aulas do livro. Visual Studio 2012
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
A Internet explodiu. Quase todas as empresas têm um site, então por que não
aprender as tecnologias da web?
1
HTML, CSS e JavaScript são três intimamente acoplados tecnologias web
fundamentais que você c um aprender a aumentar sua liquidez e dar-lhe a
flexibilidade de escolher a empresa para a qual você deseja trabalhar. Este é o início
do seu caminho em direção à sua carreira futura.
Saiba estas tecnologias bem, e você pode expandir para outras programação
techn ologies como o Silverlight, Flash, C # e Visual Basic.
A seguir está uma lista com breves descriçõ es das ediçõ es do Visual Studio que a Microsoft
oferece.
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
para ser mais á gil, colabore com mais eficá cia e forneça um software melhor com mais
rapidez. Inclui controle de có digo-fonte, rastreamento de item de trabalho e automaçã o de
construçã o para projetos de software para entregar resultados previsíveis. Isso é grá tis.
Se você usar o Visual Studio Express 2012 para Web, poderá trabalhar apenas em projetos
da Web e deverá escolher uma linguagem .NET para começar, como Visual Basic ou C #. Se
você usa o Visual Studio Express 2012 para Windows 8, pode trabalhar apenas em
aplicativos da Windows Store, mas pode começar com um projeto JavaScript e nã o precisa
configurar um site para criar pequenos aplicativos. O Blend for Vi sual Studio 2012 também
oferece a capacidade de criar aplicativos da Windows Store com um projeto JavaScript.
Visual Studio .NET 2012 contém um novo editor de HTML que fornece suporte completo
para HTML5
elementos e fragmentos. Aqui está uma lista de alguns dos recursos do Visual Studio 2012
que tornarã o sua experiência de desenvolvimento mais agradá vel e produtiva. Os novos
recursos serã o demonstrados e explicados posteriormente neste livro, quando apropriado.
■■ Teste Você pode testar facilmente sua pá gina da web, aplicativo ou site com uma
variedade de navegadores. Ao lado do botã o Iniciar depuraçã o no Visual Studio 2012, você
encontrará uma lista de todos os navegadores instalados. Basta selecionar o navegador
desejado na lista quando estiver pronto para testar.
■■ Encontrando a fonte da marcação renderizada Usando o novo recurso Inspetor de
pá gina, você pode encontrar rapidamente a fonte da marcaçã o renderizada. O Inspetor de
pá gina renderiza uma pá gina da web diretamente no IDE do Visual Studio, para que você
possa escolher um elemento renderizado, e o Inspetor de pá gina abrirá o arquivo no qual a
marcaçã o foi gerada e destacará a fonte.
Suporte CSS3
O Visual Studio .NET 2012 fornece um novo editor CSS que oferece suporte completo para
CSS3, incluindo suporte para folhas de estilo em cascata (CSS), hacks e snippets
para extensõ es específicas do fornecedor para CSS.
■■ Recuo hierárquico O editor CSS exibe estilos aninhados em uma moda hierá rquica, o
que torna muito mais fá cil ler e entender os estilos.
■■ Seletor de cores O editor CSS agora tem um seletor de cores como o editor de HTML.
Suporte a JavaScript
O Visua l Studio 2012 oferece muitos novos recursos para tornar a experiência do
desenvolvedor JavaScript mais agradá vel e produtiva. A seguir está uma lista de alguns dos
novos recursos e aprimoramentos.
■■ O Visual Studio 2012 baseado em padrões incorpora os recursos JavaScript do
ECMAScript 5 e o modelo de objeto de documento (DOM) HTML5.
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
■■ Grupos de referência Você pode controlar quais objetos estã o disponíveis no escopo
global usando Grupos de referência. Grupos de referência sã o configurados na barra de
menus navegando até Ferramentas | Opçõ es | Editor de Texto | JavaScript | IntelliSense
| Referências.
Quando você inicia o Visual Studio Express 2012 para Windows 8, a tela da pá gina inicial é
exibida.
A Figura 1-1 mostra a tela da pá gina inicial, que contém informaçõ es ú teis e links para
recursos de aprendizagem e desenvolvimento. No lado esquerdo da pá gina inicial estã o os
links para criar um novo projeto ou abrir um novo projeto. Depois de criar pelo menos um
projeto, você verá links de atalho para abrir qualquer um de seus projetos recentes.
FIGURA 1-1 Pá gina inicial do Visual Studio Express 2012 para Windows 8 Além de clicar
no link Novo projeto na pá gina inicial, você pode iniciar um novo projeto clicando em
Arquivo e escolhendo Novo projeto. A Figura 1-2 mostra a tela Novo projeto, que exibe uma
lista de modelos iniciais a partir dos quais você pode escolher iniciar em seu novo
aplicativo rapidamente. Você pode pensar em um modelo como um projeto no qual alguém
concluiu a Liçã o 1: Visual Studio 20 12 CAPÍTULO 1
tarefas mundanas que seriam comuns a todos os aplicativos desse tipo e depois salvas
como uma estrutura que você pode usar para começar.
No lado esquerdo da tela Novo projeto, você pode selecionar a partir de modelos de projeto
recentes que você usou ou da lista completa de modelos instalados, ou você pode ir online
para selecionar um modelo. Você descobrirá que os modelos instalados sã o divididos de
acordo com a linguagem de programaçã o. A Figura 1-2 mostra os modelos instalados para
JavaScript.
NOTA: MODELOS INCLUÍDOS
No Visual Studio Express 2012 para Windows 8, todos os modelos incluídos são para
a criação de aplicativos da Windows Store do Windows 8. No Visual Studio Express
2012 para Web, todos os modelos incluídos são para a criação de aplicativos da
web. Lembre-se de que você pode usar HTML5, CSS3 e JavaScript em aplicativos da
Windows Store e aplicativos da web.
■■ Aplicativo de layout fixo Este modelo fornece uma ú nica pá gina com um layout de
proporçã o fixa que se ajusta para caber na tela.
Selecionar um modelo permite que uma có pia do modelo seja aberta na janela do Solution
Explorer. Por padrã o, a janela do Solution Explorer está no lado direito, embora as janelas
possam ser arrastadas para qualquer local na tela. O Gerenciador de Soluçõ es contém uma
representaçã o em á rvore de todos os projetos carregados na soluçã o atual.
Verificação rápida
■■ Você deseja criar um aplicativo da Windows Store. Qual edição do Visual Studio
2012 você usará e há um requisito de sistema operacional para o seu sistema
desenvolver aplicativos de aplicativos da Windows Store?
Verifique uma resposta rápida
■■ Você deve usar o Visual Studio Express 2012 para Windows 8 e ter o Windows 8
O arquivo default.js está na pasta js , onde você pode adicionar seus pró prios arquivos
JavaScript.
Este arquivo default.js contém atualmente uma pequena quantidade de có digo, que o
Capítulo 3, “Introduçã o ao JavaScript,” revisita com mais detalhes. Aqui está uma visã o
geral do que ele faz.
O uso de funçã o na terceira linha cria um escopo de nomenclatura para variá veis e funçõ es
em seu aplicativo. No meio do có digo estã o os comentá rios TODO que fornecem um local
para colocar seu pró prio có digo a ser executado quando o aplicativo for iniciado ou
reativado apó s ser suspenso ou quando o aplicativo for suspenso.
7
FIGURA 1-3 Modelo de aplicativo em branco com codificaçã o preliminar
O aplicativo em branco também contém outros arquivos que você deseja explorar. Se você
abrir o arquivo .html padrã o, verá o seguinte HTML.
<html>
<head>
</head>
<body>
</body>
</html>
A primeira linha contém <! DOCTYPE html>, que é uma declaraçã o para o navegador da
web que descreve a versã o do HTML em que a pá gina foi escrita. Nã o é um elemento
HTML; é um 8
instruçã o especial. No HTML5, essa instruçã o especial deve ser a primeira coisa que o
navegador lê na pá gina. Esta instruçã o nã o é obrigató ria, mas é considerada uma prá tica
recomendada tê-la.
O pró ximo é o elemento < html > que consiste na tag inicial na parte superior e na tag final,
</ html>, na parte inferior. Este é considerado o elemento raiz da pá gina e todos os outros
elementos estã o contidos no elemento html.
No diretó rio raiz do seu aplicativo está um arquivo com uma extensã o .pfx que fornece uma
chave de segurança para implantaçã o e um arquivo appmanifest que contém metadados
de implantaçã o .
Quando você inicia o Visual Studio Express 2012 for Web, a mesma tela da pá gina inicial é
exibida conforme mostrado na Figura 1-1 e descrito na seçã o anterior. Nos templates
instalados, você descobrirá que eles estã o divididos de acordo com a linguagem de
programaçã o .NET, Visual Basic e Visual C #. A Figura 1-4 mostra os modelos instalados
para o Visual Basic.
9
FIGURA 1-4 A tela New Project com modelos de projeto Visual Basic e Visual C # Seu novo
projeto pode ser diferente com base no software instalado em seu computador. Por
exemplo, o modelo mostrado aqui é o modelo Obter SDK do Windows Azure para .NET que
foi instalado quando o SDK do Azure foi instalado.
Em um dos idiomas, você pode clicar no nó da Web para ver uma lista de modelos de
aplicativos da Web disponíveis. Você pode selecionar um modelo denominado ASP.NET
Empty Web Application para começar com um projeto de inicializaçã o quase vazio.
Depois de selecionar ASP.NET Empty Web Application, uma có pia do modelo é aberta na
janela do Solution Explorer no canto superior direito, conforme mostrado na Figura 1-
5. Esta janela contém um nó para o projeto (WebApplication1); um nó que faz referência à s
configuraçõ es do projeto, denominado My Project; e um nó que faz referência ao arquivo de
configuraçã o do projeto, denominado Web.config. Este projeto está quase vazio. Se você
pressionar F5 para construir e executar o aplicativo da web, ele nã o será executado. Você
deve adicionar uma pá gina da web ao projeto primeiro.
10
Por padrã o, a janela do Solution Explorer está no lado direito. Na janela do Solution
Explorer está a janela Propriedades. A janela Propriedades é sensível ao contexto e contém
as propriedades do item atualmente selecionado. As propriedades sã o visíveis nesta janela
e a maioria também pode ser configurada.
Você pode adicionar uma pá gina da web ao projeto clicando com o botã o direito do mouse
no nó do projeto (WebApplication1) e navegando até Adicionar | Novo item | Pá gina
HTML. Se você nomear a pá gina default.html , o servidor da web automaticamente entrega
a pá gina a um navegador que navega para o seu site, mas nã o especifica o nome de uma
pá gina da web a ser recuperada. Depois de adicionar a pá gina da web, você pode inserir
algum texto, como uma mensagem do Hel o World, no corpo da pá gina da web. Quando
você pressiona F5, vê a mensagem no navegador.
Resumo da lição
■■ Use o Visual Studio Express 2012 for Web para desenvolver aplicativos da web. Use o
Visual Studio Express 2012 para Windows 8 para desenvolver aplicativos do Windows 8.
11
■■ Visual Studio Express 2012 para Windows 8 vem com Blend for Visual Studio 2012.
■■ O Blend for Visual Studio 2012 direciona o design da interface do usuá rio e deve ser
executado no Windows 8 para desenvolver aplicativos do Windows 8.
■■ Você pode alterar a referência da folha de estilo de um tema escuro para um tema claro,
alterando a referência ui-dark.css no arquivo default.html para ui-light.css.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
Qual das seguintes ediçõ es do Visual Studio 2012 você pode usar? (Escolha todas as opçõ es
aplicá veis.) A. Visual Studio Professional 2012
D. Visual Studio Express 2012 para Web e Visual Studio Express 2012 para Windows 8
12
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
O Blend está incluído no Visual Studio 2012 Express para Windows 8 e ajuda a projetar sua
interface de usuá rio. O Blend é um complemento de design para o Visual Studio e faz pelo
design o que o Visual Stu dio faz pelo có digo. A seguir estã o alguns recursos-chave do
Blend.
■■ O Debugging Blend oferece depuraçã o visual de HTML e CSS. Ele tem uma regra virtual
chamada Winning Properties que mostra como um elemento obteve seu estilo efetivo a
partir da herança e cascata CSS.
Explorando a mistura
A Figura 1-6 mostra a tela New Project, que tem os mesmos novos modelos de projeto do
Visual Studio Express 2012 para Windows 8.
13
NOTA RUN CONSTRAINT PARA BLEND
O Blend for Visual S tudio 2012 deve ser executado no Windows 8 para desenvolver
aplicativos do Windows 8. Se você executar o Blend for Visual Studio 2012 no
Windows 7, não poderá desenvolver aplicativos para o Windows 8.
Essas janelas têm guias que podem ser selecionadas para mostrar mais informaçõ es. A
janela superior esquerda contém as seguintes guias.
14
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
FIGURA 1-7 O layout da tela do Blend
No meio da tela está sua á rea de trabalho principal, a prancheta . Na parte superior da
prancheta, há uma lista com guias de documentos abertos. Por padrã o, esta janela exibe a
ren-Key
Pá gina de definiçã o de termos. Observe que existem botõ es no canto superior direito que
podem ser usados para alterar a visualizaçã o.
A parte inferior central exibe as fontes default.html e default.css. Isso torna mais fá cil para
você alterar os arquivos e ver a saída renderizada. Além disso, ao usar as outras janelas
para modificar a pá gina renderizada, você verá as alteraçõ es refletidas nesses arquivos.
15
A janela mais à direita contém as duas guias a seguir.
Verificação rápida
■■ Você deseja ser capaz de projetar seu aplicativo alterando estados e definindo
estilos.
Painel de projetos
O painel Projetos fornece uma visualizaçã o de arquivo e pasta dos projetos em sua soluçã o ,
conforme mostrado na Figura 1-8. Você pode usar este painel para abrir arquivos para
ediçã o clicando duas vezes no arquivo. Você também pode clicar com o botã o direito em
qualquer arquivo ou pasta para ver opçõ es como Copiar, Excluir e Renomear.
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
Referências. É aqui que você adiciona referências a CSS e JavaScript. O projeto também
contém o arquivo package.manifest, que contém todas as configuraçõ es do projeto,
incluindo a configuraçã o da pá gina inicial.
Painel de ativos
O painel Assets lista todos os elementos HTML, controles e mídia que você pode adicionar a
uma pá gina HTML aberta na prancheta, conforme mostrado na Figura 1-9. Embora o painel
Ativos liste todos os controles disponíveis em seu projeto do Blend, os controles usados
mais recentemente aparecem no painel Ferramentas .
FIGURA 1-9 O painel Ativos mostrado ao construir um aplicativo da Windows Store com
HTML
Abra o painel Ativos clicando no ícone Ativos na parte inferior do painel Ferramentas ou
clicando em Ativos no menu do Windows.
Painel do dispositivo
Use o painel Dispositivo para configurar sua tela de forma que você possa visualizar sua
aplicaçã o com precisã o em uma variedade de telas, conforme mostrado na Figura 1-
10. Você pode selecionar as seguintes opçõ es de exibiçã o para o seu aplicativo.
■■ Exibir O modo de renderizaçã o quando o aplicativo é executado. As opçõ es sã o
paisagem, preenchido, instantâ neo e retrato.
17
O painel Regras de estilo, mostrado na Figura 1-11, lista todas as folhas de estilo anexadas
ao documento atual. Em cada folha de estilo, há uma lista de todos os estilos
definidos. Além disso, o painel Regras de estilo contém uma caixa de texto na qual você
pode inserir critérios de pesquisa ao localizar um estilo.
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
Você pode clicar nos sinais de mais no lado direito do painel para adicionar uma nova regra
de estilo naquele local. A linha amarela indica onde novos estilos serã o criados se um local
nã o for especificado. As regras de estilo esmaecidas sã o definidas, mas nã o sã o usadas no
documento atual.
O painel Live DOM exibe a estrutura do documento atual como uma representaçã o
hierá rquica , conforme mostrado na Figura 1-12. Com o painel Live DOM, você pode
selecionar elementos e ajustar suas regras de estilo. A visualizaçã o Live DOM fornece
atualizaçã o automá tica conforme o estado do aplicativo muda.
FIGURA 1-12 O painel Live DOM exibindo uma representaçã o hierá rquica do documento
atual O painel Live DOM exibe os nó s usando seu ID se um ID for atribuído ou usando o
nome da tag se nenhum ID for atribuído. Você pode controlar a visibilidade de qualquer nó
clicando no ícone de olho no lado direito do painel. Isso pode ser ú til quando você tem
camadas de elementos empilhados uns sobre os outros.
Assim como no Visual Studio, você pode pressionar F5 para executar o aplicativo. O Blend
possui muitos recursos que você pode aprender usando a ajuda integrada.
Resumo da lição
■■ O modo interativo permite que você execute o aplicativo para compilar no estado
desejado e, em seguida, use o aplicativo e defina os estilos do aplicativo com base no estado
atual.
■■ O painel Projetos contém uma visualizaçã o de arquivos e pastas dos projetos na soluçã o
atual .
■■ O painel Regras de estilo contém uma lista de todas as folhas de estilo anexadas ao
documento atual.
19
■■ O painel Live DOM permite que você selecione um elemento e aplique regras de estilo a
ele.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. Painel de ativos
B. Painel de projetos
C. Design Visual
D. Modo interativo
2. Em qual painel você pode ver uma visã o estruturada hierá rquica do DOM?
A. DOM ao vivo
B. Projetos
C. Ativos
D. Dispositivo
3. Qual painel você pode usar para acessar uma lista de elementos, controles e mídia HTML
que podem ser adicionados a uma pá gina HTML aberta na prancheta?
A. Projetos
B. Ativos
C. Dispositivo
D. DOM ao vivo
Pratica exercícios
20
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visu al Studio 2012
Neste exercício, você cria um aplicativo HTML5 e JavaScript simples do Hel o World usando
o Visual Studio Express 2012 para Windows 8. Essa prá tica, como todos os aplicativos do
Hel o World , tem como objetivo ajudá -lo a começar criando um aplicativo mínimo. Em
exercícios posteriores, você terá mais exposiçã o ao Visual Studio. Neste exercício, você usa
HTML5 para exibir “Hel o Visual Studio for Windows 8” na tela.
1. Se você nã o instalou o Visual Studio Express 2012 para Windows 8, instale-o agora. Você
pode fazer o download no site da Microsoft.
2. Inicie o Visual Studio. Clique em Arquivo e escolha Novo Projeto para exibir a caixa de
diá logo Novo Projeto. Navegue até Instalado | Modelos | JavaScript | Loja do
Windows. Selecione Aplicativo em branco.
6. Certifique-se de manter a caixa de seleçã o Criar diretó rio para soluçã o marcada .
8. Quando o aplicativo é criado, o arquivo default.js é exibido com algum có digo de modelo.
Você deve ver uma tela preta e, no canto superior esquerdo, uma mensagem informando:
Shift + F5 funciona apenas quando o Visual Studio tem o foco; ele nã o funciona quando o
aplicativo em execuçã o tem o foco.
<html>
<head>
21
</head>
<body>
</body>
</html>
A tela é branca porque agora você faz referência ao arquivo ui-light.css em vez do arquivo
ui-dark.css. A tela também exibe o Hel o Visual Studio For Windows 8.
tecnologias!
para web
Neste exercício, você cria um aplicativo simples HTML5 e JavaScript Hel o World usando o
Vis ual Studio Express 2012 for Web. Esta prá tica, como todos os aplicativos Hel o World,
tem como objetivo ajudá -lo a começar criando um aplicativo mínimo. Em exercícios
posteriores, você terá mais exposiçã o ao Visual Studio. Neste exercício, você cria um novo
projeto no V isual Studio Express 2012 for Web e usa HTML5 para exibir “Hel o Visual
Studio for Web” na tela.
Você não escreverá nenhum código de servidor neste exercício, portanto, não
importa se você seleciona Visual Basic ou Visual C # ao iniciar o novo projeto.
1. Se você nã o instalou o Visual Studio Express 2012 for Web, faça-o agora. Você pode fazer
o download no site da Microsoft.
2. Inicie o Visual Studio. Clique em Arquivo e escolha Novo Projeto para exibir a caixa de
diá logo Novo Projeto. Navegue até Instalado | Modelos | Visual Basic | Rede. Selecione o
aplicativo de formulá rio da Web ASP.NET.
6. Certifique-se de manter a caixa de seleçã o Criar diretó rio para soluçã o selecionada.
22
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
8. Quando o aplicativo for criado, a pá gina default.aspx será exibida com algum có digo de
modelo.
9. Na janela Solution Explorer, construa o projeto clicando com o botã o direito do mouse no
nó do projeto e escolhendo Build.
10. Para ver o conteú do padrã o deste modelo, pressione F5 para iniciar a depuraçã o do
aplicativo.
Você deverá ver uma tela sofisticada com informaçõ es sobre como começar, além de outras
informaçõ es ú teis.
Observe que Shift + F5 funciona apenas quando o Visual Studio tem o foco. Shift + F5 nã o
funciona quando o aplicativo em execuçã o tem o foco.
13. Exclua o arquivo default.aspx clicando com o botã o direito neste arquivo na janela do
Gerenciador de Soluçõ es, escolhendo Excluir e, em seguida, clicando em OK.
14. Na janela Solution Explorer, adicione um arquivo default.html clicando com o botã o
direito do mouse no nó do projeto. Clique em Adicionar e escolha HTML. Nomeie a
pá gina default.html .
<head>
</head>
<body>
</body>
</html>
23
Neste exercício, você cria um aplicativo simples HTML5 e JavaScript Hel o World usando o
Blend. Esta prá tica, como todos os aplicativos Hel o World, tem como objetivo ajudá -lo a
começar a criar um aplicativo mínimo. Nos exercícios posteriores, você obtém mais
exposiçã o ao Blend. Neste exercício, você cria um novo projeto no Blend e usa HTML5 para
exibir “Hel o World” na tela.
2. Para iniciar o Blend, clique em New Project para exibir a caixa de diá logo New
Project. Selecione a categoria HTML (Windows Store) no painel esquerdo e selecione
Aplicativo em branco no painel direito.
Você deve ver uma tela preta e, no canto superior esquerdo, uma mensagem informando:
8. Se Blend nã o for exibido, volte para Blend pressionando Alt + Tab.
9. No arquivo default.html, clique duas vezes na mensagem “Content Goes Here” e substitua
o texto por Hello from Blend .
<html>
<head>
</head>
<body>
24
CAPÍTULO 1 Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012
</body>
</ html >
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Saiba mais sobre o Visual Studio Express 2012 for Web criando novos
projetos a partir de cada um dos modelos de projeto incluídos. Depois de criar cada projeto,
tente adicionar Hel o World e execute o aplicativo para ver como o projeto se parece e se
comporta.
■ ■ Exercício 2 Saiba mais sobre o Visual Studio Express 2012 para Windows 8 criando
novos projetos a partir de cada um dos modelos de projeto incluídos. Depois de criar cada
projeto, tente adicionar Hel o World e execute o aplicativo para ver como o projeto se
parece e se comporta .
■■ Exercício 3 Aprenda mais sobre o Blend criando novos projetos a partir de cada um dos
modelos de projeto incluídos. Depois de criar cada projeto, tente adicionar Hel o World e
execute o aplicativo para ver como o projeto se parece e se comporta.
25
Respostas
Lição 1
1. Respostas corretas: A, B, C e D
E. Incorreto: o Visual Studio Express 2012 para Windows 8 fornece t emplates para a
construçã o de aplicativos do Windows 8 apenas.
2. Respostas corretas: A, B, C e E
D. Incorreto: o Visual Studio Express 2012 for Web fornece modelos da web apenas para a
criaçã o de aplicativos da web.
E. Correto : Visual Studio Express 2012 para Windows 8 fornece modelos para construir
aplicativos do Windows 8 apenas.
3. Resposta correta: D
A. Incorreto: o Visual Studio Professional 2012 permite que você crie aplicativos da Web e
do Windows 8, mas nã o é gratuito.
B. Incorreto : Visual Studio Premium 2012 permite que você crie web e Windows 8
C. Incorreto: Visual Studio Ultimate 2012 permite que você crie web e Windows 8
D. Correto: o Visual Studio Expr ess 2012 for Web fornece modelos da web para a criaçã o
de aplicativos da web, e o Visual Studio Express 2012 para Windows 8 fornece modelos
para a criaçã o de aplicativos do Windows 8. Ambos sã o gratuitos.
26
Lição 2
1. Respostas corretas: C e D
A. Incorreto: o painel Ativos permite que você acesse uma lista de elementos, controles e
mídia HTML que podem ser adicionados a uma pá gina HTML aberta na prancheta.
C. Correto: Com o Visual Design, o que você vê no Blend é o que os usuá rios verã o no
Windows 8.
2. Resposta correta: A
A. Correto: o Live DOM exibe a estrutura do documento atual como uma representaçã o
hierá rquica. Você pode usar o painel Live DOM para selecionar elementos e ajustar suas
regras de estilo.
B. Incorreto: O painel Projetos fornece uma visualizaçã o de arquivos e pastas dos projetos
em sua soluçã o.
C. Incorreto: O painel Ativos lista todos os elementos HTML, controles e mídia que você
pode adicionar a uma pá gina HTML aberta na prancheta.
D. Incorreto: O painel Dispositivo permite que você configure seu monitor para que possa
visualizar seu aplicativo com precisã o em uma variedade de monitores.
3. Resposta correta: B
A. Incorreto: O painel Projetos fornece uma visualizaçã o de arquivos e pastas dos projetos
em sua soluçã o.
B. Correto: O painel Ativos lista todos os elementos HTML, controles e mídia que você pode
adicionar a uma pá gina HTML aberta na prancheta.
C. Incorreto: O painel Dispositivo permite que você configure seu monitor para que possa
visualizar seu aplicativo com precisã o em uma variedade de monitores.
D. Incorreto: O painel Live DOM exibe a estrutura do documento atual como uma
representaçã o hierá rquica. Você pode usar o painel Live DOM para selecionar elementos e
ajustar suas regras de estilo.
Respostas CAPÍTULO 1
27
CAPÍTULO 2
Agora que instalou o Visual Studio 2012 e o Blend, você está pronto para construir sua base
de conhecimento aprendendo um pouco de HTML bá sico. Este capítulo apresenta uma
grande quantidade de conteú do HTML. Embora muito do conteú do deste capítulo exista em
versõ es anteriores do HTML, todo o conteú do deste capítulo faz parte da especificaçã o do
HTML 5.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
Capítulo 1, “Introduçã o ao Visual Studio 2012 e Blend for Visual Studio 2012,”
apresentou uma breve visã o geral das ediçõ es do Visual Studio e do Blend . Isso foi
necessá rio para apresentá -lo à s ferramentas que serã o usadas neste livro. Esta liçã o
apresenta uma visã o geral bastante detalhada do HTML5 e cobre muitos dos fundamentos
do HTML que existiam antes do HTML5, mas ainda fazem parte da especificaçã o do
HTML5 .
29
Após esta lição, você será capaz de:
HTML é um acrô nimo para Hypertext Markup Language, que é a linguagem que usamos
para criar pá ginas da web desde que as primeiras pá ginas chegaram na web. As raízes do
HTML sã o de uma chave mais antiga
< b > está em negrito < / b >, o que faria com que o texto dentro da tag inicial b e final fosse
renderizado como texto em negrito. Observe a diferença entre a primeira e a segunda tag; a
segunda tag tem uma barra (/) para indicar que é uma tag de finalizaçã o. Muitas, mas nem
todas as tags HTML possuem uma tag final correspondente . Tags HTML, como < br > e
< img > nã o têm etiquetas que terminam porque o < br > apenas prestado uma quebra de
linha, eo < img tag> apenas prestado uma imagem.
Embora o HTML tenha servido ao seu propó sito por um bom tempo, as pessoas queriam
mais. Outra tecnologia em evoluçã o, chamada XML (eXtensible Markup Language), estava
se tornando popular. XML
se parece muito com HTML porque ambos os idiomas usam tags. No entanto, existem
vá rias grandes diferenças. Em primeiro lugar, o XML sempre requer tags finais
correspondentes para cada tag, embora você possa usar uma notaçã o de atalho para
denotar uma tag inicial e uma tag final juntas. Outra diferença é que o HTML tem um
conjunto muito específico de nomes de marcas e cada uma dessas marcas denota um
recurso de formataçã o que deve ser aplicado à pá gina da web renderizada. XML nã o tem
um conjunto definido de nomes de tag, entã o você cria seus pró prios nomes de tag, e as
tags podem representar qualquer coisa. As tags XML sã o típicas tags de metadados y: tags
que descrevem os dados que estã o dentro da tag. Embora existam muitas outras diferenças,
uma outra grande diferença é que o XML usa a tecnologia XML Schema Definition (XSD),
que valida o formato de um documento XML para garantir que todos os aspectos de um
documento sejam vá lidos antes de processar o documento XML. A falta de estrutura rígida
do HTML impediu a criaçã o de uma tecnologia como o XSD, que poderia validar
documentos HTML.
Termos
30
Embora o XHTML tenha resolvido alguns problemas, outros ainda precisavam de uma
soluçã o. Havia uma necessidade cada vez maior de multimídia na web. As empresas
queriam o site mais chamativo (trocadilhos). Cascading Style Sheets (CSS) fornecia suporte
para adicionar estilos como cores e fontes de forma consistente em um site, mas as
empresas queriam mais. Eles queriam que suas pá ginas da web fossem altamente
interativas , com vídeo e animaçõ es. Os navegadores adicionaram suporte programá vel ao
fornecer JavaScript, mas as primeiras versõ es do JavaScript eram lentas e difíceis de
programar. Os navegadores se tornaram extensíveis ao fornecer uma interface de
programaçã o de aplicativos (API) que permitiria que terceiros criassem plug-ins que
pudessem ser executados no ambiente do navegador. Um desses plug-ins é o Flash, que tem
uma base instalada muito grande. O Flash fornece um ambiente de desenvolvimento que
pode ser usado para criar uma rica experiência do usuá rio. Embora plug-ins de
terceiros tenham resolvido a necessidade imediata de tecnologia para criar sites
chamativos, ainda havia uma necessidade de integraçã o mais estreita de multimídia com o
navegador, especialmente em pequenos dispositivos.
HTML5 representa um HTML, CSS e JavaScript reinventado de uma forma que resolve a
necessidade de sites ricos e interativos que podem reproduzir á udio e vídeo e dar suporte a
animaçõ es de dentro do navegador sem a necessidade de plug-ins. O HTML5 contém a
maioria das tags do HTML 4.01, mas muitas das tags foram redefinidas para serem tags
semâ nticas.
Afinal, essas tags têm apresentaçã o em suas definiçõ es. O W3C agora define a tag < b >
como “um intervalo de texto deslocado de seu conteú do circundante sem veicular qualquer
ênfase ou importâ ncia extra, e para o qual a apresentaçã o tipográ fica convencional é texto
em negrito; por exemplo, palavras-chave em um resumo de documento ou nomes de
produtos em uma resenha. ” O W3C agora define a tag < i > como “um intervalo de texto
deslocado de seu conteú do circundante sem transmitir qualquer ênfase ou importâ ncia
extra, e para a qual a apresentaçã o tipográ fica convencional Liçã o 1: Introduçã o ao
HTML5 CAPÍTULO 2
31
é texto em itá lico; por exemplo, uma designaçã o taxonô mica, um termo técnico, uma frase
idiomá tica de outro idioma, um pensamento ou um nome de navio. ” Essas tags precisam
ser renderizadas como negrito e itá lico? De forma alguma, e as novas definiçõ es dessas tags
tentam especificar isso.
O Capítulo 5, “Mais HTML5,” revisita a noçã o de marcaçã o semâ ntica. F ou agora, lembre-se
de que suas tags HTML deve ser usado para fornecer a estrutura, nã o apresentaçã o. A
apresentaçã o é o trabalho da folha de estilo em cascata.
Um elemento é composto de uma marca inicial, uma marca final e o conteú do entre as
marcas. Considere o seguinte fragmento de HTML.
Chave
Termos <div>
</div>
Neste exemplo, a tag < div > é apenas a tag inicial na primeira linha. O elemento < div > é a
amostra completa, que inclui conteú do que também contém
um elemento < b >. O elemento < b > consiste na tag inicial < b >, no conteú do, que é a
palavra “raposa”, e na tag final < / b >.
Os nomes de tag HTML nã o diferenciam maiú sculas de minú sculas. Se você estiver
trabalhando em uma pá gina da web mais antiga, poderá notar que ela foi escrita com
nomes de tag em maiú sculas. Os navegadores tratarã o uma tag < b > e uma tag < B > da
mesma forma.
Para estar em conformidade com o maior nú mero possível de padrõ es, considere o uso
de nomes de tag em minú sculas para qualquer pá gina da web que você criar por
convençã o, pois o W3C recomenda nomes de tag em minú sculas em HTML 4.01 e requer
nomes de tag em minú sculas em XHTML. Embora o HTML5 nã o exija nomes de tag em
minú sculas, nomes de tag em minú sculas sã o recomendados .
Referência de elemento
O HTML5 tem mais de 100 elementos definidos que você pode usar para criar pá ginas da
web e aplicativos ricos. O W3C define a seguinte lista desses elementos com uma breve
descriçã o.
Observe que a brevidade é um substituto para 100 por cento de precisã o nessas descriçõ es.
■■ <a> Hyperlink
■■ <abbr> Abreviaçã o
■■ <endereço> Informaçõ es de contato
■■ <artigo> Seçã o independente
■■ <audio> Fluxo de á udio
32
■■ <b> Texto em negrito
■■ <base> URI de base do documento
■■ <bb> botã o do navegador
■■ <blockquote> Citação longa
■■ <body> Conteú do principal
■■ <br> Quebra de linha
■■ <canvas> Tela Bitma p
■■ <legenda> Legenda da tabela
■■ <cite> Citaçã o
■■ <code> Fragmento de có digo
■■ <col> Coluna da tabela
■■ <dd> Descriçã o da definiçã o
■■ exclusã o <del>
■■ <detalhes> Informaçõ es adicionais
■■ <dialog> Conversa
■■ <div> divi genérico sion
■■ <dl> lista de descriçã o
■■ <dt> Termo de descriçã o
■■ <rodapé> Rodapé da seçã o
■■ Formulá rio <form>
■■ <h1> Cabeçalho nível 1
■■ <h2> Nível de cabeçalho 2
■■ <h3> Nível de cabeçalho 3
■■ <h4> Nível de cabeçalho 4
33
■■ <h5> Nível de cabeçalho 5
■■ <h6> Nível de cabeçalho 6
■■ <head> Cabeçalho do documento
■■ <header> Cabeçalho da seçã o
■■ <hr> Separador
■■ <html> Raiz do documento
■■ <iframe> Frame inline
■■ <img> Imagem
■■ <ins> Inserçã o
■■ <li> item da lista
■■ <menu> Menu de comando
■■ <meta> Metadados
■■ <meter> Mediçã o escalar
■■ Navegaçã o <nav>
■■ <ol> Lista ordenada
■■ <optgroup> Grupo de opçõ es
■■ <opção> Escolha de seleçã o
■■ <output> Controle de saída
■■ <p> Pará grafo
■■ <pre> Texto pré- formatado
■■ <q> Cotaçã o inline
■■ <rp> parêntese Ruby
■■ <rt> Texto Ruby
34
■■ <samp> Amostra de saída
■■ <script> Escrito vinculado ou incorporado
■■ <seção> Seçã o do documento
■■ <select> Controle de seleçã o
■■ <small> impressã o pequeno
■■ <source> Recurso de mídia
■■ <sub> Subscrito
■■ <sup> Sobrescrito
■■ <table> Tabela
■■ <tbody> Corpo da mesa
■■ <td> Tabela cel
■■ <tfoot> Rodapé da tabela
■■ <title> Título do documento
■■ <tr> Tabela r ow
■■ <ul> Lista nã o ordenada
■■ <var> Variá vel
■■ <vídeo> Vídeo ou filme
Os termos podem ser aspas simples ou duplas. Você pode adicionar muitos atributos à tag
inicial. Você também pode alternar usando aspas simples e duplas, o que é especialmente
benéfico quando você precisa inserir aspas simples ou duplas no valor do atributo. Você
também pode ter atributos booleanos que contêm o nome do atributo, mas nenhum valor .
35
Chave
Termos
■■ selecionado Usado para indicar qual opçã o está selecionada em uma lista suspensa ou
lista de seleçã o
■■ somente leitura Usado para evitar que o usuá rio digite dados em uma caixa de texto,
senha ou á rea de texto
<input type = "checkbox" name = "fruit" value = "Apple" checked /> Outra maneira de
indicar um atributo booleano é usar a forma qu otada, na qual você fornece um valor vazio
ou o nome do atributo como seu valor. Aqui estã o alguns exemplos de ambos.
<input type = "checkbox" name = "fruit" value = "Apple" CHECK = '' />
<input type = "checkbox" name = "fruit" value = "Apple" checks = 'checks ' /> O ú ltimo
parece redundante, mas é geralmente considerado a forma preferida de representar o
atributo booleano. Se você usar jQuery, que é um conjunto de ferramentas JavaScript de
terceiros, verá que funciona melhor com esse exemplo redundante.
Verificação rápida
■■ Você está usando um elemento < botão > e deseja que ele seja desativado até que
alguns critérios sejam atendidos. Qual é a melhor maneira de desabilitar
o elemento < button > quando a página é carregada?
Resposta de verificação rápida
■■ accesskey Permite que você especifique uma tecla de atalho para a qual pular ou para
definir o foco para um elemento. Via de regra, você nã o deve usar isso porque pode causar
problemas com outras tecnologias.
■■ classe Usada com CSS para especificar um ou mais nomes de classe para um elemento.
■■ menu de contexto O usuá rio pode clicar com o botã o direito em um elemento para
exibir um menu. No momento em que este artigo foi escrito, nenhum navegador oferece
suporte a esse atributo.
■■ verificação ortográfica Usado com o atributo lang para permitir que você indique se o
elemento deve ter sua ortografia e gramá tica verificadas.
Você pode representar qualquer elemento que nã o contenha conteú do como uma tag de
fechamento elfo. Uma tag de fechamento automático é uma tag inicial e uma tag final em
uma. Você termina a tag inicial com um espaço, barra, tecla
Termos e símbolo de maior. Por exemplo, o < br element> nã o pode ter qualquer conteú do,
por isso aqui é o início eo fim t ag em um: < br />.
Em XML, qualquer elemento vazio pode ser escrito com uma tag de fechamento automá tico,
mas em HTML5, isso pode causar problemas em diferentes navegadores. A regra é usar
tags de fechamento automá tico para tags que nã o podem ter conteú do, como
a tag <br /> . EM elementos PTY que sã o capazes de ter conteú do, mas atualmente nã o têm
conteú do deve ter tags de fim separadas. Um exemplo é
< div > </ div >; nã o há conteú do, mas as tags de início e fim ainda existem.
37
NOTA USE O ELEMENTO <SCRIPT> CUIDADOSAMENTE
Verificação rápida
A maioria dos elementos, mas nã o todos, pode ter conteú do, e o conteú do pode incluir
elementos com conteú do. Os elementos nã o precisam ter conteú do, mas alguns elementos
nã o podem ter conteú do.
Chave
Termos
■■ <input> Define um campo de dados digitado que permite ao usuá rio editar os dados
■■ <link> Define uma relaçã o entre um documento e um recurso externo, como uma folha
de estilo em cascata
Termos para uma tag HTML, você pode apenas criar um atributo com o nome de sua
escolha e como assinar os dados. No entanto, o nome que você criar pode entrar em conflito
com um nome de atributo definido pelo W3C existente ou um nome de atributo futuro
definido pelo W3C. Para garantir que você nã o tenha nenhum conflito de nomenclatura
existente ou futuro, atribua um nome que seja prefixado com “dados-“ .
Verificação rápida
■■ Você tem uma página da web com um elemento < span > que contém o nome do
cliente.
Adicionando comentários
Você pode adicionar comentá rios ao seu có digo-fonte HTML usando a seguinte sintaxe.
Além disso, você nã o pode terminar um comentá rio com três travessõ es, como <! - e entã o
aconteceu ---> porque isso também gera um erro de sintaxe.
Liçã o 1: Apresentando HTML5 CAPÍTULO 2
39
<! - [if lte IE 7]> <html class = "no-js ie6" lang = "en"> <! [endif] ->
<! - [if lt IE 7]> <html class = "no-js ie6" lang = "en"> <! [endif] ->
<! - [if IE 8]> <html class = "no-js ie8" lang = "en"> <! [endif] ->
<! - [if gt IE 8]> <html class = "no-js" lang = "en"> <! [endif] ->
<! - [if gte IE 9]> <html class = "no-js" lang = "en"> <! [endif] ->
<! - [if! IE]> -> Este nã o é o Internet Explorer! <br /> <! - <! [en dif] -> O primeiro
comentá rio condicional verifica se o navegador é Internet Explorer e a versã o é anterior ou
igual a 7. O pró ximo comentá rio condicional verifica se o navegador é Internet Explorer e a
versã o é anterior a 7. O pró ximo comentá rio condicional verifica se o navegador é Internet
Explorer e se a versã o é 8. O pró ximo comentá rio condicional verifica se o navegador é
Internet Explorer e a versã o é posterior a 8, seguido por uma verificaçã o para ver se o
navegador é Internet Explorer e a versã o é posterior ou igual a 9. A ú ltima linha verifica se
o navegador nã o é Internet Explorer. Observe que a sintaxe da ú ltima linha é diferente das
outras.
Agora que você viu os vá rios elementos e atributos, é hora de agrupá -los de uma maneira
significativa para criar um documento HTML. O documento HTML contém uma estrutura
externa, metadados e algum conteú do.
Todo documento HTML deve ter uma estrutura bá sica que consiste em uma declaraçã o < !
DOCTYPE html >, que historicamente indica a versã o do HTML para o navegador. No
HTML5, isso indica ao navegador que ele deve estar no modo sem peculiaridades. O modo
sem peculiaridades faz com que o navegador opere de maneira compatível com HTML5. Em
seguida está o elemento raiz < html >, cuja chave
<html>
<head>
</head>
<body>
conteú do aqui
40
</html>
documentos.
Este exemplo também contém um elemento < title >, que é importante porque serve aos
seguintes propó sitos.
■■ Fornece o nome padrã o para a pá gina quando ela é adicionada aos favoritos
Você pode querer exibir os caracteres <e> em sua pá gina da web, mas viu que os caracteres
menor que e maior definem as tags. Esses caracteres podem ser exibidos em seu conteú do
usando o nome da entidade ou o nú mero da entidade, conforme a seguir.
&nome da entidade;
ou
& # entity_number;
Existem muitas entidades HTML, mas a Tabela 1-1 lista as entidades HTML mais comuns
que você usará em seu documento HTML.
Exibição
Nome da entidade
Número da Entidade
Descrição
& amp;
& # 38;
E comercial
>
& gt;
& # 62;
<
& lt;
& # 60;
& quot;
& # 34;
Aspas duplas
direito autoral
& reg;
& # 174;
Marca registrada
&troca;
& # 8482;
Marca comercial
& nbsp;
$ # 160;
41
ESPAÇO INQUEBRÁVEL
Se você tentar incorporar uma série de espaços em seu documento HTML, o navegador
normaliza caracteres de espaço em branco contíguos (como espaços, tabulaçõ es e quebras
de linha) e renderiza apenas um ú nico espaço. Este é um recurso normalmente desejá vel
porque permite que você formate seu HTML
conteú do de origem de uma maneira que seja mais legível no modo de origem, eliminando
espaços em branco na saída renderizada.
Quando quiser exibir vá rios espaços, você pode usar o caractere de espaço nã o separá vel.
O espaço inquebrá vel também é conhecido como espaço inquebrá vel, espaço inquebrá vel e
espaço rígido. Além de evitar o colapso de espaços em branco contíguos, o espaço não
separável evita a separaçã o automá tica de linhas entre palavras que você deseja manter
juntas na mesma linha.
Chave
Termos
Considere um documento HTML no qual você deseja exibir 10 mph, onde há um espaço
entre o nú mero 10 e os mph. Você deseja garantir que o mph nã o seja separado do nú mero
10 sendo movido para a pró xima linha. No seu documento HTML, use 10 & nbs p; mph para
manter o nú mero 10 e mph juntos.
Resumo da lição
■■ Um elemento é composto de uma tag inicial, conteú do interno e uma tag final.
■■ Os valores dos atributos devem sempre ser citados usando aspas simples ou aspas
duplas.
■■ Atributos booleanos sã o atributos cuja mera presença na tag inicial indica que a opçã o
está definida.
■■ HTML5 define atributos globais, que sã o o conjunto de atributos que podem aparecer
em qualquer elemento HTML5.
■■ As tags de fechamento automá tico sã o tags cujas tags de início e fim estã o juntas para
criar um elemento sem conteú do. As tags de autofechamento devem ser usadas apenas com
elementos que nã o podem ter conteú do.
■■ Elementos vazios nã o podem ter conteú do. Eles devem ser criados usando tags de
fechamento automá tico.
■■ Você pode usar comentá rios condicionais para adicionar uma fonte específica do
navegador que funcionará com o Internet Explorer, mas será tratada como um comentá rio
por outros navegadores.
42
■■ Espaços nã o separá veis podem ser usados para renderizar vá rios espaços
contíguos. Você também pode usar espaços nã o separá veis para evitar que duas palavras
sejam separadas por uma quebra de linha.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
opçã o de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. < h3 vin = 'current VIN here'> 1965 VW Beetle < / h3 > B. < h3 id = 'current VIN here'>
1965 VW Beetle < / h3 > C. < h3 data-vin = 'cu rrent VIN aqui '> 1965 VW Beetle < /
h3 > D. < h3 datavin =' current VIN aqui '> 1965 VW Beetle < / h3 > 2. Qual tecnologia é
precedida e derivada do HTML5?
A. HTML 4.01
B. SGML
C. XHTML 1.0
D. XML
A. < html >
B. < cabeça >
C. < título >
4. Você deseja usar o atributo booleano desativado em uma caixa de texto. Como você pode
fazer isso? (Escolha todas as opçõ es aplicá veis)
A. <input name = 'firstName' type = 'text' disabled /> B. <input name = 'firstName' type =
'text' disabled = '' /> C. <input name = 'firstName' type = 'text 'disabled =' true '/> D. <input
name =' firstName 'type =' text 'disabled =' disabled '/> Liçã o 1: Apresentando
HTML5 CHAPTE R 2
43
Em breve, você desejará incorporar conteú do ao seu documento HTML. O conteú do pode
ser de uma pá gina da web existente ou você pode incorporar imagens em seu documento
HTML. Você também pode incorporar aplicativos Adobe Flash. Você pode
incorporar muitos elementos interessantes, e esta liçã o cobre muitas das maneiras de
incorporar conteú do.
O atributo name define o nome do contexto de navegaçã o, que é ú til quando você precisa
fazer referência ao elemento < iframe >, possivelmente como o destino de um hiperlink,
conforme descrito em 44
</iframe>
Este conteú do será afetado por todas as restriçõ es normais de cross-site. Além disso, o
conteú do terá scripts, plug-ins e formulá rios desativados. O conteú do nã o pode navegar em
nenhum quadro ou janela além dele mesmo.
■■ permitir a mesma origem Permite que o conteú do seja tratado como sendo da mesma
origem, em vez de forçá -lo a uma origem ú nica
Superficialmente, pode parecer que a sandbox nã o está fornecendo nenhuma proteçã o, mas
a sandbox ainda desativa plug-ins e pop-ups.
45
No momento em que este artigo foi escrito, o atributo seamless nã o era compatível com
nenhum navegador, mas sua intençã o era mesclar o conteú do externo no documento HTML
atual para que a pá gina HTML nã o parecesse ter conteú do incorporado. A alternativa é usar
CSS para obter uma apresentaçã o semelhante.
O < a > elemento cria um link para um documento HTML externo (ex ligaçã o terna) ou salta
para uma localizaçã o no documento HTML atual (ligaçã o interna). O conteú do do < a >
elemento é exibido no navegador com o fol devido aparência padrã o.
O < a > elemento tem o atributo href, que você costume y uso para especificar o destino do
link. Se o link for externo, o href pode ser preenchido com um URL relativo ou absoluto da
seguinte maneira.
Quando você está em uma pá gina da Web e clica em um hiperlink para um recurso externo,
o recurso externo abre s na janela do navegador atual. Se o link externo for para uma
pá gina do seu site, esse comportamento provavelmente fará sentido. Se o link externo for
para um site diferente, você pode abrir uma nova janela do navegador. Usando o atributo
target, você pode controlar o comportamento do link atribuindo um dos seguintes.
de todos os links de menu para ser conteú do para que as pá ginas carreguem
no elemento < iframe > conforme mostrado no exemplo a seguir.
<br />
Você pode usar o protocolo mailto para enviar mensagens de e-mail. O URL mailto aceita os
seguintes parâ metros: subject, cc, bcc e body. Os parâ metros podem ser inseridos em
qualquer ordem adicionando um ponto de interrogaçã o (?) Apó s o endereço de e-mail e
separando os parâ metros com o E comercial (&). Alguns exemplos de hiperlink de e-mail
sã o os seguintes.
<! - adicione o nome, observe que o e-mail é agrupado com & lt; e & gt; ->
<! - mailto bá sico com assunto e mensagem ->
Quando você quiser incorporar uma imagem em seu documento HTML, use
o elemento < img >. O
47
Atributo src para fornecer uma referência de URL absoluta ou relativa à imagem que deve
ser exibida. Use o atributo alt para fornecer um texto alternativo a ser exibido quando a
imagem nã o estiver disponível devido a uma conexã o lenta ou outro acidente. A seguir está
um exemplo do elemento < img >.
us / PublishingImages / bing_logo.png "al t =" Bing Logo "/> É importante entender que a
imagem nã o está embutida no documento HTML.
Ao usar o elemento < img >, você pode fornecer arquivos JPEG (.jpg ou .jpeg), GIF (.gif), PNG
(.png) ou SVG (.svg). A seguir está uma breve descriçã o de cada tipo de arquivo que deve
ajudá -lo a decidir qual tipo de arquivo usar para seu aplicativo.
■■ PNG PNG é um ó timo tipo de arquivo alternativo devido à sua alta compactaçã o sem
perdas. PNG
os arquivos podem ser true color de 48 bits ou tons de cinza de 16 bits. PNG nã o só oferece
suporte a cores transparentes, mas também oferece transparência variá vel. As fotos
nã o sã o compactadas para ficarem tã o pequenas quanto as fotos JPG, mas o fato de nã o
haver perdas vale o tamanho extra em muitos cená rios. Você pode usar PNG como seu tipo
de armazenamento para fotos que deseja editar, mas ao exibi-las na web, convém salvar o
PNG como JPG para obter a melhor compactaçã o.
■■ SVG SVG é Scalable Vector Graphics e é ó timo para desenhos, mas nã o para fotos.
As imagens SVG podem ser aumentadas ou reduzidas sem perder detalhes porque o
arquivo contém as instruçõ es para desenhar a imagem, ao contrá rio de outros tipos de
arquivo que contêm uma imagem baseada em varredura. Imagens baseadas em varredura
sã o compostas de pontos coloridos que compõ em a imagem. Se você precisar dimensionar
uma imagem baseada em raster para cima ou para baixo, verá que, em cores, os pontos sã o
amostrados novamente e a imagem típica acaba parecendo um bloco.
48
Verificação rápida
■■ Você está criando vários pequenos ícones que serão exibidos em sua página da
web.
■■ Use o formato GIF porque tem suporte para cores transparentes e porque requer
um pequeno número de cores.
Criação de links de imagens
Você pode criar um mapa de imagem clicá vel em seu documento HTML usando
o elemento < map >.
O atributo href é o mesmo que o atributo href no < uma > elemento e pode ser definida
como uma URL absoluta ou relativa.
O atributo alt é definido como texto alternativo a ser exibido e é necessá rio quando o
atributo href é definido.
49
</map>
Você pode usar os elementos < object > e < embed > para incorporar conteú do de plug-
ins. Por que existem duas tags para o mesmo propó sito? O motivo sã o as diferenças nos
navegadores ao longo dos anos.
A tag < embed >
Embora a especificaçã o HTML 4.01 nã o tenha suporte para a tag < embed >, a maioria dos
navegadores continuou com o suporte devido à base instalada e à facilidade de uso. Em
HTML5, ambas as tags existem.
</embed>
<a href="/go/getflashplayer/">
</a>
</embed>
50
A tag < object >
IMPORTANTE NO MÍNIMO
Você também pode usar a tag < object > para incorporar outra pá gina da web em seu
documento HTML.
type = "text / html" data = "Header.aspx"> </ objec t> Como regra, considere usar
a tag < iframe > ao incorporar uma pá gina da web de outro domínio em seu documento
HTML usando sandbox. É feito para esse propó sito, enquanto a tag < object > é uma tag de
uso mais geral. A tag < object > se comporta de maneira diferente em navegadores
diferentes, e você pode descobrir que recursos como dicas de ferramentas funcionam
apenas com o
tag < object >, mas você deve evitar fazer isso. É melhor usar a tag < img > para incorporar
imagens.
51
Como a tag < object > pode representar qualquer objeto, a tag < param > permite que você
passe dados para o objeto. Você pode usar uma ou mais tags < param > para passar
parâ metros para plug-ins que foram incorporados com a tag < object >. As tags < param >
devem estar antes de qualquer texto alternativo que esteja dentro do elemento < object >.
A tag < param > tem um nome e um atributo de valor, e ambos sã o necessá rios para cada
</object>
Além de usar a tag < iframe > para criar um contexto de navegador aninhado, você pode
usar o
tag < object >, mas isso nã o é compatível com todos os navegadores, entã o você deve usar
a tag < iframe >.
Resumo da lição
■■ Use o atributo sandbox na tag < iframe > para ajudar a prevenir malware e ruídos, como
pop-ups, de serem introduzidos quando o conteú do é incorporado em sua pá gina HTML.
■■ Use o atributo seamless na tag < iframe > para indicar que o conteú do de origem deve
ser renderizado para aparecer como se fosse parte do documento que o contém .
■■ O < uma tag> cria um hiperlink para qualquer um documento HTML externo ou uma
localizaçã o interna no documento atual. O < uma tag> também pode ser usado para enviar
mensagens de e-mail.
■■ JPG é melhor para exibir fotos em pá ginas HTML devido à sua compressã o, GIF é melhor
para imagens pequenas com transparência e animaçõ es incorporadas, PNG é melhor para
armazenamento devido à compressã o sem perdas durante as sessõ es de ediçã o e SV G é
melhor para desenhos devido a sua escalabilidade de desenho vetorial.
■■ Você pode criar um mapa de imagem clicá vel usando os elementos < map > e < area >.
■■ Você pode usar a tag < object > para fornecer incorporaçã o de conteú do ide com maior
flexibilidade porque pode ter elementos < param > aninhados .
52
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. SVG
B. GIF
C. JPG
D. PNG
Pratica exercícios
Você aprendeu um pouco sobre elementos e atributos HTML e é hora de criar um site. No
Exercício 1, você cria um site para uma empresa fictícia, Contoso, Ltd., e adiciona uma
pá gina inicial .
Nesta prá tica, você cria um site simples usando o Visual Studio Express 2012 for Web.
A qualidade das pá ginas produzidas será menos do que desejá vel porque CSS ainda nã o foi
discutido. O objetivo desta prá tica é usar muitas das tags que foram descritas nesta liçã o.
Você começa criando um site ASP.NET usando o Visual Studio Express 2012 para Web e,
em seguida, adiciona e modifica a pá gina inicial.
1. Se você nã o instalou o Visual Studio Express 2012 for Web, faça-o agora. Você pode fazer
o download no site da Microsoft.
53
2. Inicie o Visual Studio Express 2012 for Web. Navegue até o arquivo e escolha Novo
projeto.
Navegue até Ins tal ed | Modelos | Visual Basic | Web e selecione ASP.NET Empty Web
Application.
6. Certifique-se de manter a caixa de seleçã o Criar diretó rio para soluçã o marcada.
7. Clique em OK para criar seu novo projeto.
8. Quando o aplicativo for criado, clique em Depurar e selecione Iniciar Depuraçã o. (A tecla
de atalho é geralmente y F5, mas pode variar com base nas configuraçõ es de instalaçã o.) O
ASP.NET Empty Web Application nã o inclui uma pá gina inicial, portanto, uma pá gina de
erro é exibida, mostrando um erro HTTP 403.14 - Erro proibido . A pá gina de erro indica
(de forma bastante indireta) que você nã o tem uma pá gina padrã o em seu site, entã o o
servidor web tenta exibir uma lista de todos os arquivos no diretó rio. No entanto, as
configuraçõ es de segurança do site nã o permitirã o a navegaçã o no diretó rio para exibir o
conteú do do diretó rio.
10. Adicione uma pá gina inicial. Na janela Solution Explorer, clique com o botã o direito do
mouse no projeto ContosoWebSite, escolha Adicionar e selecione Pá gina HTML. Defina o
nome como default.html e clique em OK.
<! DOCTYPE html>
<head>
<title> </title>
</head>
<body>
</body>
</html>
12. Na janela Solution Explorer, clique com o botã o direito do mouse no projeto, escolha
Add, selecione New Folder e nomeie a pasta Images .
13. Na janela Solution Explorer, clique com o botã o direito na pasta Images que você
acabou de adicionar, escolha Add, selecione Existing Item e selecione
o arquivo C ontosoLogo.jpg que está localizado na pasta Chapter02 Resources.
14. No elemento < body >, adicione um comentá rio e defina o texto como Adicionar <img>
com logotipo da Contoso .
54
<head>
</head>
<body>
</body>
</html>
17. Na janela Solution Explorer, clique com o botã o direito na pá gina default.html e escolha
Definir como pá gina inicial.
55
Neste exercício, você adiciona pá ginas ao site que criou no Exercício 1. Se nã o realizou o
Exercício 1, você pode usar os arquivos da pasta Exercício2 \ LabStart para começar. Você
ainda nã o conseguirá acessar as novas pá ginas da pá gina inicial porque adicionou
essa funcionalidade no Exercício 3.
1. Na janela do Solution Explorer, clique com o botã o direito do mouse no projeto, escolha
Adicionar e selecione HTML
<head>
</ h ead>
<body>
</body>
</html>
56
Você deve ver a tela renderizada, conforme mostrado na Figura 2-2. Observe que quase
nada está nesta pá gina. Nã o tem título ou logotipo. No Exercício 3, você combina esse
conteú do com a pá gina inicial para obter o cabeçalho e o logotipo.
6. Clique com o botã o direito do mouse no meio da fonte e escolha Exibir no navegador
(Internet Explorer).
8. Clique com o botã o direito no meio da fonte e escolha Exibir no navegador (Internet
Explorer).
57
Você aprendeu como incorporar conteú do na Liçã o 2; este exercício usa essas informaçõ es
para conectar as pá ginas do site da Contoso, Ltd., incorporando as pá ginas na home page,
usando um quadro embutido.
Nesta prá tica, você estende o site da Contoso, Ltd., que criou no Exercício 1, vinculando as
pá ginas e exibindo as pá ginas em um quadro embutido. Se você nã o executou o Exercício
1, pode usar os arquivos da pasta Exercise3Start para iniciar.
1. Abra o arquivo default.html e localize o comentá rio que afirma que uma tag < img > deve
ser adicionada. Adicione uma tag < img > apó s o comentá rio. Defina o atributo src
como Images /
ContosoLogo.jpg .
2. Localize o comentá rio que afirma que uma tag < iframe > deve ser adicionada. Adicione
um elemento < iframe > com um atributo de nome definido como iframeContent e um
atributo src definido como MainContent.html .
<head>
</head>
<body>
</body>
</html>
Você deve ver o logotipo da Contoso e o arquivo MainContent.html agora está incluído na
pá gina. A tela renderizada é mostrada na Figura 2-3.
58
<head>
</head>
<body>
<! - Adicionar <img> com logotipo da Contoso ->
<br />
59
</body>
</html>
Observe que você nã o precisa direcionar o quadro atual porque o comportamento padrã o
do hiperlink é substituir a pá gina atual pela nova pá gina. A seguir está um exemplo do
arquivo ExpenseReports.html completo.
<head>
<title> </title>
</head>
<body>
</body>
</html>
Você deverá ver a nova pá gina inicial com hiperlinks. Se você clicar no hiperlink Recursos
Humanos, deverá ver o conteú do HumanResources.html carregado no elemento < iframe >,
conforme mostrado na Figura 2-4. No conteú do < iframe >, você deve ver um hiperlink para
a pá gina inicial em que pode clicar para recarregar o arquivo MainContent.html no
elemento < iframe >.
Você pode não ver o hiperlink Home porque a página original pode estar
armazenada em cache.
60
As seguintes prá ticas adicionais foram elaboradas para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Saiba mais sobre cada uma das tags HTML que fazem parte do HTML5
■■ Exercício 2 Saiba mais sobre como incorporar conteú do adicionando imagens e mapas
de imagens a um documento HTML .
61
Respostas
Lição 1
1. Resposta correta: C
D. Incorre cto : Embora este exemplo funcione hoje, é possível que um atributo vin possa
ser introduzido por uma versã o futura do HTML que causaria um conflito.
2. Resposta correta: A
3. Resposta correta: D
documento.
4. Respostas corretas: A, B e D
B. Correto: O uso de disabled com um valor vazio é uma forma de implementar atributos
booleanos usando a forma entre aspas.
62
C. Incorreto: O uso de disabled com um valor true nã o é uma forma aceitá vel de
implementar atributos booleanos .
D. Correto: O uso de disabled com um valor igual ao nome do atributo é uma forma de
implementar atributos booleanos usando a forma entre aspas.
Lição 2
1. Resposta correta: D
2. Resposta correta: A
A. Correto: O tipo de arquivo SVG é usado para criar Grá ficos Vetoriais Escalá veis, que sã o
bem dimensionados enquanto mantêm a qualidade.
B. Incorreto: O tipo de arquivo GIF é melhor para imagens pequenas com cores limitadas,
mas é baseado em raster e nã o é bem dimensionado.
C. Incorreto: O tipo de arquivo JPG é melhor para fotos quando milhõ es de cores sã o
usadas e alta compactaçã o é desejá vel, mas é baseado em raster e nã o é bem dimensionado.
D. Incorreto: O tipo de arquivo PNG é melhor para fotos quando milhõ es de cores sã o
usadas e a compactaçã o média sem perda é desejá vel, mas é baseado em raster e nã o tem
uma boa escala.
Respostas CAPÍTULO 2
63
CAPÍTULO 3
Começando com
JavaScript
Configurando um ambiente de teste, você pode escrever có digo e testá -lo sem exigir o
documento HTML de produçã o. Você deseja ter o má ximo de separaçã o possível entre o
có digo JavaScript e o documento HTML, para poder escrever o có digo JavaScript
independentemente do documento HTML. Quanto antes você tiver um ambiente de teste
configurado, mais cedo será capaz de começar a escrever có digo JavaScript.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
65
Compreendendo o JavaScript
JavaScript nã o está relacionado a Java, embora seja uma linguagem de chaves como Java, C
#, C ++ e muitas outras linguagens de programaçã o. JavaScript está relacionado ao
ECMAScript, entretanto. A Ecma International, trabalhando com outras organizaçõ es, criou
esta linguagem de script padronizada na especificaçã o ECMA-262 e ISO / IEC 16262. A
linguagem é amplamente usada para scripts do lado do cliente na web, e você normalmente
vê vá rias variaçõ es bem conhecidas de ECMAScript, como JavaSc ript, JScript e
ActionScript. A versã o atual é ECMAScript Edition 5.1 e os navegadores mais comuns
suportam ECMAScript Edition 5.0 ou mais recente.
O JavaScript nã o tem tipo, o que significa que, ao criar uma variá vel, você nã o precisa
especificar seu tipo. Isso pode parecer um recurso porque você declara uma variá vel com a
palavra-chave var e atribui uma string à variá vel e, posteriormente, pode atribuir um
nú mero à mesma variá vel. No entanto, é difícil aplicar o Microsoft IntelliSense a idiomas
nã o digitados. É tã o difícil manter o có digo porque é difícil saber o tipo da variá vel. Isso
pode fazer com que você desenvolva uma aversã o imediata pelo idioma, mas persevere e
trabalhe com o idioma. Você ficará surpreso com o poder do JavaScript. Embora você possa
nunca querer negociar em Visual Basic .NET ou C #, você descobrirá que quanto mais
tempo você gasta com JavaScript, mais respeito você desenvolverá por essa linguagem.
Uma maneira de aliviar a dor de aprender JavaScript é certificar-se de que está usando
ferramentas que podem ajudá -lo. A versã o mais recente do Visual Studio 2012 adiciona
mais IntelliSense ao JavaScript e 66
adiciona o Console JavaScript, que pode simplificar a depuraçã o. Pesquise na web por
outras ferramentas, como Resharper da JetBrains. Esta ferramenta possui muitos recursos
que podem ajudá -lo a escrever o có digo JavaScript.
Compreender a função dos dados
Quando você deseja criar um programa, normalmente descobre que o programa deve
acessar e manipular dados porque os dados estã o na raiz de todos os sistemas. Você coleta
dados, manipula dados, armazena dados, recupera dados, exibe dados e assim por diante.
Os dados estarã o em formas diferentes, mas a maioria dos dados pode ser dividida em
partes menores chamadas de valores . JavaScript define um tipo de valor como um objeto,
um valor primitivo ou uma funçã o. Um valor primitivo é um dado representado em seu
nível mais baixo de implementaçã o da linguagem e, em chave
JavaScript também define os seguintes objetos internos: o objeto global , o objeto Object, o
objeto Function, o objeto Array, o objeto String, o objeto Boolean, o objeto Number, o objeto
Math, o objeto Date, o objeto RegExp , o objeto JSON e vá rias variaçõ es de objetos Error.
O maior nú mero inteiro que pode ser representado internamente é 253, que é
9.007.199.254.740,9 94. Depois disso, os nú meros sã o armazenados como uma fraçã o
vezes 2expoente. Ao realizar cá lculos inteiros, os resultados sã o sempre precisos, mas ao
trabalhar com fraçõ es, podem surgir problemas. Um cá lculo como 0,1 + 0,2 nã o resultará
em 0,3 devido ao m anner no qual as fraçõ es sã o armazenadas. O resultado será
0,30000000000000004 porque 0,1 e 0,2
nã o pode ser facilmente armazenado como um valor de fraçã o biná ria. Para situaçõ es como
essa, você pode precisar arredondar seus resultados para truncar a fraçã o para um nú mero
fixo de casas decimais.
67
VALORES ESPECIAIS
+ 10308.
-1,7976931348623157E + 10308.
ARITMÉTICA
7+3*8
Esta é uma expressã o com operandos e operadores. O sinal de mais (+) e o sinal de
multiplicaçã o (*) sã o operadores. Os nú meros sã o operandos. Os operadores fazem com
que uma operaçã o seja executada, usando os operandos de cada lado do operador.
OPERADOR PRECEDENTE
Nesta expressã o, você nã o soma 7 e 3 para obter 10 e, em seguida, multiplica 10 por 8 para
obter 80.
JavaScript oferece suporte à precedência de operador, a atribuiçã o de uma precedência, ou
prioridade, a cada operador. Nesta expressã o, o sinal de multiplicaçã o tem uma
precedência maior do que o sinal de adiçã o, entã o 3 é primeiro multiplicado por 8 para dar
24 e, em seguida, 7 é adicionado a 24 para obter 31, que é diferente do resultado anterior
de 80. o sinal de adiçã o (+) e o sinal de subtraçã o (-) têm a mesma precedência. O sinal de
multiplicaçã o (*) e o sinal de divisã o (/) têm a mesma precedência, que é maior do que
os sinais de adiçã o e subtraçã o. Se você estiver trabalhando com uma expressã o na qual
vá rios operadores têm a mesma precedência, basta aplicar os operadores da esquerda para
a direita.
Você pode usar parênteses para indicar a ordem de precedência. Os parênteses têm a
precedência mais alta, portanto, a expressã o entre parênteses será executada
primeiro. Aqui está a expressã o modificada:
(7 + 3) * 8
68
MODULO
O operador mó dulo (%) executa uma divisã o implícita e retorna o restante. Por exemplo,
25% 7 produz um resultado de 4, que é o restante apó s a divisã o de 25 por 7.
Uma string é uma coleçã o de caracteres e é usada para representar texto. Você pode criar
uma string colocando aspas simples ou duplas. Nã o importa se você usa aspas simples ou
duplas, desde que os delimitadores inicial e final correspondam, como nos exemplos a
seguir:
Observe que o terceiro exemplo demonstra o uso de aspas simples quando você precisa
inserir aspas duplas na string. O quarto exemplo demonstra o uso de aspas duplas quando
você precisa inserir uma aspa simples na string. Se precisar incorporar aspas simples ou
duplas à string, você pode usar o caractere de barra invertida (\) para escapar das aspas
simples ou duplas, conforme mostrado no exemplo a seguir:
'O médico disse:' Tenho o prazer de anunciar que é uma menina! ' '
"O médico disse \" Tenho o prazer de anunciar que é uma menina! \ ""
No primeiro exemplo, a barra invertida é usada para escapar da aspa simples, portanto, nã o
é interpretada como sendo o final da string. No segundo exemplo, a barra invertida é usada
para evitar as aspas duplas, de forma que nã o sejam interpretadas como o final da string.
Algumas outras sequências de escape comuns sã o \ t para incorporar uma guia e \ n para
incorporar uma nova linha.
Você também pode usar \ uHHHH onde HHHH é um có digo hexadecimal de 4 dígitos para
incorporar uma sequência Unicode .
Você pode usar o sinal de mais para representar a concatenaçã o de strings. A seguir está
um exemplo em que vá rias strings sã o concatenadas para produzir uma grande string:
- Hickory Dickory Dock. + "O mouse acelerou o reló gio." + 'O reló gio bateu uma ...'
Você p robably nã o faria isso porque este exemplo poderia facilmente ter sido escrito como
uma ú nica corda grande, mas você pode querer continuar uma string em vá rias linhas,
como o seguinte:
69
tipo de 19,5
tipo de verdade
Nos três exemplos, o primeiro exemplo retorna 'string', o segundo exemplo retorna
'nú mero' e o terceiro exemplo retorna 'Booleano'.
Além de serem operadores biná rios, os sinais de mais e menos também podem ser usados
como operadores uná rios, como nos exemplos a seguir:
+23
-49
Nestes exemplos, os sinais de mais e menos estã o sendo usados como operadores uná rios
para especificar os sinais dos nú meros.
O tipo booleano pode conter os valores verdadeiro e falso. Embora você possa usar esses
valores diretamente, é mais comum produzir um valor verdadeiro ou falso comparando
dois valores, conforme mostrado nos exemplos a seguir que usam os sinais de menor que
(<) e maior que (>): 10 <9
20> 3
O primeiro exemplo produz um valor falso, enquanto o segundo exemplo produz um valor
verdadeiro. Os pró ximos exemplos usam o sinal de menor ou igual a (<=) e o sinal de maior
ou igual a (> =):
5 <= 4
7> = 8
10 == 13 - 3
operador é um operador uná rio que inverte o operando, portanto, se o operando for
avaliado como verdadeiro, o resultado será falso e vice-versa. Considere os seguintes
exemplos:
3 <10 e 10> 8
7> 5 || 1> 2
! (7> 5 || 1> 2)
Usando declarações
Usando variáveis
71
Observe que você pode declarar a variá vel em uma instruçã o e inicializá -la em uma
instruçã o diferente, da seguinte maneira:
var totalCost;
var tax;
Este exemplo mostra como você pode declarar todas as suas variá veis primeiro e, em
seguida, inicializar as variá veis mais tarde no programa.
O valor que você atribui a uma variá vel nã o é permanente; é chamado de variá vel porque
você pode alterá -lo. Os exemplos a seguir modificam a variá vel totalCost : var totalCost = 3 *
21,15;
■■ O nome de uma variá vel pode conter nú meros, mas eles nã o podem começar com um
nú mero. Os exemplos legais sã o x 1, y 2, gift4you . Os exemplos ilegais
sã o 4YourEyes , 2give , 1ForAl .
■■ Os nomes das variá veis nã o devem conter sinais de pontuaçã o de qualquer tipo além do
sublinhado (_) e do dó lar ($). Os exemplos legais
sã o Vehicle_identification , first_name , last_name , $ cost , total $ . Exemplos ilegais
sã o thisDoesn'tWork , begin; end , Many # s .
Exemplos ilegais sã o function, char, class, for, var. Os exemplos legais sã o theFunction , for-
Loop , myVar .
■■ Os nomes das variá veis diferenciam maiú sculas de minú sculas. Exemplos de variá veis
de casos diferentes sã o MyData , myData , mydata , MYDATA .
72
Variáveis de nomenclatura
Ao criar uma variá vel, dê a ela um nome que seja descritivo o suficiente para que você nã o
precise de um comentá rio para descrevê-la. Se você precisar adicionar um comentá rio para
descrever o uso da variá vel, o comentá rio estará apenas na declaraçã o. Se você nomear a
variá vel de uma forma que nã o requeira um comentá rio, o nome significativo será legível
em todo o seu có digo. Aqui estã o alguns exemplos bons e ruins de nomenclatura de
variá veis:
// maus exemplos
// bons exemplos
var lastAccessedDate;
var currentVehicle;
var VehicleMakeWasChanged;
Embora um nome de variá vel possa conter o sinal de dó lar e o sublinhado, geralmente é
preferível nã o usá -los. A exceçã o é ao atribuir objetos jQuery (discutidos no Capítulo 6,
“JavaScript essencial e jQuery”) a variá veis, quando você pode querer começar o nome da
variá vel com o sinal de dó lar.
Criando o ambiente
O exã o col de todas as variá veis e seus valores é comumente referido como o envi ente .
Quando o ambiente é criado, ele contém muitas variá veis padrã o mais as variá veis que você
chave
Os termos criam.
Em um aplicativo da web, cada vez que uma pá gina da web é carregada no navegador, um
novo ambiente é criado e o ambiente antigo é destruído . Todas as variá veis que você criar
ficam acessíveis até que uma nova pá gina da web seja carregada.
Funçõ es promovem a reutilizaçã o de có digo porque você pode chamar a funçã o muitas
vezes de dentro de Key
Termos seu có digo. As funçõ es podem ter parâ metros, que permitem passar dados para a
funçã o.
As funçõ es também podem ter um valor de retorno, portanto, você pode retornar os
resultados da funçã o ao contador.
73
Uma funçã o pode ser declarada usando a palavra-chave function e, em seguida, fornecendo
um nome (também conhecido como identificador ), a lista opcional de parâ metros entre
parênteses e um conjunto de chaves com o agrupamento de instruçõ es, da seguinte forma:
retornar x + y;
Este é um exemplo de declaração de função , na qual a funçã o é chamada de Add e tem dois
parâ metros, x e y . A funçã o possui um agrupamento de instruçõ es, denotado por chaves
(também conhecido como bloco de código ). Esta funçã o possui apenas uma instruçã o, mas
pode ter vá rias instruçõ es.
var b = 10;
Neste exemplo, três variá veis sã o declaradas. Variá veis um e b sã o inicializados com dados
a serem passados como argumentos para a funçã o Adicionar. A variá vel c conterá o valor de
retorno da funçã o Add. A funçã o Add receberá os argumentos em seus parâ metros x e y . Y
Final, a instruçã o de retorno irá adicionar x e y e retornar o resultado, que é atribuído à
variá vel c .
As declaraçõ es de funçã o podem ser chamadas antes da declaraçã o de funçã o ser declarada
porque as declaraçõ es de funçã o sã o resolvidas quando o JavaScript é analisado. O exemplo
a seguir será executado corretamente, embora a chamada para a funçã o Add seja antes da
funçã o Add: var a = 5;
var b = 10;
retornar x + y;
74
Uma expressã o de funçã o produz um valor do tipo funçã o. Você pode atribuir expressõ es
de funçã o à s variá veis s ou executá -las diretamente. Aqui está um exemplo de uma
expressã o de funçã o sendo criada e atribuída a uma variá vel:
retornar x + y;
};
As expressõ es de funçã o podem ser benéficas quando você deseja determinar o có digo
condicional y a ser executado no tempo de execuçã o. Aqui está um exemplo de quando você
pode adicionar dois valores ou subtrair um valor do outro:
retornar x + y;
};
// muito có digo
// muito có digo
return x - y;
};
// muito có digo;
JavaScript é muito vago ao passar argumentos para funçõ es. Se você tiver muitos
argumentos, o JavaScript simplesmente descarta os extras. Se você nã o tiver argumentos
suficientes, os valores dos parâ metros para os argumentos ausentes serã o indefinidos.
O maior benefício desse comportamento flexível é que você pode adicionar parâ metros a
um método que já foi criado e já está sendo chamado. Os parâ metros adicionados podem
fornecer funcionalidade extra que pode ser acessada , mas os calibres existentes continuam
a funcionar.
■■ alert Usado para exibir uma mensagem ao usuá rio em uma janela modal. O usuá rio clica
no botã o OK para fechar a janela de mensagem. O có digo a seguir produz a janela de alerta
na Figura 3-1:
var promptResult = prompt ('Este é um prompt de informaçõ es', 'valor padrã o'); FIGURA
3-2 A janela de prompt que coleta texto
■■ confirmar Usado para consultar o usuá rio sobre OK ou Cancelar exibindo uma janela de
mensagem modal. O usuá rio pode fechar a janela clicando no botã o OK ou Cancelar. A
funçã o de confirmaçã o retorna verdadeiro (quando o botã o OK é clicado) ou falso (quando
o botã o Cancelar é clicado):
prompt = function () {
};
Este có digo substitui o comportamento da funçã o prompt por uma funçã o que sempre
retorna a string, 'hel o again'. O nome da funçã o é representado por uma variá vel e você
pode alterar seu valor y dinamicamente. Isso é o mesmo para declaraçõ es de funçã o e
expressõ es de funçã o.
Variáveis de escopo
Os te rms ainda podem estar armazenados e podem até estar acessíveis de alguma forma,
mas o nome nã o pode acessar o valor.
Em JavaScript, existem essencialmente dois escopos, global e local. Uma variá vel com
escopo global pode ser acessada de qualquer lugar do programa. Uma variá vel com um
escopo local é acessível apenas de dentro da funçã o na qual a variá vel está definida, entã o
você pode pensar no escopo local como sendo um escopo de funçã o.
O fato de o escopo local ser limitado a uma funçã o é muito diferente de muitas outras
linguagens, em que um novo escopo local é criado para cada conjunto de chaves. Isso
significa que em muitas outras linguagens, as instruçõ es condicionais e de loop que têm
chaves também iniciam um novo contexto local. Este nã o é o caso do JavaScript, no qual o
ú nico escopo local está na funçã o. Variá veis que sã o declaradas em qualquer lugar dentro
da funçã o terã o um escopo de funçã o local. Para evitar confusã o, você deve declarar todas
as variá veis de funçã o na parte superior da funçã o.
Liçã o 1: Apresentando JavaScript CAPÍTULO 3
77
Se esse código estivesse dentro de uma função, você poderia ter pensado
que totalCost e tax seriam criados automaticamente com um escopo local, mas esse
não é o caso. Acontece que totalCost
Há mais informaçõ es sobre o escopo local que você precisa saber. No ript JavaSc, você pode
aninhar declaraçõ es de funçã o dentro de declaraçõ es de funçã o. JavaScript permite vá rios
níveis de aninhamento de declaraçã o de funçã o. Lembre-se de que uma funçã o produz um
escopo local, portanto, você pode obter escopos adicionais usando este truque de
aninhamento de funçã o .
Em muitos cená rios, você desejará converter uma variá vel de um tipo para outro. Por
exemplo, a funçã o prompt sempre retorna uma string, mas você solicitou que o usuá rio
insira um nú mero. Para conversõ es, você pode usar as funçõ es Nú mero e String.
78
Considere o seguinte exemplo, no qual o usuá rio é solicitado a inserir sua idade, a idade é
incrementada e uma mensagem é exibida, usando a nova idade: var age = prompt ('Enter
age', '');
Quando você executa este có digo e insere um nú mero como 20, a mensagem é exibida
como You Will Soon Be 201 Years Old! como idade é uma string, o sinal de mais y converte
automaticamente o nú mero 1 em uma string e concatena com a idade, resultando em 201
idade.
Se você tentar executar este có digo, obterá a mesma resposta de idade de 201 anos. O que
aconteceu? O primeiro sinal de mais possui uma string no lado esquerdo e a funçã o
Numérica à direita.
Embora você tenha convertido para um nú mero, o primeiro sinal de mais y converteu
automaticamente o nú mero de volta em uma string e retornou o mesmo valor de 201.
Para resolver o problema, coloque parênteses ao redor da matemá tica para garantir que a
idade receba o valor apropriado antes de ser convertida em uma string e concatenada da
seguinte forma: var age = prompt ('Digite a idade', '');
alert ('Em breve terá ' + (Nú mero (idade) + 1) + 'anos!'); Ao executar este có digo, você
obtém uma resposta de You Will Soon Be 21 Years Old! porque a idade é convertida em um
nú mero e incrementada antes que qualquer concatenaçã o de string ocorra.
Verificação rápida
79
A funçã o String tenta converter o argumento do objeto que é passado para a funçã o em
uma string. Considere o cená rio em que você tem dois nú meros s, como 10 e 20, e deseja
concatená -los como strings e exibir a string resultante de 1020. Você pode tentar o
seguinte có digo:
var x = 10;
var y = 20;
alerta (x + y);
Este exemplo exibirá um valor de 30 porque o sinal de mais adicionou os valores em vez de
concatená -los como strings. Para resolver o problema, você pode usar a funçã o String para
converter os nú meros em strings da seguinte forma:
var x = 10;
var y = 20;
Este exemplo exibirá um valor de 1020 porque os nú meros foram convertidos em strings e,
em seguida, o sinal de mais concatenou os valores.
Programação condicional
Freqü entemente, você precisará executar determinado có digo quando uma expressã o for
avaliada como verdadeira e executar um có digo diferente quando a expressã o for avaliada
como falsa. É quando as palavras-chave if e switch podem ajudar.
Considere o cená rio em que o usuá rio é solicitado a inserir sua idade, um é adicionado à
idade e uma mensagem é exibida. Aqui está o có digo que foi usado anteriormente quando a
funçã o de prompt integrada foi discutida:
var age = prompt ('Insira a idade', '');
alert ('Em breve terá ' + (Num ber (idade) + 1) + 'anos!'); O que acontece se alguém inserir
Nã o sei para a idade? Esta string nã o é numérica e a mensagem exibida será You Will Soon
Be NaN Years Old, onde NaN significa Não é um número . Você pode fornecer
uma mensagem mais específica quando a entrada do usuá rio nã o for um nú mero. Isso pode
ser feito usando as palavras-chave if / else com uma funçã o integrada chamada isNaN, da
seguinte forma:
if (isNaN (idade))
outro
A funçã o isNaN aceita um argumento de objeto e testa esse objeto para ver se é numérico. A
funçã o isNaN retorna verdadeiro se o objeto nã o for numérico e falso se for numérico.
A palavra-chave if é usada com uma expressã o entre parênteses e avaliada como um valor
booleano. Essa expressã o é usada em seu có digo para orientar o fluxo do programa com
base no resultado da funçã o isNaN, que, quando verdadeira, exibe a mensagem You Need
To Enter A Valid Number. Observe que a palavra-chave if possui uma palavra-chave else
correspondente que é usada para fornecer um fluxo de programa alternativo quando a
expressã o if for avaliada como falsa. A palavra-chave else é opcional.
O exemplo anterior executa uma ú nica declaraçã o quando verdadeira e uma ú nica
declaraçã o quando falsa. Se você precisar executar vá rias instruçõ es quando verdadeiro ou
falso, deve colocar as instruçõ es entre colchetes para indicar que tem um bloco de có digo
para executar da seguinte forma: var age = prompt ('Enter age', '');
if (isNaN (idade)) {
idade = 0;
else {
Como regra, você deve considerar o uso de chaves o tempo todo. Isso permite que um
usuá rio adicione có digo ao bloco de có digo sem ter que pensar se as chaves existem.
Você também pode criar instruçõ es if encadeadas (também conhecido como cascata)
adicionando outro if apó s a palavra-chave else. Aqui está um exemplo n de cascata se:
if (isNaN (idade)) {
idade = 0;
outro
81
A palavra-chave switch pode ser usada quando um ú nico valor deve ser examinado e, com
base em seu valor, pode haver vá rios resultados. Considere o seguinte exemplo que usa
a palavra-chave switch, em que o usuá rio é solicitado a selecionar uma cor para o carro que
está comprando:
var carColor = prompt ('Qual carro de cor você gostaria de comprar?', 'branco'); switch
(carColor) {
case 'red':
intervalo;
caso 'preto':
alerta ('Preto fica bonito, mas você precisa lavar com frequência!');
intervalo;
caso 'branco':
intervalo;
predefiniçã o:
intervalo;
};
Neste exemplo, o usuá rio é solicitado a inserir uma cor de carro e é apresentado com um
valor padrã o de branco. A palavra-chave switch examina carColor para ver se seu valor
corresponde a qualquer um dos valores fornecidos nos casos. Se houver uma
correspondência, o có digo dentro do caso é executado até que o có digo alcance uma quebra
ou uma palavra-chave de retorno. Se nã o houver interrupçã o ou retorno, o có digo continua
no pró ximo caso ou padrã o.
Como você usa a opçã o com intervalos numéricos? Muitas pessoas diriam que você nã o
pode trabalhar com intervalos numéricos porque o switch está procurando uma
correspondência exata para um valor de caso, mas há um truque para resolver esse
problema. Considere o exemplo de cascateamento, abordado anteriormente, quando o
programa produziu uma mensagem diferente com base na resposta da idade do
usuá rio. Quatro categorias diferentes de respostas - se a idade nã o era um nú mero, se era
maior ou igual a 50, se era menor ou igual a 20 ou se era qualquer outro nú mero -
receberam quatro mensagens diferentes. O que se segue é uma reescrita do cascateamento
como um switch: var age = prompt ('Digite sua senha', '');
switch (verdadeiro) {
idade = 0;
intervalo;
82
predefiniçã o:
};
Neste exemplo, o truque é usar switch (true) , que permite usar declaraçõ es condicionais
com cada caso avaliado como verdadeiro ou falso.
Freqü entemente, você desejará determinar se uma variá vel tem um valor. Você pode usar a
palavra-chave if para determinar isso. A palavra-chave if é avaliada como verdadeira se a
variá vel tiver um valor; ele é avaliado como falso quando a variá vel é indefinida ou nula . A
diferença entre undefined e null é mínima, mas há uma diferença. Uma variá vel cujo valor é
indefinido nunca foi inicializada. Uma variá vel cujo valor é nulo recebeu explicitamente um
valor nul, o que significa que a variá vel foi explicitamente configurada para nã o ter valor. Se
você comparar undefined e null usando a expressã o nul == undefined, eles serã o iguais.
if (myVar) {
outro {
Se myVar for 0, NaN , string vazia, nul ou indefinido, uma mensagem será exibida,
informando que myVar nã o tem um valor. Se myVar contiver qualquer outro valor, uma
mensagem será exibida informando que myVar tem um valor .
Freqü entemente, você deseja verificar uma variá vel para ver se ela tem um valor e, se a
variá vel tiver um valor, usar a variá vel ou um valor padrã o. JavaScript oferece uma maneira
bastante simples de fazer isso: use o || (ou) operador.
A seguir está um exemplo de uso do operador ou para realizar esta tarefa: var customer =
prompt ('Digite seu nome');
Neste exemplo, se o cliente tiver um valor, o operador ou será avaliado como verdadeiro e
o valor real será retornado. Como o operador ou está em curto-circuito, nã o há avaliaçã o do
segundo operando. Se o cliente nã o tiver valor, o operador ou retorna o segundo operando,
mesmo se for nulo.
83
O operador && (e) exibe um comportamento semelhante, mas retorna o primeiro valor
vazio em vez do primeiro valor nã o vazio. Se todas as variá veis tiverem um valor, Valued
Customer é retornado. Nã o há muito valor no mundo real para esse comportamento, mas é
uma ferramenta em sua caixa de ferramentas JavaScript.
falso == 0;
'' == 0;
'123' == 123
Para realizar uma comparaçã o de tipo e igualdade, JavaScript fornece o === e o! ===
falso === 0;
'' === 0;
A palavra-chave while pode ser usada para criar um loop que aceita uma expressã o de loop
entre parênteses. O loop pode conter uma ú nica instruçã o ou um bloco de có digo que é
executado, desde que a expressã o do loop seja avaliada como verdadeira. Aqui está um
exemplo do loop while: var x = 10;
enquanto (x> 0) {
x--;
84
Neste exemplo, enquanto a expressã o de loop for avaliada como verdadeira, o loop
continuará . Cada vez no loop, x é decrementado, usando a instruçã o x--. Depois que x for
diminuído, uma mensagem de alerta será exibida, mostrando o valor atual de x . Observe
que o bloco de có digo pode ser executado de zero a muitas vezes, com base no valor
de x quando o ponteiro do programa atinge o loop while. Se x fosse inicializado em zero, o
loop nã o seria executado.
Implementando o loop do
A fazer palavra-chave pode ser usada para criar um loop que e xecutes um para muitas
vezes. A instruçã o do começa com a palavra “ do ” , seguida por um conjunto obrigató rio de
chaves contendo um bloco de có digo que será executado cada vez que o loop for executado,
seguido pela palavra-chave while e uma expressã o de loop que está entre parênteses .
A razã o mais convincente para usar o loop do é que ele é executado pelo menos uma vez
porque a expressã o do loop é avaliada apó s a execuçã o do loop. Pode ser difícil pensar em
uma implementaçã o real desse loop, mas considere se uma tela de login precisa ser exibida
para coletar o nome de usuá rio e a senha, e a tela de login será exibida novamente se as
credenciais de login nã o estiverem corretas. O exemplo a seguir deve fornecer alguma
clareza para esta implementaçã o:
var tentativas = 0;
Faz{
retries ++;
showLoginScreen ();
if (tentativas == 3) {
Retorna;
Im plementing o loop
O de laço é y típico usado quando você sabe quantas vezes o loop será executado, e você
quer um contador de loop variá vel. O loop for usa a seguinte sintaxe: for (var variá vel =
valor inicial; variá vel <valor final; variá vel = variá vel + incremento)
Dentro dos parênteses, há três seçõ es, separadas por ponto-e-vírgula. Os dois pontos e
vírgulas devem existir, mesmo se você deixar uma seçã o vazia. A primeira seçã o permite
que você declare e Liçã o 1: Apresentando JavaScript CAPÍTULO 3
85
inicializar uma variá vel de loop. Esta seçã o é executada uma vez quando o programa atinge
este loop. A segunda seçã o é a expressã o do loop , que é chamada antes de executar o
có digo do loop, para determinar se o loop deve ser executado. Se a expressã o do loop for
avaliada como verdadeira, o có digo do loop será executado. A terceira seçã o é a seçã o de
modificaçã o de loop. É aqui que você pode querer aumentar (ou diminuir) a variá vel de
loop. Esta seçã o é executada depois que o có digo do loop é executado para cada loop.
Você pode usar o loop quando você sabe que você quer fazer um loop um nú mero
específico de vezes e, no có digo de loop, você quiser acessar um contador de v ariá vel, como
mostrado no exemplo devido fol:
Neste exemplo, uma variá vel de contador é criada com a palavra-chave var. Tenha cuidado
ao usar a palavra-chave var para evitar a criaçã o de uma variá vel global por engano. O loop
continuará enquanto a variá vel do contador for menor que 10. Cada vez que o loop é
executado, o contador é incrementado, usando a sintaxe counter ++. A variá vel counter é
usada no có digo de loop para exibir uma mensagem, mas o contador certamente poderia
ser usado para tarefas mais elegantes.
Saindo de um loop
À medida que a ló gica do loop se torna complicada, você pode descobrir que precisa de
uma maneira de sair do loop usando uma verificaçã o condicional dentro do có digo do
loop. Para cená rios como este, você pode usar a palavra-chave break para sair do loop
imediato. Observe que a palavra-chave break sairá apenas do loop atual. Se você estiver em
um loop aninhado, sairá de apenas um nível.
No cená rio a seguir, um loop é criado para determinar se um nú mero é um nú mero primo e
a palavra-chave break é usada para sair do loop se o nú mero a ser testado nã o for um
nú mero primo:
índice de var = 2;
if (numberToTest% index == 0) {
isPrime = false;
intervalo;
}
index ++;
if (isPrim e) {
outro {
Neste exemplo, o operador mó dulo (%) determina se o índice pode ser dividido no nú mero
a ser testado sem produzir um resto. Em caso afirmativo, o nú mero a testar nã o é primo 86
Manipulação de erros
Ao escrever có digo, você sempre deseja ter certeza de que seu có digo nã o causa
uma exceção . Uma exceção é um erro que ocorre em tempo de execuçã o devido a uma
operaçã o ilegal durante a execuçã o. Você deve validar suas variá veis preventivamente
antes de realizar uma operaçã o. Chave
Termos que podem gerar uma exceçã o. Por exemplo, antes de dividir uma variá vel
(numerador) por outra variá vel (denominador), verifique se o denominador nã o é zero
para nã o lançar uma exceçã o de divisã o por zero.
O bloco try é usado com um bloco de có digo que contém o có digo que pode falhar. Você
deseja tentar executar o bloco de có digo. O bloco try requer um bloco catch, um bloco y
final ou ambos.
O bloco catch terá a exceçã o passada para ele, para que você tenha acesso à exceçã o dentro
do seu có digo. O bloco catch é executado automaticamente se o có digo no bloco try lançar
uma exceçã o. Nesse caso, a execuçã o do programa salta imediatamente para o bloco catch
sem executar outras instruçõ es no bloco try.
O bloco y final é executado depois que o bloco de tentativa y é concluído com sucesso ou o
bloco catch é concluído. A intençã o do bloqueio yb final é fornecer um local para o có digo
de limpeza porque o bloco y final é executado independentemente de uma exceçã o ter sido
lançada.
O exemplo de có digo a seguir ilustra o uso dos blocos try, catch e final y: try {
undefinedFunction ()
pegar (ex) {
finalmente{
Neste exemplo, se a funçã o undefinedFunction existe e nã o lança uma exceçã o, você recebe
dois alertas: o primeiro alerta é Feito, Existe entã o undefinedFunction e o segundo alerta é
Final y Bloco executado.
Liçã o 1: Apresentando JavaScript CAPÍTULO 3
87
Lembre-se de que o bloco y final sempre é executado apó s o bloco try ser concluído com
êxito y ou apó s a execuçã o do bloco catch. Se o bloco catch lançar uma exceçã o, o bloco y
final será executado antes que a exceçã o seja passada para a rotina de chamada.
Resumo da lição
■■ JavaScript nã o tem tipo, portanto, ao criar uma variá vel, você nã o precisa especificar seu
tipo.
■■ O operador typeof é um operador uná rio que retorna uma string que indica o tipo do
operando.
■■ Em JavaScript, existem essencialmente dois escopos, global e local, mas você pode criar
escopos locais aninhados aninhando funçõ es.
■■ Use dois sinais de igual (==) para testar a igualdade e use três sinais de igual (===) para
testar o mesmo tipo e igualdade.
■■ O loop while é executado de zero a muitas vezes, e o loop do é executado uma a muitas
vezes.
■■ O loop for é executado de zero a muitas vezes e tem uma variá vel de contador .
■■ Use as palavras-chave try, catch e final y para lidar com exceçõ es.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Seu aplicativo solicita que o usuá rio insira sua idade, que é colocada em uma variá vel
de idade . Um usuá rio executou o aplicativo e inseriu Nã o sei para a idade. O aplicativo
entã o multiplica a idade por dois. Qual é o resultado?
A. indefinido
B. nulo
88
C. NaN
D. infinito
B. var myChar;
Custo de C. var $;
D. var _total;
E. var 1to1;
F. var tooGood4u;
3. Em seu aplicativo, você deseja exibir uma mensagem personalizada para o usuá rio, se o
nome do usuá rio estiver preenchido, na variá vel userName , mas se userName estiver vazio,
você deseja usar Usuá rio Valioso. Como você pode fazer isso com mais eficiência?
A. var per sonalized = 'Hel o' + (userName ?? 'Valued User'); B. var personalizado = 'Hel o' +
(userName || 'Valued User'); C. var personalizado = 'Hel o' + (userName && 'Valued
User'); D. var personalizado = 'Hel o' + (userName + 'Valued User'); Lição 2:
escrever, testar e depurar JavaScript
89
Existem muitos suplementos para escrever có digo orientado a teste, mas as opçõ es sã o
relativamente poucas para có digo JavaScrip t orientado a teste . Provavelmente, a
ferramenta mais comum é QUnit, que pode ser usada com aplicativos da Web
ASP.NET; para aplicativos do Windows 8, uma variante do QUnit é o QUnit-Metro.
Para configurar o QUnit com um aplicativo ASP.NET, você deve primeiro iniciar o Visual
Studio Express 2012
para a Web e crie um aplicativo da web. Neste exemplo, o ASP.NET Empty Web Application
é criado.
Na janela Gerenciador de Soluçõ es, clique com o botã o direito do mouse no nó do projeto e
clique em Gerenciar Pacotes NuGet. Isso exibe a janela Gerenciar Pacotes NuGet. NuGet é
um sistema de gerenciamento de pacotes de có digo aberto para a plataforma .NET que
simplifica a adiçã o de bibliotecas de terceiros em seu có digo. Clique no nó Online e, em
seguida, na caixa de texto Pesquisar Online, digite QUnit e clique na lupa para realizar a
pesquisa. Os resultados sã o exibidos de forma semelhante à Figura 3-4. Lembre-se de que
sua tela de resultados pode ser diferente devido aos muitos novos pacotes que estã o sendo
lançados, portanto, certifique-se de procurar o pacote QUnit para ASP.NET MVC.
Clique em QUnit para ASP.NET MVC; você deve ver um botã o Instalar. Clique no botã o
Instalar para instalar o QUnit For ASP.NET MVC em seu projeto. Depois que o pacote for
instalado, você verá uma marca de seleçã o onde o botã o Instalar estava localizado. Clique
no botã o Fechar para fechar a tela Gerenciar pacotes NuGet. Observe que este pacote QUnit
para ASP.NET MVC funciona com aplicativos de modelo, visualizaçã o e controle (MVC) e
aplicativos da Web ASP.NET, embora a folha de estilo em cascata que é adicionada nã o
esteja no local da folha de estilo padrã o para ASP.NET
formulá rios. (Por enquanto, deixaremos a folha de estilo sozinha.) Depois que o pacote
QUnit para ASP.NET MVC foi adicionado, você verá um arquivo packages.config, que
contém uma referência ao seu pacote. A pasta Scripts contém um arquivo chamado
qunit. js, que contém o có digo-fonte QUnit. A pasta Conteú do contém um arquivo qunit.css,
que contém a folha de estilo em cascata para QUnit.
90
Em seguida, adicione uma pá gina default.html clicando com o botã o direito do mouse no nó
do projeto (na janela Solution Explorer) e clique em Adicionar; escolha Pá gina
HTML. Nomeie o arquivo default.html e clique em OK. Torne o arquivo default.html sua
pá gina de inicializaçã o clicando com o botã o direito do mouse no arquivo default.html e
escolhendo Definir como pá gina inicial. Modifique o arquivo default.html para se parecer
com o exemplo a seguir, no qual as linhas inseridas estã o em negrito:
<head>
<title> </title>
<link rel = "stylesheet" type = "text / css" href = "Content / qunit.css" />
</head>
<body>
</body>
</html>
A configuraçã o do QUnit está feita, mas neste arquivo, você ainda precisa adicionar
referências ao có digo que será testado e aos testes reais. Seu có digo e seus testes devem
estar em arquivos separados, portanto, você adicionará pelo menos duas
referências. Navegar para Depurar e escolher Iniciar Depuraçã o faz com que a tela de
resumo do QUnit seja exibida, conforme mostrado na Figura 3-5.
91
FIGURA 3-5 A tela de resumo do QUnit mostrando 0 testes de 0 passou, 0 falhou Esta
tela está mostrando que nenhum teste passou e nenhum teste falhou porque você ainda
nã o tem testes. É hora de adicionar um teste Hel o World ao aplicativo.
Um arquivo default.js e um arquivo tests.js precisam ser adicionados à pasta Scripts
clicando com o botã o direito na pasta Scripts e escolhendo Adicionar. Escolha o arquivo
JavaScript. Nomeie o arquivo default.js e clique em OK. Faça o mesmo para o arquivo
tests.js.
<head>
<title> </title>
<link rel = "stylesheet" type = "text / css" href = "Content / qunit.css" />
</head>
<body>
92
</body>
</html>
Agora escreva o primeiro teste. Ao usar o TDD, sempre escreva o teste primeiro, execute-o
para ver a falha do teste e, em seguida, adicione o có digo para fazer o teste passar. No
arquivo tests.js, adicione o seguinte teste para ver se uma variá vel de saudação contém Hel
o World:
});
Aqui está uma visã o geral do que está acontecendo com este có digo. O có digo está
chamando uma funçã o de teste, que está incluída no có digo-fonte QUnit. Uma funçã o é um
bloco de có digo que você pode chamar para realizar uma ou mais açõ es. A funçã o de teste
requer três parâ metros. O primeiro parâ metro é uma descriçã o de forma livre do teste, que
é A Hel o World Test. A descriçã o do teste é exibida na tela de resumo do QUnit quando
você executa os testes . O segundo parâ metro, que tem o valor um, representa a quantidade
de asserçõ es que você espera realizar na funçã o de teste. O terceiro parâ metro é uma
funçã o anô nima. Uma função anônima é um bloco de có digo que nã o tem nome e
pode executar uma ou mais açõ es. É aqui que você digita
Nesta funçã o anô nima, a funçã o igual está sendo chamada para ver se a variá vel
de saudação contém Hel o World. A funçã o igual leva três parâ metros. O primeiro
parâ metro é o valor real, neste caso, a variá vel de saudação . O segundo parâ metro é o valor
esperado, Hel o World. O terceiro parâ metro é uma mensagem que você deseja exibir, neste
caso, Expect Greeting Of Hel o World.
Como você nã o criou uma variá vel de saudação , este teste deve falhar. Ao executar os
testes (clique em Depurar e escolha Iniciar Depuraçã o), você verá o teste com falha com um
indicador vermelho. A Figura 3-6 mostra a tela de resumo do QUnit com o teste reprovado.
O teste falhou com uma mensagem que afirma que a “saudaçã o” é indefinida. Agora, para
fazer o teste passar, adicione o có digo a seguir, que declara uma variá vel de saudaçã o e
atribui um valor de Hel o World no arquivo default.js:
93
FIGURA 3-6 A tela de resumo do QUnit mostrando um teste com falha Salve todos os
arquivos navegando até Arquivo e escolhendo Salvar tudo (ou Ctrl + Shift + S) e execute o
aplicativo novamente. Se você vir o mesmo erro, tente pressionar Ctrl + F5 na janela do
navegador para limpar o cache do navegador. Você deve ver que o teste agora passa porque
a saudação é definida e inicializada para Hel o World. Na tela de resumo do QUnit, você
deve ver uma mensagem que indica 1 Testes de 1 Aprovado, 0 Reprovado. Se você clicar no
teste , deverá ver o teste mostrando um indicador verde, conforme mostrado na Figura 3-7.
À medida que você adiciona mais recursos ao seu aplicativo, basta adicionar outro teste
que defina ou ajude a moldar cada recurso e, em seguida, escreva o có digo para fazer o
teste passar.
94
Para configurar o QUnit com um aplicativo do Windows 8, você deve primeiro iniciar o
Visual Studio Express 2012
Na janela Gerenciador de Soluçõ es, clique com o botã o direito do mouse no nó do projeto e
clique em Gerenciar Pacotes NuGet. Isso exibe a janela Gerenciar Pacotes NuGet. NuGet é
um sistema de gerenciamento de pacotes ope n-source para a plataforma .NET que
simplifica a adiçã o de bibliotecas de terceiros ao seu có digo. Clique no nó Online e, em
seguida, na caixa de texto Pesquisar Online, insira QUnit-Metro e clique na lupa para
realizar a pesquisa . Os resultados sã o exibidos, semelhantes à Figura 3-8. Sua tela de
resultados pode ser diferente devido aos muitos novos pacotes que estã o sendo lançados,
portanto, certifique-se de procurar o pacote QUnit-Metro.
95
FIGURA 3-8 A janela Gerenciar Pacotes NuGet
Depois que o pacote QUnit-Metro for adicionado, você verá um arquivo packages.config que
contém uma referência ao seu pacote. A pasta js contém um novo arquivo,
qunitmetro.js, que contém o có digo-fonte QUnit-Metro. A pasta css contém novas folhas de
estilo em cascata, chamadas qunitmetro.css, qunitmetro-dark.css e qunitmetro-
light.css. Você usa o qunitmetro .css para obter a apresentaçã o padrã o, mas pode adicionar
o arquivo qu nitmetro-dark.css ou o qunitmetro-light.css à sua pá gina de teste para fazer a
tela do QUnit-Metro parecer mais com um aplicativo do Windows 8 .
<html>
<head>
96
<link rel = "stylesheet" type = "text / css" href = "css / qunitmetro.css" />
<link rel = "s tylesheet" type = "text / css" href = "css / qunitmetro-dark.css" />
</head>
<body>
</body>
< / html>
A configuraçã o do QUnit-Metro está concluída, mas neste arquivo, você ainda precisa
adicionar uma referência ao arquivo de có digo de teste. Seu có digo e seus testes devem
estar em arquivos separados. Você já tem uma referência ao arquivo default.js, portanto,
adicionará mais uma referência . Navegar para Depurar e escolher Iniciar Depuraçã o exibe
o arquivo default.html. Clique com o botã o direito na tela para exibir a barra de aplicativos
na parte inferior e clique em Executar testes. A tela de resumo do QUnit é exibida, conforme
mostrado na Figura 3-9.
FIGURA 3-9 A tela de resumo do QUnit-Metro mostrando que nenhum teste foi executado
Esta tela está mostrando que nenhum teste passou e nenhum teste falhou porque você
ainda nã o tem testes. Agora, adicione um teste Hel o World ao aplicativo.
Um arquivo tests.js deve ser adicionado à pasta js clicando com o botã o direito na pasta js e
navegando até Adicionar | Novo item | Arquivo JavaScript. Nomeie o arquivo tests.js e
clique em OK.
97
<html>
<head>
<meta charset = "utf-8" />
< link rel = "stylesheet" type = "text / css" href = "css / qunitmetro.css" />
<link rel = "stylesheet" type = "text / css" href = "css / qunitmetro-dark.css" />
</head>
<body>
</body>
</html>
Agora você pode escrever o primeiro teste. Ao usar o TDD, sempre escreva o teste primeiro,
execute-o para ver a falha do teste e, em seguida, adicione o có digo para fazer o teste
passar. No arquivo tests.js, adicione o seguinte teste para ver se uma variá vel
de saudação contém Hel o World: test ( "A Hello World Test", function () {
});
Aqui está uma visã o geral do que está acontecendo com este có digo. O có digo está
chamando uma funçã o de teste, que está incluída no có digo-fonte QUnit e requer dois
parâ metros. O primeiro parâ metro é o nome do teste, que é A Hel o World Test. O nome do
teste é exibido na tela de resumo do QUnit quando você executa os testes. O segundo
parâ metro é uma funçã o anô nima, na qual você adiciona qualquer có digo a ser executado e,
em seguida, executa asserçõ es para verificar se o teste foi bem-sucedido. Nesta funçã o
anô nima, a funçã o igual é chamada para ver se a variá vel de saudação contém Hel o
World. A funçã o igual leva três parâ metros. O primeiro parâ metro é o valor real, neste caso,
a variá vel de saudação . O segundo parâ metro é o valor esperado, Hel o World. O terceiro
parâ metro é uma mensagem que você deseja exibir, neste caso, Expect Greeting Of Hel o
World.
Como você nã o criou uma variá vel de saudação , este teste deve falhar. Ao executar os
testes (clique em Depurar, escolha Iniciar Depuraçã o, clique com o botã o direito do mouse
na tela e escolha Executar Testes), você deverá ver o teste com falha com um indicador
vermelho. A Figura 3-10 mostra a tela de resumo do QUnit com o teste reprovado.
98
Salve todos os arquivos clicando em Arquivo e escolhendo Salvar tudo (ou pressionando
Ctrl + Shift + S) e execute o aplicativo novamente. Você deve ver que o teste agora passa
porque a saudaçã o é definida e inicializada como Hel o World. Na tela de resumo do QUnit-
Metro, você deve ver uma mensagem que indica 1 Testes de 1 Aprovado, 0 Reprovado. Se
você clicar no teste, deverá ver um indicador verde, conforme mostrado na Figura 3-11.
99
FIGURA 3-11 A tela de resumo do QUnit-Metro mostrando a aprovaçã o no teste À medida
que adiciona mais recursos ao seu aplicativo, você adiciona outro teste que define ou ajuda
a moldar cada recurso e, em seguida, escreve o có digo para fazer o teste passar.
Nas seçõ es anteriores, links para arquivos JavaScript foram adicionados a documentos
HTML arrastando o arquivo JavaScript da janela do Solution Explorer e soltando-o no
documento HTML . Ao eliminar, é adicionado um elemento < script > que faz referência ao
arquivo JavaScript.
<! -
retornar x + y;
}
alerta (adicionar (3, 2));
// ->
</script>
O atributo type especifica o tipo MIME, que era necessá rio nas versõ es anteriores do HTML
A seguir está o início de um comentá rio HTML. Observe que a parte inferior contém um
comentá rio JavaScript e um comentá rio final em HTML. Este é o método recomendado para
lidar com navegadores que nã o oferecem suporte ao elemento de script. Sem o comentá rio,
o navegador apenas renderizaria o có digo-fonte JavaScript na tela.
Este script define uma funçã o de adiçã o. Um alerta é executado que chama a funçã o
adicionar e envia os resultados para a funçã o de alerta. Observe que a chamada para a
funçã o de alerta nã o está dentro de uma funçã o; esta chamada está embutida. À medida que
este documento HTML está sendo carregado, o navegador alcança a chamada de alerta e,
por estar embutido, a chamada de alerta é executada imediatamente.
<script type = "text / javascript" src = "Scripts / tests.js"> </script> O atributo src faz
referência ao arquivo JavaScript externo. Quando o atributo src é incluído, o conteú do
do elemento < script > deve estar vazio. É importante usar uma tag final explícita
para evitar problemas em alguns navegadores.
Para arquivos JavaScript externos, os seguintes atributos também podem ser usados:
■■ adiar Um atributo booleano que especifica que o script é executado depois que a pá gina
termina de analisar.
Para grandes documentos HTML e grandes arquivos JavaScript, o resultado é que a pá gina
leva muito mais tempo para renderizar.
Além de colocar comentá rios HTML em torno dos blocos de script para evitar que o có digo-
fonte JavaScri pt seja renderizado na tela quando um navegador nã o suportar
o elemento < script >, você pode usar o elemento < noscript > para especificar o conteú do
alternativo a ser exibido. A seguir está um exemplo do elemento < noscript >:
<! -
retornar x + y;
101
// ->
</script>
Colocar seu JavaScript no arquivo HTML como có digo embutido é geralmente indesejá vel
porque limita a quantidade de reutilizaçã o que você pode obter do có digo. Seu objetivo
deve ser ter um JavaScript discreto - boa separaçã o de HTML e JavaScript, colocando-os
em arquivos separados.
Verificação rápida
■■ Você está criando uma página da web que exigirá muitos códigos JavaScript. É
melhor colocar todo o JavaScript em seu arquivo HTML ou colocá-lo em um arquivo
JavaScript separado?
Em muitos dos documentos HTML que você examinar, verá que os elementos < script > sã o
típicos dentro do elemento < head >, principalmente porque é onde todos foram instruídos
a colocá -los. O elemento < head > é para coisas que nã o deveriam ser mostradas na pá gina
renderizada, certo?
Coloque tags de script JavaScript no final do documento HTML, a menos que você tenha um
motivo convincente para nã o fazê-lo.
Uma razã o para colocar um elemento < script > no elemento < head > é que você pode ter
JavaScript que deve existir antes para que a pá gina possa ser renderizada
corretamente. Nesse caso, mova o mínimo possível para o elemento < head > para
minimizar o custo de desempenho. Além disso, coloque essas referências externas apó s as
referências da folha de estilo para que o navegador tente carregar as duas ao mesmo
tempo.
O Visual Studio 2012 oferece suporte à depuraçã o de JavaScript melhor do que qualquer
versã o anterior do Visual Studio. Esta seçã o apresenta a depuraçã o de JavaScript.
A liçã o anterior cobriu funçõ es aninhadas e o exemplo foi uma funçã o aninhada para
calcular a á rea de uma fatia de pizza. Se você conhece a fó rmula desse cá lculo, pode calcular
a á rea de uma pizza de 18 polegadas e dividir por 8 porque haverá oito peças por peça . A
fó rmula é areaPerPiece = (pi x ( pizzaRadius ) x ( pizzaRadius )) / piecesPerPizza . Para
obter o pizzaRadius , divida o pizzaDiameter (18 polegadas) por 2 para obter
um pizzaRadius de 9 polegadas.
});
Ao executar o teste, ele falhará com a mensagem 'areaOfPizzaSlice' indefinida , entã o você
adiciona o có digo areaOfPizzaSlice da seguinte forma:
}
}
Em seguida, execute o teste. Deve passar. Agora você tem algum có digo que pode percorrer
e depurar.
Você pode definir um ponto de interrupçã o em seu JavaScript clicando na linha de có digo e
pressionando F9 ou clicando em Depurar e escolhendo Alternar ponto de interrupçã o. Se
você definir um ponto de interrupçã o na segunda linha da funçã o areaOfPizzaSlice, deverá
ver um ponto cor de vinho à esquerda da linha, e toda ou parte da linha também será cor de
vinho, dependendo de onde o cursor estava quando você define o ponto de interrupçã o. A
Figura 3-12 mostra o có digo com o ponto de interrupçã o definido. Liçã o 2: Escrevendo,
testando e depurando JavaScrip t CAPÍTULO 3
103
também pode clicar na barra vertical cinza (onde o ponto de interrupçã o é mostrado na
Figura 3-12) para definir um ponto de interrupçã o.
Agora que você definiu um ponto de interrupçã o, se você pressionar F5 (Depurar | Iniciar
Depuraçã o) para executar o teste, deverá atingir o ponto de interrupçã o. Quando você
atinge o ponto de interrupçã o, o ponteiro do programa é exibido em amarelo nessa
linha. Agora que você está no modo de pausa, pode examinar as variá veis.
Examinando variáveis
Uma das maneiras mais fá ceis de examinar variá veis no modo de interrupçã o é apenas usar
o cursor do mouse para apontar para a variá vel. Isso faz com que uma dica de ferramenta
seja exibida com as informaçõ es variá veis, conforme mostrado na Figura 3-13.
FIGURA 3-13 No modo de pausa, apontando para uma variá vel para obter suas
informaçõ es Na figura, você pode ver que o diâ metro foi apontado e a dica de ferramenta
foi exibida, mostrando seu valor de 18. Se você apontar para slicePerPizza, veja uma dica de
ferramenta exibindo o valor 8.
Outra forma de explorar as variá veis é visualizar a janela Locals, que exibe todas as
variá veis que estã o no escopo, incluindo a variá vel especial this , que é o objeto atual.
FIGURA 3-14 A janela Locals exibindo todas as variá veis que estã o no escopo Conforme um
programa cresce, a janela Locals se enche de variá veis que podem nã o interessar a você,
mas você pode ver vá rias variá veis que deseja acompanhar. Na Figura 3-14, o Watch ta b
está no canto esquerdo inferior. Se você clicar nesta guia, verá a janela Watch. Esta janela
permite adicionar as variá veis de seu interesse. Você pode clicar na linha vazia, digitar o
nome da variá vel e pressionar Enter ou, na janela de có digo, destacar a variá vel
(normalmente y clicando duas vezes nela) e arrastá -la e soltá -la na janela Watch. A Figura
3-15 mostra o uso da janela Watch.
FIGURA 3-15 Usando a janela Watch para adicionar as variá veis de seu interesse Observe
na Figura 3-15 que o raio está listado como indefinido. Isso ocorre porque o programa nã o
atingiu a funçã o aninhada onde o raio é declarado e definido.
Percorrendo o código
Agora que você está no modo de interrupçã o, pode percorrer o có digo pressionando F11
(Depurar |
Step Into), F10 (Deb ug | Step Over) ou Shift + F11 (Debug | Step Out). Essas opçõ es
também estã o na barra de ferramentas. A linha de có digo atual retorna a á rea da fatia de
pizza se você pressionar F10
porque passar por cima significa que você deseja executar todo o có digo no status atual e,
em seguida, voltar ao modo de interrupçã o na pró xima instruçã o.
105
foi definido como 9 e, na janela Locals, radius está exibindo um valor de 9. A cor é
vermelha, o que indica que este valor mudou desde a ú ltima vez que você esteve no modo
de pausa.
Se você deslizar em 3.141592 * radius * radius e clicar com o botã o direito do mouse na
seleçã o, poderá adicionar Watch, que adiciona esta expressã o à janela Watch. Você também
pode adicionar Paral el Watch, que, em um aplicativo multithread, exibe a expressã o Watch
com seu valor para cada thread que possui um valor. A Figura 3-16 mostra a janela Paral el
Watch, que fica visível depois que você adiciona um reló gio paralelo.
FIGURA 3-16 A janela Paral el Watch mostrando o valor da expressã o para cada thread que
tem um valor
Na Figura 3-16, a janela é apresentada como uma grade na qual a primeira linha contém os
títulos das colunas e cada linha adicional representa um encadeamento com um valor. Cada
expressã o adicionada adicionará outra coluna à grade.
Ao clicar com o botã o direito do mouse na expressã o, você pode Fixar na origem, que fixa
uma dica de ferramenta na janela de origem que mostra o valor da expressã o, conforme
mostrado na Figura 3-17. Depois de fixar, você pode arrastar a dica de ferramenta para
qualquer lugar no editor de có digo, e o valor estará naquele local até que você clique no X
no canto superior esquerdo.
FIGURA 3-17 A opçã o Fixar na fonte que fixa uma dica de ferramenta ao có digo. Você pode
clicar no símbolo da divisa (símbolo inferior com v duplo) para adicionar um comentá rio a
essa expressã o também.
Wh en você está pronto para executar a aplicaçã o a toda a velocidade, você pode pressionar
F5 (Debug |
Continuar).
Resumo da lição
■■ TDD fornece uma ó tima maneira de escrever có digo e aprender sobre o có digo.
■■ QUnit pode ser usado para executar TDD com aplicativos da web.
■■ Ao criar testes, sempre crie um teste com falha primeiro e, em seguida, adicione o
có digo para fazer o teste passar.
■■ Sempre tente manter o có digo JavaScript separado do HTML.
■■ Você pode percorrer o có digo pressionando F11 (Depurar | Depurar), F10 (Depurar |
Passar por cima) ou Shift + F11 (Depurar | Sair).
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você está criando um novo aplicativo do Windows 8 e deseja configurar o TDD para o
seu có digo JavaScript. Qual estrutura de teste você usará ?
A. QUnit
B. QUnit-Metro
C. Teste Microsoft
D. NUnit
A. Escreva o teste de aprovaçã o, escreva o có digo, execute o teste novamente para validar
se ele ainda passa.
B. Escreva o teste com falha, escreva o có digo, execute o teste novamente para validar se
ele foi aprovado.
C. Escreva o có digo, escreva o teste para validar se ele passa, execute o teste novamente
para validar se ele ainda passa.
C. Você deve sempre colocar seu có digo JavaScript em arquivos separados, externos ao
seu documento HTM L.
Neste capítulo, você viu muitos fundamentos do JavaScript, mas alguns elementos nã o
foram discutidos. Você ainda precisa saber como acessar objetos existentes e como criar e
usar um array, que é um objeto JavaScript especial. Você também precisa saber como ser
notificado quando algo muda em um objeto. A criaçã o de seus pró prios objetos
personalizados é abordada no Capítulo 6,
Esta liçã o explica matrizes, o modelo de objeto de documento (DOM) e como você pode
acessar o DOM usando JavaScript. A liçã o continua descrevendo notificaçõ es de eventos,
que permitem que você se inscreva em eventos DOM.
Termos colchetes ([]). Como a coleçã o de itens está em uma variá vel, você pode facilmente
passar o array para uma funçã o. Você também pode percorrer os itens da matriz conforme
necessá rio.
Existem três maneiras de criar um array. Nã o importa o método que você escolher, embora
sua escolha típica y seja baseada na implementaçã o do array no programa:
Por exemplo, depois que a matriz é criada, seu tamanho é zero, portanto, zero é usado para
inserir o primeiro item. Usando este método, os itens podem ser adicionados em qualquer
lugar do programa. Observe que se você usar um nú mero de índice maior do que a
quantidade de itens que existem atualmente, você adiciona itens vazios ao array. Por
exemplo, se você atualmente tem apenas um item na matriz, mas especifica um nú mero de
índice de 2, você adicionará seu item com um nú mero de índice de 2 e um item vazio será
adicionado ao nú mero de índice 1. O seguinte é um exemplo de criaçã o da matriz e adiçã o
de itens:
■■ Matriz literal A matriz é criada fornecendo a lista de itens, entre colchetes. Isso é muito
semelhante ao array condensado ; apenas requer menos digitaçã o. A seguir está um
exemplo da matriz literal:
Você também usa o indexador quando deseja modificar os itens na matriz. Se você tentar
usar um nú mero maior do que a quantidade de itens na matriz, nenhuma exceçã o será
lançada. Em vez disso, o item é adicionado ao array e o tamanho do array aumenta para o
nú mero que você usou mais um. O exemplo a seguir modifica a cebola definindo seu valor
como queijo: pizzaParts [1] = 'queijo';
Cada parte dos objetos de dados que podem conter é chamada de propriedade . Algumas
propriedades sã o somente leitura, enquanto outras sã o legíveis e
gravá veis. O objeto Array tem uma propriedade que você usará Key
109
percorrendo os itens na matriz. O có digo de exemplo a seguir demonstra a propriedade
length:
Os objetos podem ter suas pró prias funçõ es ; cada funçã o de objeto é chamada
de método . O objeto Array tem os seguintes métodos ú teis:
Chave
Termos
■■ concat Une duas ou mais matrizes e retorna uma nova matriz com todos os itens,
conforme mostrado no exemplo a seguir:
■■ join Cria uma string a partir dos itens da matriz. Os itens sã o delimitados por vírgulas
por padrã o, mas você pode passar um separador alternativo. A partir da seguinte
cessioná rios uma cadeia que contém 'pepperoni, fiambre, bacon' para o meatParts variá vel:
■■ reverse Inverte a ordem dos itens em uma matriz e retorna uma referência (nã o uma
nova matriz) à matriz invertida, de forma que a matriz original seja modificada. O exemplo
a seguir inverte a oferta da matriz:
■■ slice Retorna uma nova matriz que representa parte da matriz existente. O método de
fatia tem dois parâ metros: início e fim . O parâ metro inicial é o índice do primeiro item a ser
incluído no resultado. O parâ metro final é o índice do item que você nã o deseja incluir no
resultado. No exemplo a seguir, a variá vel mySlice será atribuída
111
Verificação rápida
Ao construir um aplicativo, os objetos primá rios que você deve acessar sã o os objetos que
compõ em o DOM, que representa o documento HT ML. Você precisa acessar o DOM para
controlar o comportamento do seu documento HTML e ser notificado quando algo
acontecer na pá gina.
Navegando no DOM
Alguns dos métodos de pesquisa retornam um ú nico elemento, enquanto outros retornam
uma matriz de elementos. Os métodos que retornam um array ret urna ou um NodeList
vivo ou um NodeList estática .
Chave
Os termos mudam, enquanto o NodeList está tico representa um instantâ neo de elementos
que nã o muda conforme o DOM muda . De uma perspectiva de desempenho, leva mais
tempo para criar o está tico 112 CAPÍTULO 3 Introduçã o ao JavaScript
NodeList, entã o considere trabalhar com os métodos de pesquisa que retornam uma
NodeList ao vivo se você deseja o melhor desempenho. É importante entender essa
diferença porque ela pode afetar sua escolha do método de pesquisa.
A seguir está uma lista dos métodos de pesquisa DOM com uma breve descriçã o e exemplo:
seletor como seu parâ metro. Como o CSS é descrito em detalhes no Capítulo 4, este
exemplo é simplificado. O método querySelector retorna o primeiro elemento
correspondido se existir um para muitos ou nulo se nã o houver correspondência. Além de
ser compatível com o objeto de documento, o método querySelector existe no objeto
Element, portanto, você pode consultar todo o DOM ou apenas o conteú do de um
elemento. No exemplo a seguir, o símbolo de libra (#) indica uma pesquisa por um id. Este
exemplo retorna uma referência ao botã o cujo id é btnSave:
var btn = document.querySelector ('# btnSave');
seletor como seu parâ metro. Novamente, como o CSS é descrito em detalhes no Capítulo 4,
este exemplo é simplificado. O método querySelectorAll retorna um NodeList está tico de
todos os elementos que correspondem ou uma matriz vazia se nã o houver
correspondência. Além de ser compatível com o objeto de documento, o método
querySelector existe no objeto Element, portanto, você pode consultar todo o DOM ou
apenas o conteú do de um elemento. Na Liçã o 3: Trabalho com objec ts CAPÍTULO 3
113
a seguir o exemplo, o ponto (.) indica uma pesquisa por um nome de classe CSS. Este
exemplo retorna uma referência aos elementos cujo nome de classe CSS é pizzaPart: var
btn = document.querySelector ('. PizzaPart');
Para JavaScript, um evento ocorre mais comumente com a interaçã o do usuá rio, mas
também ocorre quando a chave
Quando um evento é disparado, um objeto Event é passado para a funçã o event h andler,
que fornece informaçõ es sobre o evento e o que estava acontecendo no momento, como a
localizaçã o do mouse para eventos relacionados ao mouse ou a tecla que foi pressionada
para eventos de teclado.
Quando um elemento filho é aninhado em um elemento pai e o elemento filho dispara um
evento click, o evento é passado para baixo na hierarquia DOM, começando do objeto de
documento, que é denotado na Figura 3-18 como #document. Isso é chamado de captura de
evento . Depois que o evento atinge o elemento que o acionou, o evento é passado de volta
para a hierarquia, cuja chave
Para se inscrever em um evento, você pode usar a funçã o addEventListener, que possui três
parâ metros. O primeiro parâ metro é o evento no qual você deseja se inscrever. O segundo
parâ metro é a funçã o que você deseja executar quando o evento for disparado. O
terceiro parâ metro é um valor booleano para especificar quando sua funçã o será
executada, onde true indica a execuçã o na captura de evento e false indica a execuçã o na
bolha de evento. Normalmente, é preferível definir esse parâ metro como falso. A seguir
está um exemplo de inscriçã o no evento click de um botã o cujo id é btnSave quando a
funçã o saveData é chamada durante o borbulhamento do evento click:
115
btn.onclick = saveData;
// salve os dados
e.stopPropagation ();
}
Neste exemplo, se qualquer funçã o de tratamento de evento de captura existisse, ela ainda
seria executada.
Quando o evento atinge o botã o, saveData usa o objeto Event passado para chamar a funçã o
stopPropagation. Nenhuma funçã o de manipulador de eventos de bolha será executada.
Quando você clica em uma caixa de seleçã o ou botã o de opçã o, eles possuem uma
funcionalidade incorporada para alterar sua aparência visual a ser selecionada ou
desmarcada. Quando você clica em um hiperlink, a funcionalidade interna navega para o
local href. Mesmo se você adicionar um evento de clique para esses objetos, eles ainda
fornecerã o seu comportamento padrã o. Para interromper o comportamento padrã o, você
pode chamar o método preventDefault no objeto Event , conforme mostrado no exemplo a
seguir, que interrompe a navegaçã o para o local href no hiperlink:
// salve os dados
e.preventDefault ();
Ao trabalhar com eventos, você frequentemente desejará acessar o objeto que causou o
evento. Além disso, você desejará acessar o objeto de forma genérica para que possa
chamar o mesmo có digo a partir do evento click de vá rios botõ es.
JavaScript fornece esta palavra - chave. A palavra - chave this faz referência ao objeto que
causou o evento. Mais explicitamente, a palavra - chave this fornece uma referência ao
proprietá rio da funçã o.
Chave
A variá vel de janela embutida é uma instâ ncia do objeto Window, que representa a janela
atual do navegador. O objeto Window possui os seguintes eventos, que podem ser
aplicados à tag < body > adicionando o prefixo “on”:
117
elementos:
alert (charStr);
Os eventos a seguir sã o acionados por um mouse ou açõ es do usuá rio semelhantes, e esses
eventos se aplicam a todos os elementos HTML5:
Os eventos a seguir sã o acionados por mídia, como vídeos, imagens e á udio. Esses eventos
se aplicam a todos os elementos HTML5, mas sã o mais comuns em elementos de mídia,
como < áudio >,
■■ erro Disparado quando ocorre um erro enquanto o arquivo está sendo carregado Liçã o
3: Trabalhando com objetos CAPÍTULO 3
119
■■ loadstart Disparado assim que o arquivo começa a carregar, antes que qualquer coisa
seja realmente carregada
■■ pause Disparado quando a mídia é pausada de forma programá tica ou pelo usuá rio
alerta ('Jogando');
Resumo da lição
■■ Um array é um objeto de coleçã o que possui uma sequência de itens que você pode
acessar e modificar. Você pode usar o indexador para acessar itens em uma matriz. Use o
comprimento propriedade y na matriz para recuperar o tamanho da matriz.
■■ Para adicionar uma inscriçã o de evento em um elemento HTML, adicione o prefixo “on”
ao nome do evento para obter o nome do atributo que você adicionará à tag inicial do
elemento.
Revisão da aula
1. Você tem duas matrizes de s trings, clientes e funcioná rios, e deseja combiná -los para
criar uma matriz de contatos. Qual método seria o mais adequado para essa tarefa?
A. concat
B. junte-se
C. push
D. splice
2. Você deseja obter uma lista de todos os elementos cujo nome de tag é div e precisa
recuperar essa lista o mais rá pido possível. Qual funçã o é mais apropriada para esta tarefa?
A. getElementsByName
B. querySelectorAl
C. getElementsByTagName
D. getElementsByC lass
Pratica exercícios
121
1. Se você nã o instalou o Visual Studio Express 2012 for Web, faça-o agora. Você pode fazer
o download no site da Microsoft.
6. Certifique-se de manter a caixa de seleçã o Criar diretó rio para soluçã o selecionada.
8. Na janela Solution Explorer, adicione uma pá gina inicial clicando com o botã o direito do
mouse no nó do projeto.
9. Na janela Solution Explorer, clique com o botã o direito do mouse no arquivo default.html
e escolha Definir como pá gina inicial.
12. Na janela Solution Explorer, adicione um arquivo JavaScript para o seu có digo clicando
com o botã o direito do mouse na pasta Scripts ; clique em Adicionar e escolha Arquivo
JavaScript. Defina o nome para CalculatorLibrary. js e clique em OK.
13. Para ver o que você tem até agora, pressione F5 para iniciar a depuraçã o do
aplicativo. Você deve ver uma tela branca com uma interface de calculadora rudimentar,
conforme mostrado na Figura 3-19.
Neste exercício, você continua com o projeto do Exercício 1 e adiciona a estrutura de teste
QUnit, que o ajudará no desenvolvimento de JavaScript para a calculadora.
2. Na janela Solution Explorer, adicione QUnit clicando com o botã o direito do mouse no nó
WebCalculator.
3. Na janela Solution Explorer, adicione um arquivo JavaScript para seus testes de
JavaScript clicando com o botã o direito na pasta Scripts. Clique em Adicionar e escolha
Arquivo JavaScript. Defina o nome como tests.js e clique em OK.
4. Na janela Solution Explorer, adicione uma pá gina de teste HTML clicando com o botã o
direito do mouse no nó do projeto WebCalculator. Clique em Adicionar e escolha Pá gina
HTML. Nomeie a pá gina CalculatorTests.html e clique em OK.
<head>
Exercícios de prá tica CAPÍTULO 3
123
<title> </title>
<link rel = "stylesheet" type = "text / css" href = "Content / qunit.css" />
</head>
<body>
<div id = "qunit-fixture">
</div>
</body>
</html>
7. Observe que o elemento < div > para o acessó rio QUint é um espaço reservado para a
marcaçã o HTML que você deseja acessar em seus testes, onde essa marcaçã o nã o deve ser
renderizada. Copie a marcaçã o HTML que está no arquivo default.html e cole no acessó rio
QUnit.
<title> </title>
<link rel = "stylesheet" type = "text / css" href = "Content / qunit.css" />
</script>
</head>
<body>
<div id = "qunit-fixture">
</div>
</body>
</html>
esperar (1);
resultado);
});
No exemplo de có digo anterior, uma variá vel txtInput está sendo referenciada, mas a
variá vel nã o foi declarada.
9. No arquivo CalculatorLibrary.js, adicione uma instruçã o que declare a variá vel e uma
funçã o de inicializaçã o que pode ser chamada quando cada teste é executado, mas será
chamada pela pá gina .html padrã o quando executar o có digo concluído.
10. Na funçã o de inicializaçã o, adicione uma instruçã o que localize a caixa de texto txtInput
e atribua o resultado à variá vel txtInput . Seu có digo deve ser semelhante ao seguinte: var
t xtInput;
function initialize () {
Você deve modificar o arquivo tests.js para chamar a funçã o de inicializaçã o como parte de
uma funçã o de configuraçã o que será executada antes de cada funçã o de teste. Faça isso
definindo um mó dulo no topo dos testes.
11. Adicione o seguinte có digo ao topo do arquivo tests.js: module ('Calculator Test Suite',
{setup: function () {initialize ();}}); O primeiro parâ metro da definiçã o do mó dulo é o nome
do mó dulo. O segundo parâ metro define um objeto que possui uma propriedade de
configuraçã o. A propriedade setup é atribuída a uma expressã o de funçã o que chama a
funçã o de inicializaçã o antes de cada teste.
125
12. Pressione F5 para executar o teste, que deve falhar, conforme mostrado na Figura 3-20,
porque você ainda nã o tem nenhum có digo. Observe que a falha indica que "5" era
esperado, mas o real era
“”.
FIGURA 3-20 O teste QUnit falhou porque nenhum có digo foi adicionado ainda 13. No
arquivo CalculatorLibrary.js, adicione uma funçã o numberClick que lê a propriedade
innerText ( conteú do textual do elemento) do botã o que foi clicado e anexa o innerText
propriedade para o valor da caixa de texto txtInput .
No entanto, se txtInput tiver um valor zero, você deve substituir seu valor pelo novo valor
para nã o ficar com zeros à esquerda na caixa de texto. Seu có digo deve ser parecido com o
seguinte:
function numberClick () {
Lembre-se de que você está anexando a txtInput , portanto, você precisa testar o ú ltimo
caractere para ver se obteve o resultado correto. Você também deve adicionar uma
declaraçã o ao comprimento da string conforme anexa a txtInput . Nã o se esqueça de que
você adicionou o có digo a numberClick para remover os zeros à esquerda, e este loop
começa acionando btn0, portanto, sua afirmaçã o sobre o comprimento deve levar isso em
consideraçã o. Seu teste deve ser parecido com o seguinte:
});
127
Você deve adicionar o có digo para se inscrever no evento de clique dos botõ es numéricos.
18. Corrija os testes com falha adicionando có digo de loop à funçã o de inicializaçã o que
assina o evento de clique de todos os dez botõ es de nú mero.
numberClick, false);
20. No arquivo tests.js, adicione um novo teste para verificar btnPlus quando for clicado.
esperar (1);
txtInput.value = '10';
txtResult.value = '20';
});
22. Na funçã o de inicializaçã o, adicione o có digo para obter uma referência à caixa de
texto txtResult e atribua-o a uma nova variá vel txtResult global . Adicione o có digo na
funçã o de inicializaçã o para assinar btnPlus e chamar a funçã o plusClick. Adicione a funçã o
plusClick com o có digo para adicionar txtInput a txtResult .
var txtInput;
var txtResult;
function initialize () {
numberClick, false);
document.getElementById ('btnPlus ')
function plusClick () {
24. No arquivo tests.js, adicione um novo teste para verificar btnMinus quando for clicado.
esperar (1);
txtInput.value = '10';
txtResult.value = '20';
});
function initialize () {
numberClick, false);
document.getElementById ('btnPlus')
document.getElementById ('btnMinus')
function minusClick () {
28. No arquivo tests.js, adicione um novo teste para verificar btnClearEntry quando for
clicado.
esperar (1);
129
txtInput.value = '10';
});
function initialize () {
document.getElementById ('btnPlus')
document.getElementById ('btnClearEntry')
function clearEntry () {
txtInput.value = '0';
32. No arquivo tests.js, adicione um novo teste para verificar btnClear quando for clicado.
esperar (2);
txtInput.value = '10';
txtResult.value = '20';
});
33. Pressione F5 para executar o teste e verifique se ele falhou porque você nã o se
inscreveu no evento click de btnClear.
34. Na funçã o de inicializaçã o, adicione o có digo para assinar btnClear e chame a funçã o
limpar.
function initialize () {
document.getElementById ('btn' + i)
document.getElementById ('btnPlus')
document.getElementById ('btnMinus')
document.getElementById ('btnClearEnt ry')
document.getElementById ('btnClear')
function clear () {
txtInput.value = '0';
txtResult.value = '0';
esperar (2);
txtInput.value = '10';
txtResult.value = '20';
esperado = '0';
});
esperar (2);
txtInput.value = '10';
txtResult.value = '20';
131
esperado = '0';
});
Observe que, nesses testes , a chamada da funçã o expect recebe um valor de dois porque
agora você tem duas asserçõ es.
function plusClick () {
function minusClick () {
esperar (2);
txtInput.value = '';
txtResult.value = '';
});
42. Na parte inferior da funçã o de inicializaçã o, adicione uma chamada à funçã o limpar
para inicializar txtInput e txtResult .
function initialize () {
document.getElementById ('btn' + i)
document.getElementById ('btnPlus')
document.getElementById ('btnMinus')
document.getElementById ('btnClearEntry')
Agora que todos os testes foram aprovados, você está quase pronto para executar o
aplicativo, mas precisa adicionar o có digo ao arquivo default.html para chamar a funçã o de
inicializaçã o quando a pá gina for carregada.
</script>
46. Pressione F5 para iniciar a depuraçã o. Tente clicar nos botõ es numéricos para inserir
um nú mero e tente os botõ es mais e menos, enquanto observa os resultados. Tente clicar
no botã o limpar entrada depois de inserir um nú mero. T ry clicando no botã o claro, para
ver a entrada e resultado claro.
Exercícios de prática sugeridos
Os exercícios adicionais a seguir foram elaborados para dar a você mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com êxito as liçõ es apresentadas neste
capítulo.
■■ Exercício 2 Aprenda mais sobre QUnit e TDD adicionando mais testes e, em seguida,
adicione o có digo para fazer os testes passarem.
133
Respostas
Lição 1
1. Resposta correta: C
A. Incorreto: O valor indefinido significa que a variá vel nunca foi inicializada.
B. Incorreto: O valor nulo significa que a variá vel foi explicitamente configurada para nã o
ter valor.
2. Respostas corretas: B, C, D e F
A. Incorreto: você nã o pode usar uma palavra-chave JavaScript para um nome de variá vel
e switch é uma palavra-chave ript JavaSc.
F. Correto: Os nomes das variá veis podem conter nú meros, mas nã o podem começar com
um nú mero.
3. Resposta correta: B
B. Correto: O uso de || faz com que Usuá rio vá lido seja exibido se userName nã o tiver
valor.
D. Incorreto: O uso de + faz com que o Usuá rio Vá lido seja exibido se userName nã o tiver
valor, mas também exibe o userName e o Usuá rio Vá lido juntos quando o userName tem
um valor.
Lição 2
1. Resposta correta: B
2. Resposta correta: B
A. Incorreto: você precisa escrever um teste com falha primeiro, para que possa ver a
aprovaçã o no teste depois de escrever o có digo.
B. Correto: você escreve um teste com falha e, em seguida, escreve o có digo que faz o teste
passar; em seguida, execute o teste novamente para validar se ele foi aprovado.
C. Incorreto: você nunca deve escrever có digo sem antes escrever um teste que falhe.
D. incorreto: I f você escreve um teste passando em primeiro lugar, o có digo nã o pode ser
testado para o sucesso.
3. Resposta correta: C
Lição 3
1. Resposta correta: A
2. Resposta correta: C
Respostas CAPÍTULO 3
135
C APÍTULO 4
CSS oferece muito mais opçõ es para renderizar um documento do que estã o disponíveis se
você apenas usar HTML para fornecer formataçã o, e CSS é compacto e rá pido. CSS também
simplifica as atualizaçõ es do site, para que você possa modificar os estilos para alterar
completamente a aparência de todos os documentos HTML em seu aplicativo da web ou do
Windows 8.
Este capítulo apresenta brevemente a histó ria do CSS e, a seguir, discute os seletores e as
propriedades CSS em profundidade.
Para concluir este capítulo, você deve ter algum conhecimento de desenvolvimento
web. Este capítulo requer o hardware e o software listados na seçã o “Requisitos do
sistema” na Introduçã o do livro.
137
o W3C começou a trabalhar em vá rios mó dulos de CSS Nível 3 (CSS3). Em vez de criar uma
grande publicaçã o para CSS3, o W3C separou CSS3 em mó dulos que poderiam ser
publicados independentemente.
Em 2005, o W3C se tornou mais rígido com a aplicaçã o dos requisitos de padrõ es e padrõ es
já publicados, como CSS Nível 2 Revisã o 1 (CSS 2.1), Seletores CSS3 e CSS3
O texto foi puxado de volta do nível de Recomendaçã o do Candidato para o nível de Projeto
de Trabalho. Nã o foi até junho de 2011 que a recomendaçã o CSS 2.1 foi publicada.
O CSS 2.1 está incluído no CSS3 porque o CSS3 está sendo projetado para ser compatível
com a recomendaçã o do CSS 2.1. Este capítulo apresenta o CSS3, cobrindo muitos aspectos
do CSS 2.1.
Você pode criar um estilo e aplicá -lo a muitos elementos com base em um seletor. Você usa
um seletor para localizar e selecionar elementos com base no nome da tag, nome da classe,
ID e muito mais. Você pode digitar
Os termos criam um estilo que funciona com imagens e você pode criar um estilo que
funciona apenas com hiperlinks. Você também pode criar um estilo nomeado que pode ser
aplicado a qualquer elemento. A reutilizaçã o é poderosa.
Os termos podem ler vá rias folhas de estilo para uma pá gina HTML, em que cada folha de
estilo pode ter regras de estilo que afetam o estilo efetivo do elemento. À medida que cada
estilo é lido, ele modifica o estilo efetivo do elemento. As configuraçõ es de estilo aplicadas a
partir de uma folha de estilo podem ser substituídas por
estilos avaliados posteriormente . O estilo efetivo cai em cascata de uma folha de estilo para
a pró xima, possivelmente sendo sobrescrito ao longo do caminho. O cascateamento é
explicado com mais detalhes na Liçã o 2, “Compreendendo os seletores, a especificidade e o
cascateamento”.
Instruçõ es de termos (declaraçõ es). Vá rias declaraçõ es sã o sempre separadas por ponto e
vírgula. Uma declaraçã o compreende uma propriedade CSS, seguida por dois pontos,
seguida por um valor. A seguir está um exemplo de regra de estilo que localiza
o elemento < body > e define a cor do plano de fundo como branco e a cor da fonte como
cinza.
corpo {
cor: cinza;
}
Neste exemplo, o seletor é o corpo e o bloco de declaraçã o está contido entre as
chaves. Existem duas declaraçõ es, cada uma terminada com um ponto e vírgula. A primeira
declaraçã o especifica a propriedade CSS background-color seguida por um separador de
dois pontos e o valor da propriedade white .
Os seletores podem ser muito mais complexos e os blocos de declaraçã o podem conter
muito mais declaraçõ es, como você verá posteriormente neste capítulo.
Você pode adicionar comentá rios em uma folha de estilo usando os caracteres / * para
iniciar o comentá rio e os caracteres * / para encerrar o comentá rio. Os comentá rios
também podem abranger vá rias linhas, conforme mostrado no exemplo a seguir.
/ * Este é o estilo
para o elemento corporal * /
corpo {
139
Todos os elementos têm um estilo denominado de atributo global que pode ser usado para
fornecer um estilo embutido .
Como um estilo embutido é definido no elemento ao qual deseja adicionar estilo, você nã o
Os termos precisam de um seletor; você só precisa especificar o bloco de declaraçã o . A
seguir está um exemplo de um estilo embutido no elemento < body > que define a cor do
plano de fundo como branco e a cor da fonte como cinza.
</body>
Uma vantagem de usar um estilo embutido é que ele sempre substitui os estilos definidos
em outro local, porque os estilos embutidos sã o específicos ao elemento no qual o estilo
embutido está definido.
Em vez de criar estilos embutidos usando o atributo de estilo global, você pode usar
o elemento < style > para criar uma folha de estilo incorporada em seu documento
HTML. Você deve usar CSS
<head>
<title> </title>
<style>
corpo {
</style>
</head>
<body>
</body>
</html>
<head>
<title> </title>
<link rel = 'stylesheet' type = 'text / css' href = 'Content / default.css' />
</head>
<body>
</body>
</html>
corpo {
cor: cinza;
Um arquivo de estilo pode ter quantas regras de estilo você precisar. Usar uma folha de
estilo externa é considerada a melhor maneira de implementar seus estilos. Você também
pode vincular muitas folhas de estilo externas a um documento HTML. Por exemplo, sua
empresa pode criar uma folha de estilo corporativa que espera ser usada em todos os sites
expostos ao pú blico. Além de usar a folha de estilo corporativa, você também pode criar sua
pró pria folha de estilo para atender à s necessidades específicas nas quais seu
departamento está trabalhando. Em suas pá ginas da web, você pode adicionar
um elemento < link > para cada folha de estilo.
141
o rende ring de um documento HTML. A seguir está uma lista dos tipos de mídia
disponíveis para uso.
■■ portátil Processa de mã o dispositivos portá teis que y típicos têm Smal, telas de baixa
resoluçã o e de largura de banda limitada
■■ tty processa a mídia, usando uma grade de caracteres de pitch fixo, como teletipos,
terminais e dispositivos portá teis com recursos de exibiçã o limitados
■■ tv Renderiza para dispositivos do tipo televisã o que normalmente têm cores de baixa
resoluçã o ou telas com capacidade limitada de rolar e ter som
<head>
<title> </title>
<link rel = 'stylesheet' type = 'text / css' href = 'Content / screen.css' media =
'screen' />
<link rel = 'stylesheet' type = 'text / css' href = 'Content / printer.css' media =
'print' />
</head>
<body>
</body>
</html>
Você pode especificar um arquivo CSS aplicá vel a vá rios tipos de dispositivos, separando
cada tipo de dispositivo entre aspas por vírgula.
Verificação rápida
■■ Você deseja fornecer um arquivo de folha de estilo separado para estilos que
serão usados quando uma página da web for renderizada para a
impressora. Qual configuração de atributo de mídia deve ser definida com
o elemento < link >?
■■ media = 'imprimir'
@charset 'UTF-8';
corpo {
cor: cinza;
<head>
<title> </title>
<meta http-equiv = 'Content-Type' content = 'text / html; charset = UTF-8'>
<link rel = 'stylesheet' type = 'text / css' href = 'Content / default.css' />
</head>
<body>
</body>
</html>
Conforme sua folha de estilo cresce, você vai querer dividi-la em arquivos menores e mais
gerenciá veis. O
A regra @import permite importar um arquivo CSS para a folha de estilo atual. Você pode
especificar quantas regras @import forem necessá rias, mas as regras @import devem estar
no topo de sua folha de estilo, antes de qualquer outro conteú do, exceto a regra
@charset. Se você tiver um comentá rio acima das regras do @import, elas nã o funcionarã o
corretamente.
@charset 'UTF-8';
corpo {
143
Você ainda pode ter conteú do no arquivo CSS, conforme mostrado no exemplo, mas deve
seguir os
regras @import. Você também pode especificar o tipo de mídia para cada regra @import,
conforme mostrado no exemplo a seguir que especifica os tipos de tela e impressã o.
@charset 'UTF-8 ';
corpo {
co lor: cinza;
Observe que a regra @import para o arquivo mainContent.css nã o contém o tipo de mídia,
o que significa que o tipo de mídia padrã o de todos é aplicá vel e esse arquivo CSS será
usado para a tela e a impressora.
Você pode querer usar uma fonte específica, mas sabe que muitos usuá rios nã o terã o essa
fonte em seus computadores. Para resolver esse problema, você pode fornecer um link
para a fonte para que ela possa ser baixada e usada em sua folha de estilo. A seguir está um
exemplo de especificaçã o do
regra @ font-face para definir a fonte myFont, que será carregada de um arquivo no site
atual, Fancy_Light.ttf ou Fancy_Light.eot.
@Tipo de letra {
A partir do Internet Explorer 9, foi adicionado suporte apenas para arquivos Embedded
Open Type (.eot), que a Microsoft desenvolveu para uso na web. Esses arquivos de fonte
podem ser criados a partir de arquivos de fonte TrueType existentes usando a ferramenta
Microsoft Web Embedding Fonts (W EFT). Firefox, Chrome, Safari e Opera suportam
arquivos True Type Files ( .ttf ), entã o você deve especificar os dois tipos de arquivo para
serem compatíveis com a maioria dos navegadores.
LICENCIAMENTO DE FONTE DE NOTA
Resumo da lição
■■ Para manter a separaçã o entre estrutura e apresentaçã o, use folhas de estilo externas.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você deseja adicionar um comentá rio à sua folha de estilo que diz "temporá rio". Qual é a
linha apropriada para adicionar ao arquivo CSS?
B. --temporá ria
2. Você deseja manter a separaçã o entre estrutura e apresentaçã o. Como você cria suas
regras de estilo?
A. <link rel = 'printer' type = 'text / css' href = 'Content / printer.css' /> B. <link rel =
'stylesheet' type = 'text / css' href = 'Conteú do / impressora. css 'media =' imprimir
'/> C. <link rel =' stylesheet 'type =' text / css 'href =' Content / printer.css '/> D. <link rel ='
stylesheet 'type =' text / css 'href =' Content / printer.css 'target =' print '/> Lição 2:
Noções básicas sobre seletores, especificidade e
cascateando
Esta liçã o cobre as partes mais importantes do CSS, começando com os seletores, que
conectam a regra de estilo ao seu HTML. Esta liçã o discute algumas das maneiras pelas
quais você pode acabar com vá rias regras de estilo para o mesmo HTML e como determinar
qual seletor é mais específico.
Definindo seletores
Termos: o que aconteceria se o seletor fosse definido como botã o, conforme mostrado no
exemplo a seguir?
botã o {
cor: cinza;
Se o seu documento HTML contiver 50 botõ es, o estilo de todos os 50 botõ es será
definido. Isso é desejá vel em alguns cená rios, mas em outros, você pode querer definir o
estilo em um ú nico botã o ou em um subconjunto de botõ es.
Criação de um seletor de id
#btnSave {
cor: cinza;
Neste exemplo, nã o importa qual tipo de elemento está sendo acessado; tudo o que importa
é que o id seja btnSave. Como o id deve ser ú nico no documento HTML, o uso dessa
abordagem para definir um estilo limita a capacidade de reutilizaçã o em uma pá gina, mas
entre as pá ginas da web, isso define o estilo de qualquer elemento cujo id é btnSave.
Um seletor de classe é um estilo com um nome de classe de sua escolha, prefixado com
o símbolo de ponto (.).
Isso também é chamado de estilo nomeado . O nome da classe pode ser atribuído a qualquer
elemento através da chave
Atributo de classe de termos. No exemplo a seguir, um estilo é criado com o nome de classe
myStyle.
.meu estilo {
Este estilo nã o se aplica a nenhum elemento até que você especifique o nome da classe
usando o atributo class, conforme mostrado no exemplo a seguir.
<head>
<title> </title>
<link rel = 'stylesheet' type = 'te xt / css' href = 'Content / default.css' />
</head>
<body>
</body>
</html>
Neste exemplo, o atributo class especifica o estilo myStyle na caixa de texto e dois dos
botõ es. Os estilos nomeados promovem a reutilizaçã o porque podem ser usados em
qualquer elemento, conforme necessá rio.
Usando o seletor universal
Se você deseja aplicar um estilo a cada elemento, pode usar o símbolo de asterisco (*). O
exemplo a seguir aplica o estilo a todos os elementos do documento HTML.
*{
cor: cinza;
Você deve evitar usar o seletor universal por causa do custo de desempenho.
Você pode querer alterar o estilo dos elementos apenas se os elementos forem
descendentes de outro elemento. Por exemplo, você pode querer remover o und erline dos
hiperlinks se eles forem apresentados em um item da lista. Isso pode ser feito especificando
uma cadeia de seletores , que é um grupo de seletores que especificam um caminho para os
elementos de seu interesse. A chave da corrente seletora
li a {
147
removido de um hiperlink se tiver um ancestral que é um item da lista , o item da lista
possui um ancestral que é uma lista ordenada e a lista ordenada tem um ancestral que é
uma divisã o.
div ol li a {
Você pode querer alterar o estilo dos elementos apenas se os elementos forem filhos
diretos de outro elemento. Por exemplo, você pode querer remover o sublinhado dos
hiperlinks se eles forem filhos de um item da lista. Você pode fazer isso especificando um
elemento pai, seguido por um símbolo de maior que (>) e, em seguida, especificando o
elemento filho, conforme mostrado no exemplo a seguir.
li> a {
Para acessar informaçõ es que estã o fora da á rvore DOM ou difíceis de acessar no DOM
Os termos da regra sã o: primeiro filho, que pode ser deduzido da á rvore DOM, e: lang (),
que à s vezes pode ser deduzido da á rvore DOM. Você pode usar as pseudo classes em
qualquer lugar da sua cadeia de seletores para ajudá -lo a localizar os elementos quando o
estado identificado for verdadeiro. Você também pode usar 148 CAPÍTULO 4 Primeiros
passos com CSS3
pseudo classes no final da cadeia de seletores para definir o estilo do elemento quando o
estado identificado for verdadeiro. A seguir está uma lista de pseudo classes.
■■ : link Indica um link nã o visitado, onde a: link seleciona todos os links nã o visitados.
■■ : visitado Denota os links visitados onde a: visitado seleciona todos os links visitados.
■■ : ativo Indica um link ativo quando ativo significa que o botã o do mouse é pressionado e
a: ativo seleciona todos os links ativos.
■■ : hover Indica um link sobre o qual o cursor do mouse está quando um: hover seleciona
o link sobre o qual o mouse está .
■■ : focus Denota um elemento que tem foco quando a entrada: focus seleciona a entrada
que tem foco.
■■ : lang (idioma) Indica um elemento cujo atributo lang é definido como idioma quando
p: lang (en) seleciona todos os pará grafos e o atributo lang começa com en.
■■ : not Fornece negaçã o quando div: not (“# mainContainer”) seleciona todos
os elementos < div > exceto o elemento < div > cujo id é mainContainer.
■■ : enésimo-criança (fórmula) Selecciona o n th filho de um progenitor se a fó rmula é
um valor inteiro. Por exemplo, li: nthchild (3) seleciona o terceiro item da lista. Observe
que o nú mero é baseado em um, nã o baseado em zero. Esta pseudo classe é poderosa.
Você pode fornecer uma fó rmula baseada em um + b quando um é contagem de ciclo e n é
uma variá vel de contador, e b representa o elemento dentro do ciclo que você deseja
selecionar. Por exemplo, li: nthchild (10n + 3) seleciona o terceiro elemento de cada
10 elementos, portanto, se um
Por exemplo, li: nth-child (ímpar) seleciona os elementos 1, 3, 5, 7 e assim por diante.
Por exemplo, li: nth-last-child (3) seleciona o terceiro item da lista no final da lista. Observe
que o nú mero é baseado em um, nã o baseado em zero.
149
■■ :: primeira letra Seleciona a primeira letra, onde p: primeira letra seleciona a primeira
letra de cada pará grafo. Você pode aplicar um estilo diferente à primeira letra de um
pará grafo. Esta opçã o é ú til quando você deseja criar uma primeira letra grande.
■■ :: before Insere o conteú do textual gerado dentro do elemento onde p: before {content:
“Nota:“; } insere “Nota:“ em cada pará grafo diretamente antes do conteú do existente. Além
de adicionar o conteú do textual , você pode fornecer um estilo para o conteú do quando p:
antes de {conteú do: “Nota:“; color: red;} define a cor de “Nota:”
para o vermelho.
■■ :: after Insere o conteú do textual gerado dentro de cada elemento quando p: apó s
{content:
O CSS3 recomenda um dois pontos (:) antes das pseudo classes e dois dois pontos (:)
antes dos pseudo elementos como uma forma de saber a diferença entre os dois. O
CSS3 também permite que o uso de um vírgula em regras existentes seja compatível
com os navegadores existentes, então a maioria das pessoas continuará a usar um
vírgula para ser compatível com os navegadores mais antigos. Todos os novos
pseudo- elementos devem ter dois pontos.
Seletores de agrupamento
Você pode agrupar seletores quando for aplicar o mesmo estilo, separando cada seletor
com uma vírgula. Considere o exemplo a seguir, no qual as duas regras de estilo têm os
mesmos blocos de declaraçã o.
botã o {
cor: cinza;
p{
cor de fundo: branco;
cor: cinza;
Nesse cená rio, você pode condensar as duas regras de estilo em uma ú nica regra de estilo,
conforme mostrado no exemplo a seguir, que aplica o mesmo estilo a todos os botõ es e
elementos de pará grafo.
botã o, p {
cor: cinza;
Um seletor adjacente pode ser usado para selecionar um elemento se for precedido por um
elemento específico.
O sinal de mais (+) indica um seletor adjacente. Por exemplo, div + h1 seleciona a < h1 >
ele-Key
No exemplo a seguir, div + h1 definirá o título para uma cor de fundo amarela se o título for
precedido por um elemento < div > como o irmã o anterior.
div + h1 {
}
Considere o seguinte documento HTML, que tem dois elementos < div > e vá rios elementos
< h1 >.
<head>
<title> </title>
</head>
<body>
</h1>
<div>
</h1>
</h1>
</h1>
</div>
algum conteú do seguinte
</h1>
</h1>
</body>
</html>
151
fundo para amarelo. O segundo elemento < div > é seguido por algum conteú do textual, mas
o primeiro elemento que segue o segundo elemento < div > é um elemento < h1 > , de modo
que o elemento < h1 > terá um fundo amarelo. O resultado é mostrado na Figura 4-1.
FIGURA 4-1 Apenas uma cor de fundo do elemento < h1 > definida para amarelo usando o
seletor irmão subsequente
O seletor de irmãos subsequente é semelhante ao seletor de irmã os adjace nt, mas sua busca
pelo irmã o correspondente nã o para na primeira correspondência. O caractere til (~)
denota o seletor irmã o. Por exemplo, div ~ h1 seleciona todos os elementos < h1 > que
seguem um elemento < div >.
No exemplo a seguir, div ~ h1 define o título com uma cor de fundo amarela se o título for
precedido por um elemento < div > como um irmã o anterior.
div ~ h1 {
Considere o documento HTML fol devido que tem é de três < uma > elementos, dois dos
quais d efine o atributo href.
<head>
<title> </title>
</head>
<body>
153
</body>
</html>
Os primeiros e terceiros < um > elementos definir o atributo href, o que significa que paira
sobre qualquer uma destas causas da hiperligaçã o para ser exibido. O resultado é mostrado
na Figura 4-3.
FIGURA 4-3 Passando o mouse sobre um link cujo atributo href está definido, fazendo
com que o valor href seja exibido usando um seletor de valor de atributo
O exemplo a seguir demonstra o uso do seletor de valor de atributo para localizar todos os
hiperlinks que têm o atributo href definido como http://contoso.com. Este exemplo
também demonstra a combinaçã o do seletor de atributos com a pseudo classe: hover.
Considere o documento HTML fol devido, que tem três < uma > elementos, um dos quais
tem o atributo href conjunto para http: // cont oso.com.
<head>
<title> </title>
</head>
</body>
</html>
A primeira < um > elemento define o atributo href para http://contoso.com, de modo que
paira sobre este link faz com que o link a ser exibido com um fundo ow yel, como mostrado
na Figura 4-4.
Um problema potencial com essa abordagem é que o valor deve corresponder exatamente
para funcionar. Para resolver esse problema, use o seletor de valor contém o atributo.
O exemplo a seguir demonstra o uso do seletor de valor contém o atributo para localizar
todos os hiperlinks que têm um valor de atributo href que contém contoso.com. Este
exemplo também demonstra a combinaçã o do seletor de atributo com a pseudo classe:
hover.
155
Considere o documento HTML fol devido, que tem três < uma > elementos, um dos quais
define o atributo href para http://contoso.com.
<head>
<title> </title>
</head>
<body>
</body>
</html>
O primeiro e o terceiro hiperlinks têm atributos href que contêm contoso.com, portanto,
passar o mouse sobre esses hiperlinks faz com que o hiperlink seja exibido com um fundo
amarelo.
O exemplo a seguir demonstra o uso do atributo valor começa com seletor para localizar
todos os hiperlinks que fazem referência a sites externos procurando por valores href que
começam com http. Isso inclui automaticamente hrefs que começam com https.
}
Considere o fo documento HTML l devido que tem três < uma > elementos, um dos quais
define o atributo href para http://microsoft.com.
<head>
<title> </title>
</head>
<body>
</body>
</html>
O primeiro e o terceiro hiperlinks têm atributos href que nã o começam com http, portanto,
passar o mouse sobre esses hiperlinks nã o faz com que o hiperlink seja exibido com um
fundo amarelo. Passar o mouse sobre o segundo hiperlink faz com que ele seja exibido com
um fundo amarelo.
O exemplo a seguir demonstra o uso do valor do atributo termina com seletor para
localizar todos os hiperlinks que fazem referência a arquivos jpg.
}
Considere o seguinte documento HTML que possui três elementos <a>, um dos quais define
o atributo href como http://microsoft.com.
<head>
<title> </title>
</head>
<body>
</body>
</html>
O primeiro e o terceiro hiperlinks têm atributos href que nã o terminam em jpg, portanto,
passar o mouse sobre esses hiperlinks nã o faz com que o hiperlink seja exibido com um
fundo amarelo. Passar o mouse sobre o segundo hiperlink faz com que ele seja exibido com
um fundo amarelo.
a [data-linktype ~ = 'externalLink'] {
cor de fundo: amarelo;
a [data-linkty pe ~ = 'internalLink'] {
157
}}
Considere o documento HTML fol devido que tem três < uma > elementos onde há uma
mistura de valores e os estilos adequados devem ser aplicadas com base no atributo
datalinktype.
<head>
<title> </title>
</head>
<body>
</body>
</html>
O primeiro e o terceiro hiperlinks sã o links externos, portanto, eles têm uma cor de fundo
amarela.
O segundo hiperlink é um link interno, portanto, tem uma cor de fundo de limã o. O
primeiro e o segundo hiperlinks sã o links para arquivos zip, portanto, '(zip)' é anexado ao
conteú do. O terceiro hiperlink é um link para uma imagem, portanto, '(img)' é anexado ao
conteú do. O documento HTML renderizado é mostrado na Figura 4-5.
FIGURA 4-5 O documento HTML renderizado mostrando os diferentes estilos com base na
correspondência com um item no atributo datalinktype
Mesmo se você nã o definir nenhum estilo para seus documentos HTML, pelo menos uma
folha de estilo será usada para calcular o estilo efetivo para os elementos dentro do
documento. Cada navegador possui uma folha de estilo padrã o embutida, que é aplicada a
todos os documentos HTML antes que qualquer outra folha de estilo seja aplicada.
Você nã o pode acessar a folha de estilo do navegador diretamente e esteja ciente de que
pode haver diferenças entre os navegadores.
Você pode estender os estilos do navegador adicionando uma folha de estilo definida pelo
usuá rio ao navegador.
Isso é feito de forma diferente com base no navegador. Para adicionar uma folha de estilo
definida pelo usuá rio no Internet Explorer, navegue até Ferramentas | Opçõ es da Internet
| Geral | Acessibilidade. A janela Acessibilidade é exibida, conforme mostrado na Figura 4-6.
FIGURA 4-6 A folha de estilo do usuá rio se definida para o arquivo myUser.css Os estilos
do usuá rio sã o aplicá veis apenas a esse navegador naquele computador, portanto, se você
iniciar um navegador diferente no mesmo computador, sua folha de estilo definida pelo
usuá rio nã o funcionará . Além disso, se você executar o mesmo navegador em um
computador diferente, sua folha de estilo definida pelo usuá rio nã o funcionará .
Quando você adiciona estilos a uma folha de estilo definida pelo usuá rio, os estilos típicos y
nã o funcionam porque os estilos definidos pelo usuá rio sã o lidos e, em seguida, os estilos
do documento HTML sã o lidos. Se o navegador tiver uma configuraçã o de regra de estilo da
folha de estilo definida pelo usuá rio e, em seguida , a folha de estilo do documento HTML lê
uma configuraçã o de regra de estilo diferente, o estilo definido pelo usuá rio é substituído
pela folha de estilo do documento HTML. No exemplo, o problema é que o usuá rio pode ter
dificuldade em ler o texto da pá gina da web e deseja aumentar o tamanho da tela em todas
as pá ginas da web.
159
Para resolver esse problema, na folha de estilo definida pelo usuá rio, você pode adicionar o
modificador “! Important” apó s o valor CSS para aumentar sua prioridade. O modificador “!
Importante” na folha de estilo definida pelo usuá rio substitui qualquer valor da folha de
estilo do documento HTML, mesmo se o modificador “! Important” for usado na folha de
estilo do documento HTML. Este é o uso mais apropriado do modificador “! Important”.
A seguir está um exemplo de um arquivo CSS definido pelo usuá rio que substitui a cor de
fundo e a cor do texto do elemento do corpo.
@charset 'UTF-8';
corpo {
Lembre-se de que as configuraçõ es da folha de estilo definidas pelo usuá rio têm uma
prioridade menor do que a
A seguir está a ordem de precedência que o navegador usa para calcular o estilo efetivo de
um elemento.
As regras de estilo podem ser definidas em vá rias folhas de estilo e é importante entender
essas folhas de estilo, especialmente sua relaçã o com a ordem textual. A lista a seguir
descreve a ordem de avaliaçã o das vá rias folhas de estilo.
O autor da pá gina pode fornecer declaraçõ es de estilo normal que substituem os estilos
definidos pelo usuá rio, com base na ordem de avaliaçã o. O usuá rio pode ter a palavra final
substituindo as declaraçõ es do autor usando o modificador “! Important”. Esta é
provavelmente a melhor implementaçã o do modificador “! Important”.
Verificação rápida
Usando especificidade
Depois de registrar os valores de a , b e c , concatene os três nú meros para formar um valor
de especificidade de forma que a tenha o valor mais alto, entã o b e c tenham o valor mais
baixo. A Figura 4-7 demonstra o cá lculo de vá rios seletores, desde o valor de especificidade
mais baixo até o valor de especificidade mais alto.
16 1
FIGURA 4-7 Exemplos de cá lculo de valor de especificidade, classificados do menor para o
maior valor Se você tiver regras de estilo conflitantes e calcular o valor de especificidade de
cada uma, se os valores forem iguais, qual regra de estilo é usada? A ordem textual se torna
o fator de desempate. A ú ltima das regras de estilo será o estilo efetivo.
Entendendo a herança
Um elemento pode obter seu estilo de um elemento pai quando nenhum outro estilo
definido é mais específico, mas é importante entender que o elemento só herda um estilo
de um pai quando nenhum estilo é definido para a propriedade do elemento
potencial. Considere o cená rio no qual você deseja que todo o texto em seu documento
HTML seja dimensionado para extragrande. Em vez de definir um estilo para
os elementos < input >, outro estilo para os elementos < div > e assim por diante, você pode
apenas definir a fonte do elemento < body > conforme a seguir.
corpo {
O exemplo anterior era bastante simples porque os elementos típicos têm suas
propriedades definidas para herdar por padrã o. O que você faria se tivesse um elemento
cuja cor de fundo está definida, mas deseja redefinir o elemento para herdar de seu
pai? Você pode atribuir o valor herdado à cor de fundo, conforme mostrado no exemplo a
seguir.
corpo {
elemento < li >.
Resumo da lição
■■ Para manter a separaçã o entre estrutura e apresentaçã o, use folhas de estilo externas.
■■ Use o modificador “! Important” com estilos definidos pelo usuá rio para substituir os
estilos definidos pelo autor.
163
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
opçã o de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você deseja definir o estilo da primeira letra de cada pará grafo em um elemento < div >
cujo id é readingPane. Qual seletor de estilo é mais apropriado?
div p.highlight {
div p {
<head>
<title> </title>
</head>
<body>
<div id = "readingPane">
Aqui está um teste para ver qual é a cor de fundo de um pará grafo
</p>
</div>
</body>
</html>
A. Amarelo
B. Azul
C. Transparente
D. White
div p.highlight {
Seu documento HTML contém o seguinte.
<head>
<title> </title>
</head>
<body>
<div id = "readingPane">
Aqui está um teste para ver qual é a cor de fundo de um pará grafo
</p>
</div>
</body>
</html>
A. Amarelo
B. Azul
C. Transparente
D. White
Agora que você sabe como usar seletores CSS, pode trabalhar com propriedades
CSS. Existem muitas propriedades CSS e esta liçã o discute as propriedades CSS bá sicas que
você precisa saber para fornecer um layout de pá gina.
165
■■ Posicione os elementos < div >.
Tempo estimado de aula: 30 minutos
Com CSS, as cores podem ser especificadas de vá rias maneiras, como por nomes de cores,
valores de cores RGB e valores de cores ARGB. Você pode definir a transparência ou
opacidade.
Os valores RGB estã o disponíveis desde a versã o mais antiga do CSS. O valor RGB é um
campo de seis caracteres que representa um valor hexadecimal de dois caracteres para a
quantidade de vermelho, depois verde e azul, e é prefixado com o símbolo sustenido
(#). Um valor de 00 (dois zeros) é o valor mínimo e ff representa o valor má ximo para essa
cor. Isso representa 0–255 em decimal. A seguir estã o exemplos de valores RGB.
■■ preto # 000000
■■ branco #ffffff
■■ vermelho # ff0000
■■ verde # 008000
■■ limão # 00ff00
■■ azul # 0000ff
■■ amarelo # ffff00
■■ cinza # 808080
corpo {
Em vez de representar o valor RGB como #rrggbb, você pode representar o RGB
valor como #rgb. Se os códigos de dois caracteres para vermelho, verde e azul forem
iguais, você pode usar um único caractere para cada um para reduzir o valor de seis
caracteres a um valor de três caracteres. Por exemplo, amarelo é # ffff00 onde os
caracteres do componente vermelho são iguais, os caracteres do
componente verde são os mesmos e os caracteres do componente azul são os
mesmos.
A maioria das cores pode ser representada usando esta combinaçã o de vermelho, verde e
azul, mas você nã o precisa se lembrar dos valores RGB se aproveitar a capacidade do CSS
de usar nomes de cores ao fazer atribuiçõ es de cores à s propriedades. A Tabela 4-1 contém
uma lista dos nomes das cores com seus valores RGB correspondentes.
Valor hexadecimal
Valor Decimal
aliceblue
# f0f8ff
240.248.255
antiquewhit e
# faebd7
250.235.215
á gua
# 00ffff
0,255,255
á gua-marinha
# 7fffd4
127.255.212
azul
# f0ffff
240.255.255
bege
# f5f5dc
245.245.220
bisque
# ffe4c4
255.228.196
Preto
# 000000
0,0,0
amêndoa
#ffebcd
255.235.205
azul
# 0000ff
0,0,255
blueviolet
# 8a2be2
138,43,226
Castanho
# a52a2a
165,42,42
Madeira robusta
# deb887
222.184.135
cadetblue
# 5f9ea0
95.158.160
chartreuse
# 7fff00
127.255,0
chocolate
# d2691e
210.105,30
coral
# ff7f50
255.127.80
# 6495ed
100.149.237
seda de milho
# fff8dc
255.248.220
carmesim
# dc143c
220,20,60
ciano
# 00ffff
0,255,255
azul escuro
# 00008b
0,0,139
darkcyan
# 008b8b
0,139,139
Darkgoldenrod
# b8860b
184.134,11
cinza escuro
# a9a9a9
169.169.169
verde escuro
# 006400
0,100,0
cinza escuro
# a9a9a9
169.169.169
Darkkhaki
# bdb76b
189.183.107
167
Nome da Cor
Valor hexadecimal
Valor Decimal
darkmagenta
# 8b008b
139.0.139
verde-escuro
# 556b2f
85.107,47
laranja escuro
# ff8c00
255.140,0
darkorchid
# 9932cc
153.50.204
vermelho escuro
# 8b0000
139,0,0
Darksalmon
# e9967a
233.150.122
verde escuro
# 8fbc8f
143.188.143
darkslateblue
# 483d8b
72,61,139
Darkslategray
# 2f4f4f
47,79,79
Darkslategrey
# 2f4f4f
47,79,79
turquesa escura
# 00ced1
0,206,209
darkviolet
# 9400d3
148.0.211
Rosa escuro
# ff1493
255,20.147
deepskyblue
# 00bfff
0,191,255
escurecer
# 696969
105.105.105
Dimgrey
# 696969
105.105.105
Trapaceiro azul
# 1e90ff
30.144.255
# b22222
178,34,34
branco floral
# fffaf0
255.250.240
verde floresta
# 228b22
34.139,34
fú csia
# ff00ff
255.0.255
Ganha-Boro
#dcdcdc
220.220.220
fantasma branco
# f8f8ff
248.248.255
ouro
# ffd700
255.215,0
Goldenrod
# daa520
218.165,32
cinza
# 808080
128.128.128
verde
# 008000
0,128,0
verde amarelo
# adff2f
173.255,47
cinza
# 808080
128.128.128
melada
# f0fff0
240.255.240
Rosa quente
# ff69b4
255.105.180
índio
# cd5c5c
205,92,92
índigo
# 4b0082
75.0.130
Nome da Cor
Valor hexadecimal
Valor Decimal
marfim
# fffff0
255.255.240
cá qui
# f0e68c
240.230.140
lavanda
# e6e6fa
230.230.250
lavenderblush
# fff0f5
255.240.245
Lawngreen
# 7cfc00
124.252,0
Lemonchiffon
#fffacd
255.250.205
azul claro
# add8e6
173.216.230
cor de luz
# f08080
240.128.128
Ciano claro
# e0ffff
224.255.255
lightgoldenrodyel ow
# fafad2
250.250.210
cinza claro
# d3d3d3
211.211.211
luz verde
# 90ee90
144.238.144
cinza claro
# d3d3d3
211.211.211
luz rosa
# ffb6c1
255.182.193
salmã o luminoso
# ffa07a
255.160.122
verde claro
# 20b2aa
32.178.170
azul claro
# 87cefa
135.206.250
raio de luz
# 778899
119.136.153
estrelado-luz
# 778899
119.136.153
azul claro
# b0c4de
176.196.222
luz amarela
# ffffe0
255.255.224
Lima
# 00ff00
0,255,0
verde limã o
# 32cd32
50.205,50
linho
# faf0e6
250.240.230
magenta
# ff00ff
255.0.255
marrom
# 800000
128,0,0
mediumaquamarine
# 66cdaa
102.205.170
azul médio
# 0000cd
0,0,205
médium
# ba55d3
186,85,211
médio pú rpura
# 9370db
147.112.219
médio-verde
# 3cb371
60.179.113
médio-azulado
# 7b68ee
123.104.238
mediumspringgreen
# 00fa9a
0,250,154
169
Nome da Cor
Valor hexadecimal
Valor Decimal
turquesa médio
# 48d1cc
72.209.204
médio-violento
# c71585
199,21,133
# 191970
25,25,112
creme de hortelã
# f5fffa
245.255.250
mistirose
# ffe4e1
255.228.225
mocassim
# ffe4b5
255.228.181
navajowhite
#ffdead
255.222.173
marinha
# 000080
0,0,128
Oldlace
# fdf5e6
253.245.230
Oliva
# 808000
128,128,0
caranguejo
# 6b8e23
107.142,35
laranja
# ffa500
255.165,0
laranjal
# ff4500
255,69,0
orquídea
# da70d6
218.112.214
Palegoldenrod
# eee8aa
238.232.170
verde pá lido
# 98fb98
152.251.152
paleturquesa
#afeeee
175.238.238
palevioletrado
# db7093
219.112.147
papaia
# ffefd5
255.239.213
pêssego
# ffdab9
255.218.185
Peru
# cd853f
205.133,63
cor de rosa
# ffc0cb
255.192.203
ameixa
# dda0dd
221.160.221
Pó azul
# b0e0e6
176.224.230
roxo
# 800080
128.0.128
vermelho
# ff0000
255,0,0
rosybrown
# bc8f8f
188.143.143
azul real
# 4169e1
65.105.225
Saddlebrown
# 8b4513
139,69,19
salmã o
# fa8072
250.128.114
castanho-arenoso
# f4a460
244.164,96
verde Mar
# 2e8b57
46.139,87
Concha do mar
# fff5ee
255.245.238
Nome da Cor
Valor hexadecimal
Valor Decimal
Siena
# a0522d
160,82,45
prata
# c0c0c0
192.192.192
céu azul
# 87ceeb
135.206.235
# 6a5acd
106,90.205
ardó sia cinza
# 708090
112.128.144
# 708090
112.128.144
neve
#fffaf a
255.250.250
Primavera verde
# 00ff7f
0,255,127
azul-aço
# 4682b4
70.130.180
bronzeado
# d2b48c
210.180.140
cerceta
# 008080
0,128,128
cardo
# d8bfd8
216.191.216
tomate
# ff6347
255,99,71
turquesa
# 40e0d0
64.224.208
tolet
# ee82ee
238.130.238
trigo
# f5deb3
245.222.179
Branco
#ffffff
255.255.255
fumaça branca
# f5f5f5
245.245.245
amarelo
# ffff00
255.255,0
amarelo verde
# 9acd32
154.205,50
Outra maneira de representar as cores RGB é usar a funçã o rgb. Esta funçã o aceita os três
parâ metros R, G e B, como um nú mero inteiro ou como uma porcentagem. Se o valor inteiro
estiver acima ou abaixo do intervalo vá lido de 0 a 255, o valor será automaticamente
interpretado como o valor mínimo ou má ximo. A seguir estã o exemplos da funçã o rgb.
h1 {cor de fundo: rgb (20%, 150%, 0%); } / * interpretado como 20%, 100%, 0% * /
171
Usando transparen cy
Isso é especialmente ú til quando o conteú do é colocado sobre uma imagem e você ainda
deseja ver a imagem. A opacidade deve ser um valor entre 0,0 e 1,0, em que 0,0 é invisível e
1,0 é opaco. No exemplo a seguir, a opacidade de um elemento cujo id é mainContent é
definida de forma que o elemento seja 50 por cento transparente e qualquer coisa sob esse
elemento ainda seja visível.
#conteú do principal {
opacidade: 0,5;
Usando a função rgba
A funçã o rgba é semelhante à funçã o rgb, exceto por ter um parâ metro alfa , que representa
a quantidade de transparência a ser usada. O valor do parâ metro alfa deve estar entre 0,0
e 1.0, onde 0.0 é invisível e 1.0 é totalmente opaco. A seguir estã o exemplos de como usar a
funçã o rgba.
173
Em sua regra de estilo, você pode usar a propriedade font-family para definir o tipo de letra
dos elementos que correspondem ao seletor. Tenha cuidado ao especificar a família da
fonte, pois aquela que você especificar deve existir no computador do usuá rio. Se a família
de fontes nã o existir , o navegador usará sua fonte padrã o. Por segurança, geralmente é
melhor especificar uma família de fontes comuns, como Arial, Courier New, Georgia, Times
New Roman ou Verdana. Arial e Verdana sã o fontes sem serifa, fá ceis de ler e comumente
usadas.
Você pode especificar uma lista de famílias de fontes em sua regra de estilo. O navegador
tentará usar a primeira família de fontes especificada. Se o navegador nã o tiver a primeira
família de fontes, ele tentará usar a segunda família de fontes e assim por diante. O exemplo
a seguir descreve vá rias famílias de fontes sendo especificadas.
Neste exemplo, a ú ltima família de fontes listada é, na verdade, o nome do grupo genérico,
que instrui o navegador a usar uma família de fontes desse grupo se o navegador nã o tiver
as outras famílias de fontes especificadas primeiro.
Que outras opçõ es você tem ao tentar especificar uma família de fontes que o uso r
provavelmente nã o terá ? No passado, os desenvolvedores criavam uma imagem GIF que
era uma imagem do texto e, em seguida, usavam a imagem na pá gina. Se você fizer isso,
deve sempre preencher o atributo alt com o texto. Lembre-se de que a Liçã o 1 aborda o uso
de @ font-face, que permite fornecer um link para a fonte que deseja usar.
Para definir o tamanho da fonte, você pode definir a propriedade font-size. Os tamanhos
das fontes podem ser especificados usando unidades absolutas ou unidades relativas, e
existem vá rias maneiras de definir o tamanho. As unidades de comprimento absoluto sã o
ú teis quando o ambiente de saída é conhecido porque as unidades de comprimento
absoluto sã o fixas em relaçã o umas à s outras e ancoradas a alguma medida física. A seguir
está uma lista das unidades de medida disponíveis .
Além de todos os tamanhos já cobertos, você pode usar valores de porcentagem para
dimensionar sua fonte, que fornece um tamanho que é relativo ao tamanho de fonte
calculado do elemento pai.
Aqui estã o alguns exemplos de como usar as vá rias unidades de medida para definir a
propriedade font-size.
Com todas essas opçõ es de medida, qual é a unidade de medida recomendada a ser usada?
Criar um bom layout para sua pá gina da Web requer que você entenda o modelo de caixa
CSS, que define o espaçamento em torno das caixas em seu documento HTML, conforme
mostrado na Figura 4-10.
Liçã o 3: Trabalhando com propriedades CSS CAPÍTULO 4
175
p{
borda: 10px;
preenchimento: 25px;
margem: 15px;
}
Esta regra de folha de estilo define a largura da borda em 10 pixels em todos os quatro
lados. O preenchimento é definido como 25 pixels nos quatro lados e a margem é definida
como 15 pixels nos quatro lados. Agora considere o seguinte documento HTML e como a
regra de estilo afeta sua renderizaçã o.
<head>
<title> </title>
</head>
<body>
</body>
</html>
A Figura 4-11 mostra a pá gina da web renderizada. Observe a grande lacuna entre o texto e
a borda, que é o preenchimento. A borda é bastante grossa com sua configuraçã o de largura
de 10 pixels.
p{
border-right: 5px;
preenchimento: 25px;
margem: 15px;
Neste exemplo, a borda superior nã o é exibida porque sua largura está definida como 0
pixels. Você também pode adicionar -bottom, -top, -left e -right à s propriedades de
preenchimento e margem. Há também Liçã o 3: Trabalhando com propriedades
CSS CAPÍTULO 4
177
Neste exemplo, a parte superior é definida como 1 pixel, a direita é definida como 2 pixels,
a parte inferior é definida como 3
pixels, e a esquerda é definida como 4 pixels. Além disso, se você sabe que deseja que as
partes superior e inferior tenham os mesmos valores e que a esquerda e a direita tenham
os mesmos valores, você pode atribuir os dois valores para que o primeiro valor seja a
configuraçã o superior e inferior, e o segundo valor é a configuraçã o esquerda e direita. O
exemplo a seguir define a parte superior e inferior em 5 pixels e a esquerda e a direita em
15 pixels.
Verificação rápida
Posicionando elementos < div >
O elemento < div > tem sido o elemento al -purpose a ser usado para criar layouts de
pá gina.
<head>
<tit le> </title>
</head>
<body>
<div id = "div1">
</div>
<div id = "div2">
<div id = "div3">
atomorum mea. Ad vis illum porro disputando, ei eligendi mandamus liberavisse mar. Sea
debet compreensam no, et
</p>
</div>
<div id = "div4">
</p>
</div>
<div id = "div5">
p
este é o quinto div - Ei duo viderer legendos, fastidii
</p>
</div>
</div>
<div id = "div6">
</p>
</div>
</body>
</html>
p{
margem: 0px;
div {
borda: só lida;
# div1 {
# div2 {
179
# div3 {
# div4 {
# div5 {
# div6 {
Nas regras de estilo, a margem do elemento < p > é definida como 0 pixels para evitar que o
pará grafo insira muito espaço. Cada cor de fundo do elemento < div > é definida para ajudar
a diferenciar cada elemento. Se você exibir esta pá gina em um navegador, verá algo
semelhante à Figura 4-12.
A primeira coisa que você pode querer fazer é definir os elementos < div > em um local e
tamanho fixos para ajudá -lo a obter controle do posicionamento dos elementos < div > ao
criar o layout da pá gina. Use o positi na propriedade, que deve ser definido como está tico,
relativa, absoluta, ou fixo como uxos fol.
# div2 {
posiçã o: relativa;
topo: 15px;
esquerda: 30px;
Com o topo definido para 15 pixels, div2 e seu conteú do serã o empurrados para baixo 15
pixels de sua localizaçã o normal. A configuraçã o esquerda de 30 pixels empurrará div2 e
seu conteú do para a direita em 30
FIGURA 4-13 O uso de posicionamento relativo para mover div2 e seu conteú do Liçã o 3:
Trabalhando com propriedades CSS CAPÍTULO 4
181
Neste exemplo, div2 e seu conteú do mantiveram o tamanho original e foram cortados no
lado direito da tela, e o ú ltimo elemento < div >, div6, ainda está em seu local original. Os
valores de top e left também podem ser negativos para mover o elemento na direçã o
oposta.
# div2 {
backgro und-color: ciano;
posiçã o: absoluta;
topo: 15px;
esquerda: 30px;
Com o topo definido para 15 pixels, div2 e seu conteú do serã o empurrados para baixo em
15 pixels, nã o de sua localizaçã o normal, mas da parte superior da janela do navegador. A
configuraçã o esquerda de 30 pixels empurrará div2 e seu conteú do para a direita em 30
pixels, também nã o de sua localizaçã o normal, mas do lado esquerdo da janela do
navegador. O resultado é mostrado na Figura 4-14.
FIGURA 4-14 O uso de posicionamento absoluto para mover div2 e seu conteú do Neste
exemplo, div2 e seu conteú do mantiveram o tamanho original, e o ú ltimo elemento < div >,
div6, foi movido de sua localizaçã o original e agora está sob div1 porque div2 e seu
conteú do nã o estã o mais no fluxo de documentos HTML. Como nã o há elementos pais nã o
está ticos, o posicionamento é relativo à janela de navegaçã o .
Agora que div2 nã o é está tico, o que aconteceria se a posiçã o de um de seus elementos filho
fosse definida como absoluta? Por exemplo, suponha que div5 tenha a seguinte regra de
estilo.
# div5 {
posiçã o: absoluta;
topo: 5px;
esquerda: 5px;
Se div5 nã o tivesse nenhum elemento pai nã o está tico, div5 seria posicionado no canto
superior esquerdo da janela do navegador. Como div5 tem div2 como pai nã o está tico, div5
será posicionado no canto superior esquerdo de div2. O resultado é mostrado na Figura 4-
15.
FIGURA 4-15 O uso de posicionamento absoluto em um elemento nã o está tico Observe que
div5 está posicionado em relaçã o a div2, nã o em relaçã o à janela do navegador. Um dos
benefícios dessa abordagem é que você pode facilmente configurar div3, div4 e div5 como
colunas em div2, definindo as propriedades top, left, right e width para div3, div4 e div5,
respectivamente. Antes de demonstrar isso, o que você faria se quisesse que a posiçã o de
div5 fosse relativa à janela do navegador? Você pode usar o posicionamento fixo em vez do
posicionamento absoluto.
A partir do exemplo anterior, a regra de estilo para div5 foi alterada para a seguinte.
# div5 {
posiçã o: fixa;
topo: 5px;
183
esquerda: 5px;
Com a posiçã o definida como fixa, div5 é posicionado em relaçã o à janela do navegador,
conforme mostrado na Figura 4-16.
p{
margem: 0px;
div {
borda: só lida;
# div1 {
# div2 {
posiçã o: absoluta;
topo: 15px;
esquerda: 30px;
largura: 450px;
altura: 400px;
# div3 {
posiçã o: absoluta;
topo: 0px;
esquerda: 0px;
largura: 33%;
altura: 100%;
# div4 {
posiçã o: absoluta;
topo: 0px;
esquerda: 33%;
largura: 33%;
altura: 100%;
# div5 {
posiçã o: absoluta;
topo: 0px;
direita: 0px;
largura: 33%;
altura: 100%;
# div6 {
Neste exemplo, div2 tem uma largura explícita definida para 450 pixels e sua altura é
definida como 400
Um dos problemas com essa soluçã o é que a altura de div2 é fixada em 400 pixels e as
alteraçõ es no conteú do de div3, div4 ou div5 podem resultar em uma grande lacuna na
parte inferior ou recorte do texto na parte inferior. Isso pode ser aceitá vel em alguns
cená rios, mas div6 ainda está no topo. Você pode querer que as colunas aumentem e
diminuam dinamicamente y e div6 sejam colocadas na parte inferior das colunas, mesmo
quando a altura da coluna muda. O uso da propriedade float pode resolver esse problema.
185
O posicionamento absoluto pode ser um pouco frá gil ao usar configuraçõ es absolutas. No
exemplo anterior, seria melhor se os elementos < div > nã o fossem removidos do fluxo de
documentos HTML, mas, em vez disso, pudessem ser dimensionados e colocados lado a
lado para produzir colunas. Se o
Os elementos < div > nã o sã o removidos do fluxo de documentos HTML, div6 irá
automaticamente permanecer na parte inferior.
A propriedade float pode ser definida para permitir que um elemento flutue para a
esquerda ou direita. Um elemento pode flutuar apenas horizontalmente y, nã o vertical y, e
irá flutuar tanto para a esquerda ou direita quanto puder.
Para entender como a propriedade float funciona, o mesmo documento HTML é usado
como nos exemplos anteriores, e o seguinte é o conteú do do arquivo default.css.
p{
margem: 0px;
div {
borda: só lida;
# div1 {
# div2 {
# div3 {
flutuar: esquerda;
largura: 80%;
# div4 {
# div5 {
# div6 {
Neste exemplo, a propriedade div3 float é definida para a esquerda e a largura é definida
para 80 por cento.
187
O efeito líquido é que div4 envolve div3. Essa técnica é comumente usada para inserir
imagens em um documento HTML de forma que o texto se enrole na imagem.
p{
margem: 0px;
}
div {
borda: só lida;
cor bor der: preto;
# div1 {
# div2 {
# div3 {
flutuar: esquerda;
largura: 32%;
# div4 {
flutuar: esquerda;
largura: 32%;
}
# div5 {
flutuar: esquerda;
largura: 32%;
# div6 {
A largura é definida como 32 por cento em vez de 33 por cento porque a configuraçã o de
largura nã o inclui a largura da borda, que é padronizada para 2 pixels. O resultado é
mostrado na Figura 4-19.
Com todas as três colunas renderizadas lado a lado e dentro de div2, as bordas usam um
total de 14
píxeis. Se a largura for definida para 33 por cento , a ú ltima coluna nã o caberá e será
colocada sob div3
porque definir a largura para 32 por cento faz com que uma fita fique disponível no lado
direito e div6 preencha o vazio. Como o div6 pode ser estilizado para ser exibido apenas na
parte inferior? Use a propriedade clear.
# div6 {
limpar ambos;
189
FIGURA 4-20 A propriedade clara definida para ambos
Para resolver esse problema, você pode alterar a maneira como o navegador calcula
a largura definindo a propriedade box-sizing em div3, div4 e div5. O tamanho da caixa tem
os seguintes valores vá lidos.
p{
margem: 0px;
div {
borda: só lida;
#di v1 {
# div2 {
limpar ambos;
# div3 {
flutuar: esquerda;
largura: 33%;
# div4 {
flutuar: esquerda;
largura: 34%;
# div5 {
flutuar: esquerda;
largura: 33%;
# div6 {
limpar ambos;
191
FIGURA 4-21 Usando a propriedade box-sizing para controlar cá lculos de largura
-moz-box-sizing: border-box;
Se você olhar atentamente a Figura 4-21, poderá notar que nos lados esquerdo e direito das
colunas , há um espaço muito pequeno. Isso ocorre porque div3, div4 e div5 estã o dentro de
div2; eles cabem dentro da fronteira de div2. Se você precisa que essas colunas se alinhem
exatamente com a borda de div2, você pode tirar div3, div4 e div5 de div2.
Verificação rápida
■■ Você deseja definir a largura de um elemento com base em sua largura total. Qual
deve ser o tamanho da caixa?
Criar um layout de pá gina que tenha uma boa aparência em qualquer navegador e continue
a ter uma boa aparência enquanto a janela do navegador é redimensionada pode ser uma
tarefa difícil. Uma abordagem comum para resolver esse problema é criar
um elemento < div > que contenha seu conteú do e definir o < div > para uma largura
fixa, como 800 pixels.
#container {
largura: 600px;
Resumo da lição
■■ Famílias de fontes com curvas nas partes superior e inferior dos caracteres pertencem
ao grupo de famílias de fontes serif. As famílias de fontes que nã o têm cachos pertencem ao
grupo de famílias de fontes sans serif. As famílias de fontes cujos caracteres têm a mesma
largura pertencem ao grupo de famílias de fontes monoespaçadas. As famílias de fontes que
imitam a escrita à mã o pertencem ao grupo de famílias de fontes cursivas. As famílias de
fontes decorativas pertencem ao grupo de famílias de fontes fantasy.
■■ A propriedade float pode ser usada para criar colunas sem remover o elemento < div >
do fluxo de HTML. Esta propriedade também pode ser usada para posicionar imagens de
forma que o texto flua ao redor da imagem.
193
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você deseja encontrar três tons de uma cor para usar em partes de sua pá gina da
web. Qual funçã o de cor o ajuda a realizar essa tarefa?
A. rgb ()
B. rgba ()
C. hsl ()
D. color ()
2. Uma fonte com ondulaçõ es nas partes superior e inferior de seus caracteres pertence a
qual grupo de família fo nt?
A. monoespaço
B. serif
C. sans serif
D. cursiva
E. fantasia
A. está tico
B. parente
C. absoluto
D. corrigido
Pratica exercícios
1. Inicie o Visual Studio Express 2012 for Web. Navegue até Arquivo | Projeto aberto.
4. Na janela Solution Explorer, adicione um arquivo CSS clicando com o botã o direito na
pasta Content no projeto e navegando até Add | Folha de estilos.
<head>
</head>
7. Abra o arquivo default.css e defina a cor de fundo do corpo com saturaçã o má xima e
meia claridade, conforme a seguir.
corpo {
Este estilo define a altura, largura, texto , alinhamento, preenchimento e estilo de borda
conforme a seguir.
entrada {
largura: 446px;
altura: 35px;
borda: inserçã o;
195
Este estilo define a cor de fundo, largura, altura e estilos de borda da seguinte maneira.
botã o {
largura: 150px;
altura: 50px;
fronteira: início;
10. Adicione uma regra de estilo que defina o formato dos botõ es quando você passa o
mouse sobre um botã o.
botã o: hover {
11. Adicione uma regra de estilo que defina o formato dos botõ es quando um botã o é
clicado.
botã o: ativo {
borda: inserçã o;
largura da borda: grosso;
12. Adicione uma regra de estilo que forneça formataçã o comum para os botõ es e caixas de
texto.
O seletor deve ser para os elementos < input > e < button > e deve definir a família da fonte,
tamanho da fonte, largura da borda, cor da borda e margem.
input, button {
margem: 5px;
#txtResult {
Você deve ver uma interface de calculadora mais bonita, conforme mostrado na Figura 4-
22.
16. Volte para o Visual Studio pressionando Alt + Tab. Observe que a barra de título diz
(Em execuçã o).
Shift + F5 funciona apenas quando o Vis ual Studio tem o foco, nã o quando o aplicativo em
execuçã o tem o foco.
A ú nica mudança real na pá gina default.html foi adicionar o link à folha de estilo.
197
Este elemento < div > será usado para centralizar a calculadora e criar uma caixa ao seu
redor.
<head>
</head>
<body>
<div id = "calculator">
</div>
</script>
</body>
</html>
5. Insira, apó s o estilo do corpo, uma regra de estilo para o elemento < div > cujo id é
“calculadora”.
ordem b : só lido;
largura: 500px;
altura: 500px;
preenchimento: 10px;
Agora que você tem uma caixa com altura e largura fixas , pode alterar as configuraçõ es de
altura e largura nos elementos de entrada e botã o para uma porcentagem do tamanho da
calculadora.
entrada {
largura: 85%;
altura: 7%;
preenchimento: 10px;
borda: inserçã o;
botã o {
altura: 10%;
fronteira: início;
Em vez de definir o estilo de txtResult usando seu id, seria melhor alterar o seletor para
aplicar o estilo a qualquer elemento cujo atributo somente leitura esteja definido.
[somente leitura] {
corpo {
#calculadora {
borda: só lida;
largura: 500px;
altura: 500px;
preenchimento: 10 px;
}
entrada {
largura: 85%;
altura: 7%;
199
preenchimento: 10px;
borda: inserçã o;
botã o {
largura: 25%;
altura: 10%;
fronteira: início;
botã o: hover {
botã o: ativo {
borda: inserçã o;
largura da borda: grosso;
input, button {
margem: 5px;
[somente leitura] {
9. Experimente clicar nos botõ es de nú mero para escolher os nú meros e tente os botõ es de
mais e menos enquanto observa o resultado. Tente clicar no botã o limpar entrada depois
de inserir um nú mero. Experimente clicar no botã o limpar para ver a entrada e o resultado
claros.
Os exercícios adicionais a seguir foram elaborados para dar a você mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com êxito as liçõ es apresentadas
neste capítulo.
■■ Exercício 2 Aprenda mais sobre seletores CSS adicionando mais elementos à pá gina e
tente definir o formato selecionando os elementos sem usar um id.
■■ Exercício 3 Aprenda mais sobre cores alterando o esquema de cores, usando valores
RGB.
201
Respostas
Lição 1
1. Resposta correta: C
2. Resposta correta: C
3. Resposta correta: B
D. Incorreto: O atributo alvo típico y especifica o quadro que o link terá como alvo.
Lição 2
1. Resposta correta: A
2. Resposta correta: A
3. Resposta correta: B
Lição 3
1. Resposta correta: C
A. Incorreto: a funçã o rgb requer que você especifique quantidades variá veis de vermelho,
verde e azul para cada cor, portanto, nã o é fá cil derivar três cores correspondentes.
B. Incorreto: A funçã o rgba é a mesma que a funçã o rgb, exceto que você precisa
especificar o valor alph a (opacidade) também.
C. Correto: Usando a funçã o hsl, você pode definir o valor do matiz e, em seguida, ajustar
os valores de saturaçã o e clareamento para derivar outras cores correspondentes.
D. Incorreto: Nã o há funçã o de cor que possa ser usada em uma folha de estilo para gerar
uma cor.
Respostas CAPÍTULO 4
203
2. Resposta correta: B
B. Correto: Os caracteres da família de fontes com serifa têm serifas (cachos) na parte
superior e inferior deles.
C. Incorreto: os caracteres da família de fontes sans serif nã o têm serifas (cachos) nas
partes superior e inferior.
3. Resposta correta: D
CAPÍTULO 5
Mais HTML5
Este capítulo fornece uma transiçã o, movendo você de tó picos antigos para novos. A Liçã o
1, “Pensando na semâ ntica do HTML5 ,” discute muitos aspectos da semâ ntica do HTML5
que sã o principalmente tó picos novos. A Liçã o 2, “Trabalhando com tabelas”, explica
tabelas, que é um tó pico mais antigo, mas relevante, e descreve recursos adicionados em
HTML5.
Para concluir este capítulo, você deve ter algum conhecimento de desenvolvimento
web. Este capítulo requer o hardware e o software listados na seçã o "Requisitos do
sistema" na Introduçã o do livro .
O elemento < div > tem sido o elemento preferido para usar para posicionar o conteú do ao
criar um layout de pá gina.
Muitos desenvolvedores também usaram o elemento < table >, mas esse elemento é muito
mais difícil de usar, especialmente para manter um site. A liçã o 2 explica
o elemento < tabela >, mas nã o usa um elemento < tabela > para o layout da pá gina.
Esta liçã o fornece uma abordagem diferente para criar um layout de pá gina; ele cobre
elementos semâ nticos e explica por que você deve usá -los.
205
Um dos problemas com o uso dos elementos < div > e < span > é que eles têm pouco
significado além de “Preciso fazer algo com este conteú do”. Para elementos < div >, você
normalmente precisa posicionar o conteú do na pá gina. Para elementos < span >, você
precisa aplicar formataçã o especial ao conteú do.
Seus usuá rios estã o lendo seu có digo-fonte HTML? Se o elemento < div > é a ferramenta al -
purpose para posicionar elementos, por que usar esses novos elementos semâ nticos?
Seus usuá rios normalmente nã o lêem o có digo-fonte HTML quando navegam para o seu
site, mas muitas má quinas estã o lendo o có digo-fonte HTML com o objetivo de interpretar a
sua pá gina da web.
Os dispositivos NVDA precisam de sua ajuda para interpretar o conteú do da sua pá gina da
web corretamente. Eles precisam que você use tags HTM L significativas que definam a
finalidade do conteú do de cada elemento. Isso ajuda os rastreadores a produzir melhores
correspondências para as consultas de pesquisa, e os dispositivos NVDA que leem suas
pá ginas da web para os usuá rios podem fornecer uma experiência mais significativa. Para
obter mais informaçõ es, visite http: // www. nvdaproject.org/ .
Agora que você entende a importâ ncia de usar a marcaçã o semâ ntica, pode decidir que
nunca mais usará um elemento < div > ou < span > novamente. No entanto, você encontrará
conteú do que precisa ser estilizado, mas nã o se encaixa claramente no significado de
nenhum elemento semâ ntico. Você pode e deve usar os elementos < div > e < span > nesses
cená rios.
Ao longo deste livro, você encontrará muitas tags HTML5. Ao criar suas pá ginas HTML,
você se deparará com a tarefa à s vezes assustadora de fornecer significado ao seu conteú do
fornecendo tags semâ nticas. Use a semâ ntica com cuidado para usar um elemento apenas
para a finalidade pretendida. Se você precisar de um elemento personalizado, use
a tag < div > ou < span > e adicione um nome de classe ou id que transmita a semâ ntica
desejada. Seja pragmá tico e nã o muito purista.
207
FIGURA 5-2 Um contêiner de layout de site de blog usando elementos < div > Um contêiner
de layout apresenta seus filhos de uma maneira flexível e reutilizá vel. Para o
desenvolvedor, a finalidade dos elementos < div > é fá cil de entender com base na chave id
e classe CSS
Nomes dos termos. Como o navegador pode entender os elementos? Se você quiser que o
navegador dê ao usuá rio a capacidade de se concentrar automaticamente no primeiro
elemento do conteú do principal quando a pá gina for aberta, como você faria isso? Se você
deseja que o navegador forneça ao usuá rio botõ es especiais de início rá pido para os itens
de menu, como você pode fazer isso ?
Usando elementos semâ nticos HTML5, você pode criar um contêiner de layout que usa
elementos que sã o significativos para o desenvolvedor e o navegador. Os seguintes sã o
elementos comuns pelos quais se cria um contêiner de layout HTML5.
■■ < nav > Define uma seçã o que abriga um bloco dos principais links de navegaçã o.
A Figura 5-3 mostra como esses elementos podem ser aplicados para criar um contêiner de
layout.
Usando o elemento < header >
</header>
< cabeçalho >.
209
<cabeçalho>
<hgroup>
</hgroup>
</header>
Se o seu cabeçalho é apenas um < hn > e nã o contém nenhum outro conteú do, você nã o
precisa de um elemento < header >. Assim que você tiver mais de um ú nico < hn >,
como elementos < img > e elementos < p >, envolva seu conteú do em
um elemento < header >. Quando você tem vá rios elementos < hn >, como um cabeçalho e
subcabeçalho, envolva os elementos < hn > no elemento < hgroup >. UMA
Olhando para a diferença entre a Figura 5-2 e a Figura 5-3, você pode ver que o
o elemento < div > sim. Você pode corrigir isso adicionando a seguinte regra de estilo para
fornecer um comportamento de correspondência.
Usando o elemento < footer >
documento para fornecer conteú do final para o documento HTML e conteú do final para
artigos e seçõ es dentro do documento HTML. O elemento < footer > nã o deve ser aninhado
dentro de um
<footer>
<ul>
<li> Copyright (C) 2012, Contoso Ltd., todos os direitos reservados </li>
</ul>
</footer>
Usando o elemento < nav >
O elemento < nav > na Figura 5-3 substitui o elemento < div id = ”menu” > na Figura 5-2, que
fornece um significado de seçã o para navegadores e dispositivos. O elemento < nav >
envolve um grupo de links principais que estã o em sua pá gina. Os menus sã o os candidatos
mais comuns para o elemento < nav >.
Como menus, rodapés geralmente têm grupos de links, mas você nã o precisa usar
o elemento < nav > se estiver usando o elemento < footer > , e o elemento < nav > nã o é
necessá rio para links em seu conteú do. Você pode ter muitos elementos < nav > em um
documento HTML. Por exemplo, além do menu que está normalmente no lado esquerdo ou
na parte superior da pá gina, você pode ter um grupo de links acima do rodapé que
direciona para a pró xima pá gina de postagens do blog ou para outras á reas importantes do
seu local.
Usando o elemento < aparte >
<body>
<cabeçalho>
<artigo>
<ao lado>
</aside>
211
</article>
<ao lado>
<p> Você também pode ter seu pró prio blog ... </p>
</aside>
</body>
Os dois significados fazem sentido quando você considera que um artigo deve ser uma
unidade completa que pode ser compartilhada.
Usando funções
Chave
Termos
■■ banner Uma á rea em uma pá gina da web que possui conteú do específico do site, como
nome e logotipo do site, em vez de conteú do específico da pá gina; má ximo de um por
pá gina da web, normalmente conteú do de cabeçalho.
■■ complementar Uma á rea em uma pá gina da web que complementa a pá gina, mas ainda
tem significado se separada da pá gina.
■■ contentinfo Uma á rea que contém informaçõ es sobre o documento pai, como avisos de
direitos autorais e links; má ximo de um por pá gina da web, normalmente conteú do de
rodapé.
■■ formulário Uma á rea em uma pá gina da web que contém uma coleçã o de controles de
entrada para coletar dados a serem enviados ao servidor da web; os formulá rios de
pesquisa devem usar a funçã o de pesquisa.
■■ pesquisa Uma á rea em uma pá gina da web que contém uma coleçã o de controles de
entrada para inserir e exibir informaçõ es de pesquisa.
Você pode usar essas funçõ es para fornecer significado a uma á rea da pá gina da web, mas
os novos elementos HTML5 já fornecem significado. No entanto, os elementos HTML5 nã o
fornecem um novo elemento para identificar o conteú do principal da pá gina da web. Em
vez disso, todo o conteú do conhecido nã o é o conteú do principal, e o que resta deve ser o
conteú do principal. Além disso, o elemento < aparte > é usado como uma barra lateral, e
você pode querer fornecer mais significado. Por que nã o usar a funçã o WAI-ARIA para
fornecer significado a outros desenvolvedores e dispositivos auxiliares? Isso é ilustrado na
Figura 5-3.
Use o elemento < hr / > para adicionar uma pausa temá tica. É um elemento vazio, portanto
nã o pode ter nenhum conteú do. Você pode usar o elemento < hr / > para fornecer uma
pausa temá tica quando houver uma mudança de cena em uma histó ria ou para denotar
uma transiçã o para outro tó pico dentro de uma seçã o de um livro de referência.
Anotando conteúdo
Usando o elemento < b >
O elemento < b > foi usado para produzir texto em negrito, mas agora os elementos devem
ter significado, nã o estilo. Para manter o elemento < b >, mas também ter elementos
semâ nticos, o significado precisava ser alterado.
De acordo com o W3C, o elemento < b > representa uma extensã o de texto para a qual a
atençã o está sendo chamada para fins utilitá rios, sem transmitir qualquer importâ ncia
extra e sem implicaçã o de uma voz ou humor alternativo, como palavras-chave em um
resumo de documento ; nomes de produtos em uma revisã o; palavras acioná veis em
software interativo baseado em texto; ou um artigo lede.
Portanto, você pode aplicar qualquer estilo que desejar ao elemento < b >, embora manter
o estilo negrito faça mais sentido.
O elemento < b > é o elemento de ú ltimo recurso porque os títulos devem ser denotados
com o elemento < hn >, o texto enfatizado deve ser denotado com o elemento < em >, o
texto importante deve ser denotado com o elemento < strong > e marcado ou o texto
destacado deve usar o elemento < mark > . Evite usar o elemento < b >, exceto para denotar
nomes de produtos em uma resenha, palavras-chave em uma extraçã o de documento ou
uma lede de artigo, conforme mostrado no exemplo a seguir.
<artigo>
diferente de um martelo.
</article>
213
</p>
Observe que os estilos padrã o para os elementos < strong > e < b > têm a mesma aparência.
Usando o elemento < i >
De acordo com o W3C, o elemento < i > representa um intervalo de texto que está em uma
voz ou humor alternativo ou de outra forma é deslocado da prosa normal de uma maneira
que indica uma qualidade diferente do texto, como uma designaçã o taxonô mica, um termo
técnico , uma frase idiomá tica de outro idioma, um pensamento ou um nome de navio em
textos ocidentais.
Isso significa que você pode aplicar qualquer estilo ao elemento < i >, embora, como
o elemento < b >, você provavelmente deva manter o estilo padrã o.
O elemento < em >
Use o elemento < em > para ênfase enfá tica. Use-o para designar o texto que você pronuncia
de forma diferente, com ênfase. A seguir está um exemplo que responde à pergunta: “Você
consegue encontrar um desenvolvedor?”
</p>
Observe que os estilos padrã o para os elementos < em > e < i > parecem iguais.
O <abbr title = 'radio detecçã o e alcance'> radar </abbr> deve ser reparado <abbr title = 'o
mais breve possível'> ASAP </abbr> 214 CAPÍTULO 5 Mais HTML5
Observe que o título nã o é obrigató rio, especialmente quando você sabe que todos
conhecerã o o significado das abreviaçõ es e acrô nimos.
O elemento < address >
Use o elemento < addr ess > para definir as informaçõ es de contato do autor / proprietá rio
de um documento. Você pode incluir endereço de e-mail, endereço postal ou qualquer
endereço de contato que faça referência ao autor / proprietá rio do documento.
elemento < endereço >.
<footer>
<endereço>
Contoso, Inc.
<a href="email:WebMaster@Contoso.com">
WebMaster@Contoso.com
</a>
</address>
</footer>
Citações e citações
Quando chegar a hora de começar a cotar, você pode usar o elemento < blockquote > para
criar uma cotaçã o longa e contínua e o elemento < q > para uma cotaçã o embutida. Ambos
os elementos têm um atributo cite que nomeia o trabalho de origem da citaçã o.
<blockquote>
215
Ou se nã o quiseres, jura meu amor <br /> E nã o serei mais um Capuleto. <br />
<footer>
</p>
</footer>
</blockquote>
Quando você quiser adicionar uma aspa embutida, use o elemento < q > em vez de usar
aspas. O navegador irá inserir as aspas para você. Você pode adicionar
o atributo cite ao elemento < q >, que deve conter apenas o nome da obra. Além disso,
o elemento < q > pode ser aninhado em outro elemento < q >. O seguinte é um exemplo
do elemento < q >.
p
John disse ao pú blico <q> Sally estava chorando quando
</p>
Este exemplo renderiza a primeira citaçã o usando aspas duplas e a segunda citaçã o usando
aspas simples.
Quando você quiser exibir o có digo-fonte de qualquer tipo no documento HTML, use
o elemento < code >, conforme mostrado no exemplo a seguir.
</code>
Depois de executar o có digo de amostra, você pode documentar a saída do có digo usando o
Olá mã e!
</samp>
Lembre-se de que os elementos < code > e < samp > fornecem dados semâ nticos ao HTML,
mas nã o preservam o espaço em branco. Por exemplo, o có digo de amostra anterior irá 216
CAPÍTULO 5 Mais HTML5
Esta regra de estilo nã o é compatível com todos os navegadores, entã o você pode querer
usar o elemento < pre > para evitar a normalizaçã o do espaço em branco, conforme
descrito a seguir.
<pre>
<code>
</code>
</pre>
Usando o elemento < var >
O elemento < var > denota uma variá vel em uma equaçã o matemá tica, conforme mostrado
no exemplo a seguir.
Usando as < br / > e < wbr / > elementos O < br / > e < wbr / elementos> sã o elementos
nulos, o que significa que eles nã o podem ter qualquer conteú do e fornecer apenas uma
quebra de linha no documento HTML.
O elemento < wbr / >, que é uma quebra de palavra , fornece uma indicaçã o ao navegador
de que ele pode inserir uma quebra de linha neste local. O navegador decide se deve inserir
a quebra.
2 17
</p>
<abbr title = "Vehicle Identification Number"> VIN </abbr> </a> foi padronizado para um
formato de 17 caracteres onde
o décimo personagem do
<abbr t itle = "Vehicle Identification Number"> VIN </abbr> representa o ano do veículo.
</p>
Neste exemplo, o elemento < dfn > é usado uma vez onde a primeira instâ ncia do VIN está
sendo apresentada. Dentro do elemento < dfn > está um elemento < abbr >, que fornece o
significado de VIN em seu atributo title. O estilo padrã o do elemento < dfn > é texto em
itá lico, conforme mostrado na Figura 5-4. O uso do < a > elemento fornece um link para a
definiçã o.
FIGURA 5-4 O elemento < dfn > deixando seu texto em itá lico por padrã o 218 CAPÍTULO
5 Mais HTML5
Uma figura é uma unidade de conteú do que pode ter uma legenda e é referenciada no
documento principal. Use o elemento < figura > para denotar uma figura que pode ser uma
ou mais fotos, uma ou chave
Termos mais desenhos, uma ou mais ilustraçõ es ou outro conteú do denominado
unidade. Use o
O exemplo a seguir mostra o uso dos elementos < figure > e < figcaption > (em negrito) para
exibir uma imagem que é referenciada no documento principal da pá gina web.
O sanduíche <abbr title = "peanut but ter and jelly"> PB&J </abbr> tem sido um alimento
bá sico para muitas famílias
devido aos seus benefícios para a saú de, seu custo e seu
sabor maravilhoso.
</p>
</p>
<figure id = "figure1">
<img src = "/ pbj.jpg" alt = "requisitos de manteiga de amendoim e geleia" />
</figure>
</div>
Trabalhando com os elementos < resumo > e < detalhes > Use o elemento < detalhes >
com o elemento < resumo > para criar conteú do de detalhes expansíveis sob o resumo. Os
elementos < detalhes > e < resumo > funcionam atualmente apenas com o navegador Google
Chrome, mas espera-se mais suporte.
<detalhes>
<abbr title = "peanut butter and jelly"> PB&J </abbr> Liçã o 1: Pensando na semâ ntica
HTML5 CAPÍTULO 5
219
devido aos seus benefícios para a saú de, seu custo e seu
sabor maravilhoso.
</p>
p
</p>
<figure id = "figure1">
<img src = "/ pbj.jpg" alt = "requisitos de manteiga de amendoim e geleia" />
</figure>
</details>
</div>
Além dos elementos de anotaçã o já discutidos, a seguir está uma lista de anotaçõ es que
você pode usar em seu documento HTML.
■■ < u > Desloca uma extensã o de texto sem sugerir uma diferença de importâ ncia. O
comportamento padrã o é sublinhar o texto, mas isso poderia ser melhor acomodado
usando uma tag span com o estilo apropriado.
■■ < sub > Indica subscrito.
■■ < sup > indica sobrescrito.
Pode ser necessá rio fornecer conteú do que use caracteres de origem chinesa, que sã o
chamados de kanji . Esses caracteres sã o usados nos idiomas chinês, japonês e coreano
(CJK). Para indicar a pronú ncia do kanji, você pode usar pequenos caracteres fonéticos, que
sã o comumente chamados de tecla
Use o elemento < rubi > para colocar uma notaçã o acima ou à direita dos caracteres. Use o
Elementos < rt > e < rp > com o elemento < ruby > para colocar a notaçã o ou para colocar
parênteses ao redor do rubi. Use o elemento < bdo > para definir a direçã o do texto e use o
elemento < bdi > para isolar um bloco de texto para definir a direçã o do texto.
HTML5 define vá rios elementos semâ nticos que podem ser usados para criar listas
ordenadas, nã o ordenadas e descritivas. Todas as listas possuem itens de lista, que sã o
implementados usando o elemento < li >. Todas as listas suportam aninhamento de
listas. Esta seçã o descreve cada uma dessas listas.
Listas ordenadas
Chave
<ol>
</ol>
Essa lista é automaticamente renderizada com nú meros ao lado de cada item da lista de
frutas, conforme mostrado na Figura 5-5.
O atributo reverso atualmente nã o funciona na maioria dos navegadores, mas você pode
encontrar bibliotecas JavaScript, como modernizr.j s , que emulam essa funcionalidade até
que o recurso seja implementado pelo fabricante do navegador. Mesmo se você definir o
tipo para um valor como "A", Liçã o 1: Pensando na semâ ntica HTML5, CAPÍTULO 5
221
você ainda define o início como um nú mero. O seguinte é um exemplo dos atributos type e
start, usando a lista de frutas favoritas.
</ol>
A Figura 5-6 mostra a lista renderizada. O valor inicial de “6” se traduz na letra “F” quando
renderizado.
FIGURA 5-6 A lista ordenada com seu tipo e conjunto de atributos iniciais Listas não
ordenadas
Termos mostrados no exemplo a seguir que descreve os itens necessá rios para reparar um
pneu furado.
<h3> Itens necessá rios para trocar um pneu furado </h3>
<ul>
<li> Uma chave inglesa com um soquete em uma extremidade e uma alavanca na outra
</li>
</ul>
Cada item é renderizado com um bul et, e onde o texto quebra para a pró xima linha, o texto
se alinha adequadamente com o texto da linha anterior, conforme mostrado na Figura 5-7.
FIGURA 5-7 A lista desordenada renderizando cada item da lista como um conjunto
de listas de descrição
Use o elemento < dl > para criar uma lista de descriçã o, que consiste em zero ou mais
agrupamentos de descriçã o de termos, também conhecidos como pares nome-valor ou
valor-chave. Cada agrupamento associa um ou mais termos ou nomes, que sã o o conteú do
dos elementos < dt >, com uma ou mais descriçõ es ou valores, que sã o o conteú do
dos elementos < dd >, conforme mostrado no exemplo a seguir.
<dl>
<dd> Um pequeno veículo impulsionado na á gua por remos, velas ou um motor </dd>
<dd> Um veículo com duas rodas em tandem, normalmente propulsionado por pedais
conectados à roda traseira por uma corrente e tendo guidã o
</dl>
Neste exemplo, o barco está associado a uma ú nica definiçã o. O carro está associado a duas
definiçõ es. A bicicleta e a bicicleta estã o ambas associadas à mesma definiçã o. A saída
renderizada é mostrada na Figura 5-8.
223
FIGURA 5 -8 A lista de definiçõ es com seus termos e definiçõ es Listas personalizadas
Você pode criar listas personalizadas usando os estilos CSS3 e pode usar o contador CSS3 e
os seletores: before e: after. Considere a lista a seguir, que contém listas aninhadas.
<ul c lass = "level1">
<li> BMW
<li> X1 </li>
<li> X3 </li>
<li> Z4 </li>
</ul>
</li>
<li> Chevrolet
</ul>
</li>
<li> Ford
</ul>
</li>
</li>
<li> barcos
</ul>
</li>
</ul>
A Figura 5-9 mostra a lista renderizada com os estilos padrã o. As formas do bul et mudam
com cada nível de aninhamento, e cada nível de aninhamento é automaticamente
indentado.
No Visual Studio Express 2012 for Web, você pode abrir o arquivo CSS e inserir o seletor da
seguinte maneira.
li {
225
Depois que o seletor for adicionado, você pode clicar com o botã o direito do mouse na
regra de estilo e escolher Construir Estilo para exibir um menu de estilos a serem
aplicados. Clicar em Lista no menu Categoria exibe os estilos que podem ser aplicados a
uma lista. A Figura 5-10 mostra a janela Modificar Estilo.
Figura 5-10 A janela Modificar estilo mostrando configuraçõ es de estilo baseada em menu
usando a janela Modificar estilo, você pode facilmente substituir a configuraçã o padrã o
da lista de estilo do tipo e list-style-position . Além disso, você pode fornecer
uma imagem em estilo de lista quando os símbolos da lâ mpada nã o forem o que você
deseja. Neste exemplo, defina o estilo do item de lista como nenhum e clique em OK. A folha
de estilo agora contém a regra de estilo modificada conforme a seguir .
li {
Tente renderizar a pá gina da web e observe que nenhum bul ets é exibido. Experimente
muitas das outras configuraçõ es para ver como elas sã o renderizadas.
Em vez de usar a janela Modificar estilo, você pode digitar as regras de estilo. Quando você
está digitando as regras, o IntelliSense ajuda a reduzir o nú mero de pressionamentos de
tecla. Quando o menu IntelliSense aparecer, você pode selecionar um item e pressionar a
tecla tab. No arquivo CSS, insira as seguintes regras de estilo.
corpo {
contra-incremento: seçã o;
contra-incremento: subseçã o;
conteú do: contador (seçã o) "(" contador (subseçã o, alfa inferior) ") -";
}
ul.level3> li {
A seguir está uma descriçã o de cada uma das regras de estilo neste exemplo.
■■ A primeira regra de estilo redefine um contador de seçã o definido pelo usuá rio para um
quando o elemento < body > é estilizado. O contador de seçã o será definido como um
somente depois que a pá gina for carregada, mas será incrementado em uma regra de estilo
diferente.
■■ A quarta regra de estilo define o tipo de estilo de lista como nenhum para itens de lista
de nível1 e nível2.
■■ A quinta regra de estilo define a regra de estilo de lista para o disco para itens de lista de
nível3.
A saída renderizada é mostrada na Figura 5-11. Isso deve dar uma boa ideia dos recursos
do HTML5 ao trabalhar com listas.
227
Resumo da lição
■■ A marcaçã o semâ ntica fornece significado aos elementos HTML para auxiliar os
dispositivos que consomem conteú do HTML.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
opçã o de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você está criando uma pá gina da Web que exibirá histó rias curtas e deseja que as
histó rias possam ser compartilhadas em outros sites. Com qual elemento cada histó ria
deve ser envolvida?
A. < seção >
B. < pré >
C. < aparte >
D. < artigo >
2. Você deseja indicar um item importante em seu texto de conteú do. Qual elemento você
usa?
A. < b >
B. < em >
C. < forte >
D. < i >
3. Você deseja identificar o autor das pá ginas da web em seu site, fornecendo o nome do
autor e o endereço de e-mail no rodapé de cada pá gina. Qual é a maneira correta de fazer
isso?
229
Aqui estã o alguns motivos pelos quais você nã o deve usar o elemento < table > para criar
um layout de pá gina.
■■ A tabela nã o será renderizada até que a tag </ table > seja lida. As pá ginas da Web
devem ser escritas com marcaçã o semâ ntica e o elemento principal < div role = ”main” >
deve estar o mais pró ximo possível do topo do documento HTML. O elemento < div >
renderizará seu conteú do conforme o navegador o recebe. Isso permite que o usuá rio leia o
conteú do à medida que ele é carregado no navegador.
■■ Usar uma tabela força você a uma estrutura HTML profundamente aninhada que é
difícil de manter.
Você pode criar uma tabela bá sica usando o elemento < table > para denotar a
tabela. Dentro de
elemento < tabela >, você pode adicionar um elemento < tr > para cada linha que você
precisa. Dentro de cada elemento < tr >, adicione elementos < td > para cada célula que
você precisa. O que se segue é uma tabela simples de informaçõ es do veículo.
<table>
<tr>
</tr>
<tr>
</tr>
<tr>
<td> 2012 </td>
<td> Z4 </td>
</tr>
<tr>
</tr>
</table>
A Figura 5-12 mostra a saída renderizada como quatro linhas com três colunas em cada
linha. Nã o é ó bvio que haja colunas em cada linha, no entanto, e nã o há nenhum
aquecedor ou rodapé.
Você também pode querer ver uma borda ao redor de todas as células para tornar a tabela
mais ó bvia. Esta tabela precisa de melhorias. As cores alternadas das colunas melhorariam
isso?
<tr>
</tr>
<tr>
<th> 1 </th>
</tr>
<tr>
<th> 2 </th>
</tr>
<tr>
<th> 3 </th>
<td> Z4 </td>
</tr>
<tr>
<th> 4 </th>
231
</tr>
</ tab le>
A tabela renderizada é mostrada na Figura 5-13. Esta tabela revisada agora tem cabeçalhos
horizontais e verticais. Observe que o estilo padrã o do < th > elemento é negrito.
Agora que você tem < th > elementos para os cabeçalhos, adicione um estilo aos < th >
elementos conforme a seguir.
º{
largura: 100px;
}
Isso adiciona um fundo azul claro a todos os < th > elementos e define a largura de todas as
colunas em 100 pixels. Que mudanças você pode fazer para dar estilos diferentes aos
cabeçalhos horizontal e vertical? O exemplo a seguir pode realizar essa tarefa.
º{
largura: 100px;
A primeira regra de estilo define a cor de todos os < th > elementos para um azul claro e
define a largura para 100 pixels. A segunda regra de estilo tem uma prioridade mais alta,
portanto, substitui a primeira regra de estilo e aplica uma cor amarela pá lida ao cabeçalho
vertical.
Você também pode ter vá rias linhas que devem ser usadas como cabeçalhos ou rodapés
horizontais.
Você pode usar o elemento < thead > para identificar linhas que sã o linhas de cabeçalho e
usar o elemento < tfoot > para identificar linhas que sã o linhas de rodapé. O seguinte é um
exemplo da adiçã o dos elementos < thead >, < tfoot > e < tbody >.
<table>
<thead>
<tr>
<th> Veículo # </th>
</tr>
</thead>
<tbody>
<tr>
<th> 1 </th>
</tr>
<tr>
<th> 2 </th>
</tr>
<tr>
<th> 3 </th>
<td> Z4 </td>
</tr>
<tr>
<th> 4 </th>
</tr>
</tbody>
<tfoot>
233
<tr>
<th> </th>
<th> </th>
<th> </th>
</tr>
</tfoot>
</table>
Além de adicionar estrutura à tabela, você pode usar o < thead >, < tbody > e
< tfoot > elementos para controlar melhor o estilo dos < th > elementos. Sem esses
elementos, como você forneceria um estilo diferente para o cabeçalho e o rodapé? As
seguintes regras de estilo fornecem um exemplo desse estilo.
thead th {
largura: 100px;
tbody th {
tfoot th {
td {
td: ú ltimo do tipo {
A tabela renderizada é mostrada na Figura 5-14. A seguir está uma descriçã o das regras de
estilo aplicadas.
■■ A primeira regra de estilo aplica uma cor de fundo azul ao cabeçalho e define a largura
de todas as colunas em 100 pixels.
</head>
<body>
<table>
<thead>
<tr>
</tr>
</thead>
<tbody id = "antiqueCars">
<tr>
<th> 1 </th>
</tr>
<tr>
<th> 2 </th>
235
</tr>
</tbody>
<tbody id = "nonAntiqueCars">
<tr>
<th> 3 </th>
<td> Z4 </td>
</tr>
<tr>
<th> 4 </th>
</tr>
</tbody>
<tfoot>
<tr>
<th> </th>
<th> </th>
<th> </th>
</tr>
< / tfoot>
</table>
</div>
</body>
</html>
<script>
iniciar();
</script>
Este exemplo mostra o documento HTML completo, para que você possa ver a inclusã o do
CSS
arquivo e arquivo JavaScript. O HTML foi estendido para incluir dois botõ es na parte
superior para que você possa filtrar por Carros Antigos ou Nã o-Antigos. Existem
dois elementos < tbody >, cada um tendo uma id explícita de antiqueCars e nonAntiqueCars,
respectivamente, e um elemento < script > na parte inferior que inicializa o JavaScript, que
anexará manipuladores de eventos ao evento click dos botõ es. O arquivo CSS foi
ligeiramente modificado em relaçã o ao exemplo anterior, conforme a seguir.
thead th {
largura: 100px;
tbody th {
tfoot th {
td {
td: ú ltimo do tipo {
.escondido {
Mostrar nenhum;
.visível {
display: normal;
O arquivo CSS agora tem os seletores .hidden e .visible. Eles sã o usados para mostrar ou
ocultar o
function init () {
function showAntiqueCars () {
function showNonAntiqueCars () {
document.getElementById ('antiqueCars'). className =
"oculto"; document.getElementById ('nonAntiqueCars'). className = "visible";
O có digo JavaScript contém uma funçã o init que é chamada quando o documento HTML é
carregado. A funçã o init anexa manipuladores de eventos ao evento click dos dois
botõ es. As funçõ es adicionais definem a classe CSS para exibir ou ocultar
os elementos < tbody >.
237
O atributo colspan informa ao navegador que um elemento < td > ou < th > deve ter o
tamanho de vá rias células horizontais. No exemplo anterior, onde você deseja que o texto
“Total:” apareça na linha de rodapé, use <th colspan = ”4”> como a seguir.
<tfoot>
<tr>
</tr>
</tfoot>
tfoot th {
Você poderia apenas alinhar à direita todos os < th > elementos no rodapé eliminando as
duas ú ltimas regras de estilo neste exemplo e adicionando o estilo de alinhamento de texto
à primeira regra de estilo. A saída renderizada é mostrada na Figura 5-15.
FIGURA 5-15 A pá gina renderizada com o rodapé contendo apenas duas células O atributo
rowspan diz ao navegador que um < td > ou < th > elemento deve ter o tamanho de vá rias
células verticais. No exemplo anterior, quando você deseja adicionar uma coluna com
apenas dois células, use < td rowspan = ”n” > onde n é igual ao nú mero de linhas a serem
estendidas, neste caso, 2.
Lembre-se de que adicionar uma coluna também requer que você adicione a coluna ao
cabeçalho e modifique o atributo colspan no rodapé. A seguir está a tabela modificada.
<table>
<thead>
<tr>
</tr>
</thead>
<tbody id = "antiqueCars">
<tr>
<th> 1 </th>
</tr>
<tr>
<th> 2 </th>
</tr>
</tbody>
<tbody id = "nonAntiqueCars">
<tr>
<th> 3 </th>
239
<td> Z4 </td>
</tr>
<tr>
<th> 4 </th>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan = "5"> Total: </th>
</tr>
</tfoot>
</table>
Para ajudar a ilustrar os atributos rowspan e colspan, uma borda preta é adicionada à s
células da tabela. A seguir está o arquivo CSS completo.
tabela {
thead th {
largura: 100px;
tbody th {
tfoot th {
td {
º{
.escondido {
Mostrar nenhum;
.visível {
display: normal;
Você pode usar o elemento < caption > para definir e associar uma legenda a uma
tabela. O estilo padrã o da legenda é centralizado e localizado acima da tabela. Você pode
usar as propriedades CSS de alinhamento de texto e legenda para substituir o estilo
padrã o. Se você usar o elemento < caption >, ele deve ser o primeiro elemento dentro do
elemento < table >.
S tyling colunas
O estilo das colunas é uma dificuldade comum porque as tabelas sã o centradas em linha,
nã o em coluna.
É relativamente fá cil aplicar um estilo a uma linha porque você pode aplicar
um elemento < tr > ao estilo, mas nã o há um elemento < tc > para uma coluna. Lembre-se
de que o elemento < td > representa uma célula, nã o uma coluna. Na verdade, as colunas
sã o criadas implicitamente, criando as células. Use os elementos < colgroup > e < col >
para definir o estilo das colunas.
241
elemento < colgroup >, elementos < col > sã o adicionados para cada coluna a ser
estilizada. O elemento < col > possui um atributo span que identifica vá rias colunas que
terã o o mesmo estilo.
<colgroup>
</colgroup>
Este exemplo define as duas primeiras colunas para ter um estilo de verticalHeader. A
classe verticalHeader é configurada para aplicar uma cor de fundo cinza da seguinte
maneira.
.verticalHeader {
Além disso, o estilo existente para a primeira coluna foi removido. A Figura 5-17 mostra a
pá gina da web renderizada.
■■ Use os atributos rowspan e colspan nos elementos < th > e < td > para criar tabelas
irregulares.
Revisão da aula
1. Você está criando uma pá gina da Web que será usada para exibir uma lista
de vendedores com suas estatísticas de vendas para os anos de 2010, 2011 e 2012 em duas
categorias: vendas de produtos e vendas de serviços. Você deseja que cada um dos anos
esteja no cabeçalho horizontal e, abaixo de cada ano, você terá uma coluna “Produtos” e
uma coluna “Serviços”. Como você definirá o elemento para o ano de 2011?
B. < th colspan = ”2” > 2011 </ th > C. < th span = ”2” > 2011 < / th > D. < th style = ”2” >
2011 < / th > 2. Você deseja fornecem a capacidade de exibir ou mostrar colunas, mas
você nã o deseja adicionar um estilo ou outra marcaçã o a cada elemento < td >. Como você
pode fazer isso?
3. Qual elemento você pode adicionar ao elemento < table > para fornecer uma legenda de
tabela?
A. < thead >
B. < colgroup >
C. < legenda >
D. < th >
Pratica exercícios
243
Este exercício continua com o objetivo de adicionar regras de estilo com um mínimo de
modificaçõ es no arquivo default.html.
1. Inicie o Visual Studio Express 2012 for Web. Clique em Arquivo, escolha Abrir projeto e
selecione a soluçã o que você criou no Capítulo 4.
<cabeçalho>
<hgroup id = "he aderText">
</hgroup>
</header>
Isso será exibido na pá gina para lhe dar uma ideia de para que o elemento < nav > é
usado . O elemento < nav > deve ser semelhante ao seguinte.
<nav>
</nav>
<div id = "calculator">
</ di v>
</div>
<ao lado>
</aside>
<footer>
</p>
</footer>
<head>
</head>
<body>
<div id = "container">
<cabeçalho>
<hgroup id = "headerText">
</hgroup>
</header>
<nav>
</nav>
<div id = "calculator">
</div>
</div>
<ao lado>
</aside>
<footer>
</p>
</footer>
</div>
</script>
</body>
</html>
1. Abra o arquivo default.css e, na parte superior do arquivo, adicione uma regra de estilo
para definir a margem e o preenchimento de todos os elementos como 0 pixels.
2. Depois dessa regra de estilo, insira outra regra de estilo que defina < aparte >,
< rodapé >, < cabeçalho >,
Os elementos < hgroup > e < nav > devem ser exibidos como um bloco para garantir que
todos os b rowers renderizem esses elementos como blocos.
display: bloco;
A cor de fundo da pá gina atual é azul escuro. Essa cor de fundo precisa ser iluminada e
a família da fonte precisa ser configurada para Cambria com uma fonte de backup Times
New Roman e o verso final da fonte com serifa. A cor da fonte deve ser definida para
corresponder ao azul padrã o da Contoso. Sua regra de estilo de corpo deve ser modificada
para corresponder ao seguinte.
corpo {
cor: # 0068AC;
3. Para adicionar uma nova pasta chamada Imagens ao projeto, clique com o botã o direito
do mouse no projeto na janela do Solution Explorer. Clique em Adicionar, selecione Nova
Pasta e nomeie os folde r Imagens .
4. Para adicionar a imagem da pasta Resource, na janela Solution Explorer, clique com o
botã o direito na pasta Images que você acabou de adicionar.
6. Apó s a regra de estilo do corpo, insira uma regra de estilo de cabeçalho que defina a
altura em 100 pixels e defina a imagem de plano de fundo para o arquivo Contoso Logo.png.
7. Defina a repetiçã o de fundo como sem repetiçã o e defina a margem superior para 10
pixels adicionando o seletor de cabeçalho com as chaves, clicando com o botã o direito do
mouse na regra de estilo e clicando em Construir estilo. Quando a janela Modificar estilo for
exibida, defina as propriedades.
header {
altura: 100px;
9. Defina a largura em 100 por cento e defina a margem superior em 10 pixels, conforme a
seguir.
#headerText {
posiçã o: absoluta;
247
topo: 0px;
esquerda: 80px;
largura: 100%;
}
10. Apó s a regra de estilo headerText, insira uma regra de texto para
o elemento < h1 >. Adicione estilos para definir o tamanho da fonte para 64 pixels e defina a
altura da linha para 55 pixels, conforme a seguir.
h1 {
11. Apó s a regra de estilo h1, insira uma regra de texto para o elemento < h2 >. Adicione
estilos para definir o tamanho da fonte para 18 pixels, defina a altura da linha para 20
pixels e defina o estilo da fonte para itá lico da seguinte maneira.
h2 {
12. Apó s a regra de estilo h2, crie uma regra de estilo para o elemento < nav >. Defina os
estilos para flutuar o elemento < nav > para a esquerda, defina a largura em 20 por cento e
defina a largura mínima em 125 pixels, conforme a seguir.
nav {
flutuar: esquerda;
largura: 20%;
flutuar: esquerda;
largura: 60%;
14. Apó s a regra de estilo div principal, adicione uma regra de estilo para
o elemento < aparte >. Defina os estilos para flutuar à esquerda, ao lado
do elemento < div > principal , defina a largura para 20 por cento e defina a largura mínima
para 125 pixels, conforme a seguir.
a parte, de lado {
flutuar: esquerda;
largura: 2 0%;
rodapé {
limpar ambos;
largura: 100%;
altura: 70px;
16. Apó s a regra de estilo do rodapé, adicione uma regra de estilo para o elemento < div >
cujo id é container.
O objetivo deste estilo é garantir que os estilos float: left que você adicionou nã o quebrem
quando a janela do navegador for redimensionada para um tamanho pequeno.
#container {
largura mínima: 800px;
18. Na regra de estilo existente para o elemento < div > da calculadora , altere a altura e a
largura para 400 pixels da seguinte forma.
#calculadora {
borda: só lida;
largura: 400px;
altura: 400px;
preenchimento: 10px;
19. Na regra de estilo existente para o botã o de entrada, altere o tamanho da fonte para 20
pontos conforme a seguir.
input, button {
margem: 5px;
display: bloco;
249
corpo {
cor: # 0068AC;
header {
altura: 100px;
#headerText {
posiçã o: absoluta;
topo: 0px;
esquerda: 80px;
largura: 100%;
h1 {
h2 {
nav {
flutuar: esquerda;
largura: 20%;
flutuar: esquerda;
largura: 60%;
}
a parte, de lado {
flutuar: esquerda;
largura: 20%;
rodapé {
limpar ambos;
largura: 100%;
altura: 70px;
#container {
#calculadora {
borda: só lida;
largura: 400px;
altura: 400px;
preenchimento: 10px;
entrada {
largura: 85%;
altura: 7%;
preenchimento: 10px;
borda: inserçã o;
botã o {
largura: 25%;
altura: 10%;
fronteira: início;
botã o: hover {
botã o: ativo {
borda: inserçã o;
input, button {
margem: 5px;
[somente leitura] {
251
20. Para ver seus resultados, pressione F5 para iniciar a depuraçã o do aplicativo.
Você deve ver uma interface de calculadora mais bonita com um layout de pá gina,
conforme mostrado na Figura 5-18.
5. Cerque a caixa de texto txtResult com uma célula de tabela que se estende por quatro
colunas. Cerque a célula da mesa com uma linha de mesa.
<tr>
</td>
</tr>
<tr>
</td>
</tr>
A pró xima linha da tabela terá duas colunas vazias, para botõ es futuros e, em seguida,
uma coluna para o botã o de limpar entrada e outra coluna para o botã o de limpar,
conforme a seguir.
<tr>
<td> </td>
<td> </td>
</tr>
A pró xima linha da tabela terá os botõ es 7, 8, 9 e o botã o mais como a seguir.
<tr>
<td>
<td>
<td>
<td>
</td>
</tr>
A pró xima linha da tabela terá os botõ es 4, 5, 6 e o botã o menos como a seguir.
<tr>
<td>
</td>
<td>
</td>
<td>
253
</td>
<td>
</td>
</tr>
A pró xima linha da tabela terá os botõ es 1, 2 e 3 e uma coluna vazia como a seguir.
<tr>
<td>
</td>
<td>
</td>
<td>
</td>
<td>
</td>
</tr>
A ú ltima linha da tabela terá uma coluna vazia, o botã o 0 e mais duas colunas vazias
conforme a seguir.
<tr>
<td> </td>
<td>
</td>
<td> </td>
<td> </td>
</tr>
<div id = "calculator">
<table>
<tr>
</td>
</tr>
<tr>
</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
<td>
<td>
<td>
</td>
</tr>
<tr>
<td>
</td>
<td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>
<button id = "btn0"> 0 </button>
</td>
<td> </td>
<td> </td>
</tr>
</table>
</div>
</div>
255
7. Agora que o arquivo default.html foi concluído, modifique a folha de estilo abrindo o
arquivo default.css e, na parte inferior, adicionando o seletor de tabela e definindo a
largura para 100 por cento, conforme a seguir.
tabela {
largura: 100%;
td {
largura: 25%;
botã o {
largura: 90%;
altura: 10%;
fronteira: início;
entrada {
largura: 85%;
altura: 7%;
preenchimento: 5px;
borda: inserçã o;
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Aprenda mais sobre marcaçã o semâ ntica adicionando seçõ es adicionais à
sua pá gina da web.
■■ Exercício 2 Aprenda mais sobre tabelas adicionando mais linhas e células à mesa para
segurar os botõ es futuros.
Respostas
Lição 1
1. Resposta correta: D
D. Correto: um artigo envolve itens autô nomos que podem ser compartilhados.
2. Resposta correta: C
3. Resposta correta: A
B. Incorreto: O elemento < contato > nã o é vá lido.
D. Incorreto: O elemento < nome > nã o é vá lido.
Lição 2
1. Resposta correta: B
D. Incorreto : O atributo de estilo nã o pode ser usado para causar expansã o em duas
colunas.
2. Resposta correta: A
D. Incorreto: O elemento < oculto > nã o é vá lido.
3. Resposta correta: C
Respostas CAPÍTULO 5
259
CAPÍTULO 6
JavaScript essencial e
jQuery
Este capítulo também apresenta o jQuery, a resposta para escrever có digo compatível com
o navegador.
261
Lição 1: Criando objetos JavaScript
Em muitas linguagens orientadas a objetos, quando você deseja criar objetos, você começa
criando uma classe , que é um projeto para um objeto. Como a planta de uma casa, a planta
nã o é a casa; sã o as instruçõ es que definem o tipo de objeto que você vai construir, que
Cada vez que você constró i um objeto Player, a memó ria é alocada para armazenar os
dados do jogador, e cada dado é uma propriedade, que tem um nome e um valor.
Termos para se comunicar com seu objeto a fim de simplificar o objeto para qualquer
pessoa que o use.
Herança significa que você pode criar um relacionamento “é um” entre duas classes, em
que a classe filha herda automaticamente tudo o que está na classe pai. Polimorfismo
significa que você pode executar uma funçã o na classe pai, mas o comportamento muda (se
transforma) porque sua classe filha tem uma funçã o que sobrescreve a funçã o na classe pai.
Termos é fá cil pensar em filhos reais herdando dos pais, os termos pai e filho sã o
normalmente usados, mas você deve se lembrar dos outros termos para essas classes para
se comunicarem efetivamente com outras pessoas sobre a programaçã o orientada a
objetos.
Termos
JavaScript é uma linguagem muito flexível. Você pode criar objetos, mas a relaçã o entre a
linguagem JavaScript e a programaçã o orientada a objetos baseada em classes nã o é
direta. O exemplo mais flagrante é que nã o há palavra-chave de classe na
criptografia JavaS. Se você está familiarizado com a programaçã o orientada a objetos
baseada em classes, terá dificuldade em encontrar a “classe”.
Chave
Conceitualmente, você pode simular a criaçã o de classe usando uma funçã o. Os puristas
baseados em classes e orientados para termos de objetos nã o gostam da ideia de uma
funçã o usada para simular uma classe. Mantenha a mente aberta enquanto os padrõ es sã o
apresentados. Esta liçã o deve fornecer o que você precisa para realizar suas tarefas.
O problema que você normalmente encontra é encontrar uma soluçã o correta para todos
os cená rios. Ao continuar lendo, você descobrirá que, para atingir o encapsulamento
adequado de dados privados, é necessá rio criar có pias das funçõ es que podem acessar os
dados privados para cada instâ ncia do objeto, o que consome memó ria. Se você nã o quiser
criar có pias do método para cada instâ ncia do objeto, os dados precisam ser expostos
publicamente, perdendo assim os benefícios do encapsulamento, pelo qual você oculta os
detalhes do objeto que os usuá rios nã o deveriam precisar ver.
Isso começa com um conjunto de chaves para indicar um objeto. Dentro das chaves está
uma lista separada por vírgulas de pares nome / valor para definir cada
propriedade. Literais de objeto criam um objeto do nada, portanto, esses objetos contêm
precisamente o que você atribui a eles e nada mais.
Nenhum objeto de protó tipo está associado ao objeto criado. O exemplo a seguir demonstra
a criaçã o de dois objetos que representam veículos.
var car1 = {
ano: 2000,
fazer: 'Ford',
modelo: 'Fusion',
getInfo: function () {
};
263
var car2 = {
ano: 2010,
fazer: 'BMW',
modelo: 'Z4',
getInfo: function () {
};
Para testar esse có digo, o teste QUnit a seguir verifica se cada objeto contém os dados
esperados.
esperar (2);
});
Este teste executa uma asserçã o usando a variá vel car1 e, em seguida, executa outra
asserçã o usando a variá vel car2 . O teste bem-sucedido é mostrado na Figura 6-1 .
Se quiser definir uma matriz de itens e atribuí-la a uma propriedade, você pode usar
colchetes, conforme mostrado no exemplo a seguir.
var car1 = {
ano: 2000,
fazer: 'Ford',
modelo: 'Fusion',
getInfo: function () {
return 'Vehicle:' + this.ano + '' + this.make + '' + this.model;
};
Como essa é uma das maneiras mais fá ceis de criar um objeto, você provavelmente o usará
para coletar dados e enviar a outro có digo. Neste exemplo, duas instâ ncias de um tipo
Object sã o criadas e as propriedades sã o adicionadas dinamicamente a cada instâ ncia. Isso
nã o cria um tipo de veículo.
Além de usar a sintaxe de objeto literal do JavaScript, o JavaScript tem um tipo de objeto e
você pode usá -lo para criar um objeto de forma programá tica. Object possui um objeto
protó tipo que é clonado quando você usa a nova palavra-chave para criar uma nova
instâ ncia de Object. O objeto de protó tipo possui os seguintes métodos herdados.
265
Depois que o objeto é criado, você pode adicionar dinamicamente propriedades a ele que
contêm os dados e as funçõ es de referência. Você pode envolver esse có digo em uma
funçã o que retorna o objeto, conforme mostrado no seguinte exemplo de có digo.
veiculo.ano = oAno;
veículo.make = theMake;
veículo.modelo = oModelo;
Vehicle.getInfo = function () {
};
veículo de retorno;
Termos para chamar a funçã o getVehicle para obter um novo objeto. O encapsulamento do
có digo para criar um objeto é comumente referido como usando o padrão de fábrica . Você
pode criar vá rias instâ ncias de veículo? Você pode criar vá rias instâ ncias de Objeto e
adicionar propriedades dinâ micas a cada instâ ncia, mas o tipo real é Objeto, nã o veículo. O
teste QUnit a seguir demonstra a criaçã o de vá rias instâ ncias .
esperar (2);
});
Isso pode ser tudo de que você precisa quando está coletando alguns dados para colocar
em uma estrutura de objeto e passar para algum outro có digo ou serviço. Embora a funçã o
getVehicle encapsule a criaçã o do objeto, as propriedades sã o todas pú blicas. Isso pode ser
desejá vel em alguns cená rios, mas se você quiser que os dados sejam privados, essa
abordagem nã o funcionará . Como ao usar a sintaxe de objeto literal, você pode encontrar o
problema de que cada tipo de veículo é Objeto, e você pode querer criar uma classe Vehicle
para ter um tipo de Vehicle nomeado.
Criação de uma classe
ano = oAno;
make = theMake;
model = theModel;
getInfo = function () {
};
Existem vá rios problemas com este có digo. Todas as variá veis sã o definidas sem a palavra-
chave var , portanto, year , make , model e getInfo sã o definidos automaticamente no escopo
global e sã o acessíveis de qualquer lugar. O seguinte é um teste QUnit de aprovaçã o que
inicializa o Veículo e chama o método getInfo para recuperar os dados.
esperar (2);
esperado = 2.000;
real = ano;
});
A funçã o Vehicle aceita três parâ metros e nã o retorna nada. Em vez disso, está definindo
variá veis globais e nã o há provisã o para vá rias instâ ncias. Para provar que as variá veis
globais estã o sendo definidas, a segunda afirmaçã o é verificar se há uma variá vel global
chamada ano que é igual a 2.000. Essa afirmaçã o é bem-sucedida, o que prova que os dados
nã o estã o encapsulados e há apenas uma có pia dos dados. Por exemplo, o seguinte teste
QUnit falha.
esperar (1);
esperado = 2.000;
real = ano;
});
FIGURA 6-2 As afirmaçõ es de teste com falha depois que um segundo veículo é usado Para
resolver o problema, você deseja implementar o encapsulamento. Entã o você precisa criar
objetos , cada um com seus pró prios dados. Para implementar o encapsulamento, use
a palavra-chave var para o ano , marca e modelo . Isso tornará essas variá veis privadas para
a funçã o. Observe que a palavra-chave var nã o é usada com getInfo porque
a variá vel getInfo precisa ser pú blica para ser chamada de fora do objeto, mas você nã o
quer que a variá vel getInfo seja global. Atribua getInfo ao objeto atual usando
a palavra - chave this . O resultado é uma classe que encapsula os dados e
expõ e getInfo para recuperar os dados de uma forma controlada como a seguir.
this.getInfo = function () {
};
}
DADOS PRIVADOS IMPORTANTES NÃO SÃO SEGUROS
esperar (2);
esperado = 2.000;
real = ano;
});
Observe que uma nova variá vel é definida, car1 , e atribuída ao objeto que é criado usando
a nova palavra-chave. Depois disso, uma outra nova variá vel é definida, car2 , e é atribuído
o segundo objeto Vehicle criado usando a nova palavra-chave. Duas instâ ncias da classe
Vehicle estã o sendo criadas, o que significa que dois objetos Vehicle estã o sendo
construídos. Cada instâ ncia possui seus pró prios dados e sua pró pria có pia do método
getInfo. O método getInfo é pú blico, mas tem acesso aos dados privados. Um método que é
pú blico, mas tem acesso a dados privados, é chamado de método privilegiado .
Chave
A Figura 6-3 mostra os resultados do teste. Observe que a primeira afirmaçã o foi aprovada,
o que prova que os Termos sã o instâ ncias de objeto separadas, cada uma com seus
pró prios dados. A segunda afirmaçã o falhou. A mensagem de falha informa que o ano é
indefinido, o que prova que o ano nã o está diretamente acessível a partir do teste, que está
no namespace global. Em vez disso, o ano , além da marca e do modelo , é encapsulado no
objeto.
Agora você criou uma classe e construiu objetos a partir da classe, mas há mais para cobrir
na funçã o Vehicle que está sendo usada como uma classe. A funçã o Veículo é conhecida
como função construtora . A nova palavra-chave criou um objeto e executou a funçã o de
construtor para inicializar o objeto, criando as variá veis privadas ano , marca e modelo e
chave
Termos a variá vel getInfo pú blica . Cada instâ ncia tem essas quatro variá veis e a memó ria é
alocada para elas. É isso que você deseja para os dados, mas é isso que deseja para
a variá vel getInfo que faz referência a uma funçã o? A resposta é que depende do que você
está tentando realizar com seu có digo.
269
FIGURA 6-3 Primeira asserçã o bem-sucedida e segunda asserçã o falhada Considere o
seguinte có digo de teste que cria dois objetos Vehicle, mas entã o substitui o có digo
em getInfo do primeiro objeto Vehicle por um có digo diferente. Isso substitui o có digo
no segundo objeto Veículo?
esperar (2);
car1.getInfo = function () {
};
});
você esperava? É isso que você queria? Você pode ver que em alguns cená rios, esse
comportamento é desejá vel, mas em outros cená rios, você pode querer substituir a funçã o
em todos os objetos. Para fazer isso, você usa o padrã o de protótipo .
este.ano = oAno;
271
this.make = theMake;
this.model = theModel;
Vehicle.prototype.getInfo = function () {
return 'Vehicle:' + this.ano + '' + this.make + '' + this.model;
Usando essa classe e o protó tipo, você pode escrever o seguinte teste para garantir que
cada instâ ncia tenha seus pró prios dados e que a funçã o getInfo funcione corretamente.
esperar (2);
});
Nesse teste, duas instâ ncias da classe Vehicle sã o criadas, cada uma com dados
diferentes. A primeira asserçã o chama getInfo em car1 e verifica se o resultado adequado é
retornado. A segunda afirmaçã o cal s getInfo em car2 e verifica que o resultado correto
é retornado. O resultado é mostrado na Figura 6-5.
FIGURA 6-5 A classe modificada usando a propriedade prototype para criar a funçã o
getInfo 272 CAPÍTULO 6 JavaScript e jQuery essenciais
Agora que você tem uma classe funcional, altere o protó tipo para ver se ele pode ser
alterado em todas as instâ ncias.
test ("Teste de instâ ncia usando funçã o de substituiçã o de protó tipo", function () {
esperar (2);
Vehicle.prototype.getInfo = function () {
});
Este teste cria duas instâ ncias Vehicle e, em seguida, altera getInfo. Em seguida, as duas
asserçõ es sã o modificadas para verificar ambas as instâ ncias para ver se estã o usando o
getInfo atualizado. O resultado é mostrado na Figura 6-6.
FIGURA 6-6 A modificaçã o do protó tipo getInf o afetou todas as instâ ncias. Você pode usar
a propriedade prototype ao criar funçõ es que serã o compartilhadas entre todas as
instâ ncias, mas lembre-se de que o protó tipo é definido externamente à funçã o do
construtor, portanto, todas as propriedades devem ser public
ao usar esta palavra - chave. Se você nã o precisa da Liçã o 1: Criando objetos
JavaScript, CAPÍTULO 6
273
substitua funçõ es de instâ ncia individuais e você nã o se importa em tornar seus dados
pú blicos, o protó tipo é eficiente.
Verificação rápida
Você aprendeu os padrõ es primá rios para criar um objeto JavaScript, mas pode haver um
meio-termo no qual você pode ter dados privados que podem ser lidos criando um método
para recuperar os dados, também conhecido como getter , que nã o tem setter , um método
para definir o valor. Isso exigiria que você escrevesse uma funçã o que é copiada para cada
objeto, mas você deve manter a funçã o o menor possível, conforme mostrado no exemplo
de có digo a seguir.
Vehicle.prototype.getInfo = function () {
'' + this.getMake () +
O teste QUnit para este có digo cria duas instâ ncias de Vehicle e, para cada asserçã o, executa
o método getInfo de cada objeto e verifica o valor adequado. O teste é o seguinte.
esperar (2);
});
274 CAPÍTULO 6 JavaScript e jQuery essenciais
Este teste foi bem- sucedido, portanto, substitua o método getInfo e adicione mais testes. O
có digo de teste a seguir faz isso.
esperar (4);
Vehicle.prototype.getInfo = function () {
+ 'Make:' + thi s.getMake ()
};
var esperado = 'Ano do carro: 2000 Marca: Modelo Ford: Fusion'; var real =
car1.getInfo ();
});
Verificação rápida
■■ Adicione um método getter que recupera os dados, mas não pode alterar os
dados.
275
FIGURA 6-7 O uso de getters para expor dados somente leitura como um bom
compromisso Implementando namespaces
var VehicleCount = 5;
funçã o Car () {}
funçã o Truck () {}
var repair = {
custo: 100
};
Este exemplo de có digo coloca cinco entradas no namespace global e, conforme o aplicativo
cresce, essa pol uçã o de namespace global também aumenta. Você pode implementar o
padrã o de namespace para resolver o problema. O exemplo a seguir mostra a criaçã o de um
objeto que contém os cinco itens do exemplo anterior.
myApp.vehicleCount = 5;
myApp.Car = function () {}
myApp.Truck = function () {}
myApp.repair = {
custo: 100
};
Você pode ver que um namespace foi criado criando um objeto. Embora apenas uma
entrada seja feita no namespace global, todos os membros do myApp sã o acessíveis
globalmente. Além disso, se você criar um namespace para seu aplicativo e seu aplicativo
tiver muitos arquivos JavaScript, você pode querer ter ló gica para criar o objeto de
namespace apenas se ele nã o tiver sido criado. No exemplo a seguir , o có digo para myApp
é modificado para criar o objeto de namespace se ele ainda nã o existir. Este có digo usa o
operador OR para criar um novo objeto se myApp nã o tiver um valor.
Você pode usar as técnicas de objeto já definidas nesta liçã o para tornar alguns membros
do namespace privados e alguns pú blicos. A diferença é que o namespace é um objeto
singleton, portanto, você cria uma ú nica instâ ncia para o namespace. Você nã o precisa se
preocupar com as funçõ es definidas na funçã o de construçã o que consomem memó ria
adicional para cada instâ ncia porque há apenas uma instâ ncia. Aqui está um exemplo do
uso de um imediatamente invocada expressão da função (IIFE) para criar o namespace
myApp em que Car e Truck sã o pú blicos, mas vehicleCoun t , veículos e reparação sã o
privados.
(funçã o () {
var ns = this.myApp;
var VehicleCount = 5;
ns.Car = funçã o () {}
ns.Truck = function () {}
var repair = {
custo: 100
};
} ());
Liçã o 1: Criando objetos JavaScript CAPÍTULO 6
277
Neste IIFE, a primeira linha cria o namespace myApp se ele ainda nã o existir, o que
representa o objeto singleton que é usado como o namespace. Em seguida,
uma variá vel ns (para namespace) é criada como um alias para o namespace para salvar a
digitaçã o dentro do IIFE, para que ns possa ser usado no lugar de this.myApp. Depois disso,
os membros privados do namespace sã o definidos usando a palavra-
chave var . Car e Truck sã o pú blicos, por isso sã o prefixados com ns .
(funçã o () {
var ns = rootNs.billing;
Implementando herança
this.ano = ano;
this.make = make;
this.model = model;
Vehicle.prototype.getInfo = function () {
};
Vehicle.prototype.startEngine = function () {
return 'Vroom';
};
retorno do veículo;
}) ();
Esta aula está envolvida em um IIFE. O wrapper encapsula a funçã o e o protó tipo do
Veículo. Nã o há tentativa de tornar os dados privados. O có digo funciona da seguinte forma.
■■ O protó tipo da funçã o Veículo define as funçõ es getInfo e startEngine que estã o em
todas as instâ ncias do Veículo.
Essa é uma ó tima maneira de criar uma classe e todos os exemplos de classes futuras usam
esse padrã o. Para criar objetos Veículo, você usa a nova palavra-chave com
a variá vel Veículo . O teste a seguir cria uma instâ ncia de Vehicle e testa os métodos
getInfo e startEngine.
esperar (2);
});
Agora que você tem uma classe pai V ehicle com três propriedades e dois métodos, você
pode criar classes filhas para Car e Boat que herdam de Vehicle. Comece escrevendo um
IIFE, mas, desta vez, passe o Veículo para o IIFE da seguinte forma.
var Car = (funçã o (pai) {
}) (Veículo );
Como Veículo neste exemplo é a variá vel Veículo , nã o a funçã o Veículo, Carro precisa ser
definido apó s Veículo. O veículo é passado para o IIFE e está disponível dentro do IIFE
como pai . Em seguida, a funçã o para Car pode ser adicionada dentro do IIF E. Dentro da
funçã o, adicione quaisquer propriedades adicionais, como wheelQuantity e inicialize para
quatro. Na funçã o, chame o construtor da classe pai para Car para alocar slots de memó ria
para o ano, marca e modelo.
Para chamar a funçã o de construtor pai , use um método cal que existe no objeto Function,
Liçã o 1: Criando objetos JavaScript CAPÍTULO 6
279
que aceita um parâ metro para este objeto e parâ metros para os parâ metros da funçã o que
está sendo chamada, conforme a seguir.
this.wheelQuantity = 4;
return Car;
})(Veículo);
Em seguida, a herança deve ser configurada. Você pode pensar que já configurou a herança
porque o exemplo anterior chama o construtor da classe pai e o ano, marca e modelo sã o
criados em Car, mas getInfo e st artEngine nã o foram herdados. A herança é realizada
alterando o objeto de protó tipo Car para ser um novo objeto Vehicle.
Lembre-se de que o protó tipo é o objeto que é clonado para criar o novo objeto. Por padrã o,
o protó tipo é do tipo Object. Depois que o novo Veículo é atribuído ao protó tipo, o
construtor desse Veículo é alterado para ser o construtor do Carro, conforme a seguir.
Car.prototype.constructor = Carro;
this.wheelQuantity = 4;
return Car;
})(Veículo);
Finalmente, você pode adicionar mais métodos ao Car. Neste exemplo, o método getInfo é
adicionado, substituindo o método Vehicle getInfo. O novo getInfo obtém alguma
reutilizaçã o de có digo chamando o método getInfo existente no protó tipo do objeto Vehicle
pai. No entanto, você deve usar o método cal e passar este objeto da seguinte maneira.
Car.prototype.constructor = Carro;
this.wheelQuantity = 4;
Car.prototype.getInfo = function () {
};
return Car;
})(Veículo);
Isso completa Car, e Boat é semelhante, exceto que Boat tem uma propulsã o
erBladeQuantity, que é inicializada em três, em vez da propriedade wheelQuantity. Além
disso, getInfo retorna o tipo de veículo Barco e chama o método getInfo de Veículo
conforme a seguir.
Boat.prototype.constructor = Barco;
this.propellerBladeQuantity = 3;
Boat.prototype.getInfo = function () {
};
barco de retorno;
})(Veículo);
esperar (6);
var act al = c.ano;
var esperado = 4;
});
esperar (6);
var esperado = 3;
var esperado = 'Tipo de veículo: Barco 1994 Sea Ray Signature 200'; igual (real, esperado,
'Valor esperado:' + esperado +
});
Resumo da lição
■■ Uma classe é um projeto para um objeto no qual um objeto é uma instâ ncia de uma
classe.
■■ A classe da qual você herda é chamada de classe pai, base, super ou generalizada.
A classe que é derivada do pai é chamada de classe chi ld, derivada, sub ou
especializada. Você pode implementar a herança substituindo o protó tipo da classe Child
por uma nova instâ ncia do pai e substituindo seu construtor pela funçã o de construtor da
classe Child.
283
■■ O padrã o literal pode ser usado para criar um objeto usando chaves para criar o
objeto. O padrã o fator y pode ser usado para criar um objeto dinâ mico.
■■ JavaScript nã o tem uma palavra-chave de classe, mas você pode simular uma classe
definindo uma funçã o.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. propriedade
B. método
Classe C.
D. evento
2. O que o JavaScript usa como objeto inicial ao construir um novo objeto?
A. protó tipo
B. propriedade
Classe C.
D. evento
A. Você substitui o protó tipo do objeto filho por uma nova instâ ncia do objeto pai e, em
seguida, substitui o construtor do protó tipo pelo construtor filho.
Esta liçã o apresenta o jQuery, que está muito bem documentado em http://jquery.com . Os
capítulos subsequentes tiram proveito do jQuery sempre que possível para minimizar a
digitaçã o e se beneficiar das funçõ es auxiliares compatíveis com vá rios navegadores do
jQuery.
Apresentando jQuery
jQuery é uma biblioteca de funçõ es auxiliares compatíveis com vá rios navegadores. Se você
se sentir confortá vel trabalhando com JavaScript, pode pensar que nã o precisa do jQuery,
mas precisa. Você pode minimizar a quantidade de có digo específico do navegador que
deve escrever usando jQuery, um suplemento de có digo aberto que fornece um meio fá cil e
independente do navegador para escrever JavaScript.
jQuery é escrito em JavaScript, portanto, é JavaScript. Você pode ler o có digo-fonte do
jQuery para entender como o jQuery funciona. Provavelmente milhõ es de
desenvolvedores usam jQuery. É fá cil de usar, é está vel, está totalmente documentado e
funciona bem com outros frameworks. A seguir está uma lista das categorias de
funcionalidade que o jQuery oferece.
■■ Objeto de retorno de chamada Um objeto que fornece muitos métodos para gerenciar
retornos de chamada
■■ Métodos de dados que auxiliam na associaçã o de dados arbitrá rios com elementos DOM
285
■■ Métodos de formulários que fornecem funcionalidade ao trabalhar com controles de
formulá rio
seletores
Introdução ao jQuery
Para começar a usar jQuery, adicione a biblioteca jQuery ao seu projeto. Neste exemplo, a
estrutura de teste QUnit já foi adicionada a um projeto da web vazio e demonstrará
os recursos do jQu ery. Você pode adicionar jQuery baixando a biblioteca em http: // jQuery
.com ou adicionando a biblioteca do NuGet. Para adicioná -lo a partir do NuGet, abra seu
projeto e, no menu Projeto, clique em Gerenciar pacotes NuGet. Na caixa de texto Pesquisar
online, digite jQuery e pressione Enter. Você deve ver uma tela semelhante à mostrada na
Figura 6-9 .
Apó s localizar o jQuery, clique no botã o Instalar. A instalaçã o irá iniciar e, em um momento,
você verá uma caixa de seleçã o verde no jQuery, indicando que a instalaçã o foi concluída
com sucesso. Clique no botã o Fechar e observe a janela do Gerenciador de Soluçõ es,
conforme mostrado na Figura 6-10. Se o seu projeto nã o tinha uma pasta Scripts, uma pasta
Scripts foi adicionada. Dentro da pasta Scripts, você encontrará a versã o mais recente do
j Query. Há um arquivo para IntelliSense e um arquivo de biblioteca jQuery
completo. Finalmente, há uma versã o minimizada do jQuery, que é o arquivo que você usa
no momento da produçã o para minimizar o uso da largura de banda.
Usando j Query
Você provavelmente ainda está tentando entender o que é jQuery e como você se beneficia
de usá -lo, entã o o primeiro recurso a aprender é como usar jQuery para localizar um
elemento ou grupo de elementos.
Primeiro, a biblioteca jQuery deve ser referenciada na pá gina em que você a usará . Neste
primeiro exemplo, o arquivo QUnit Test.html bá sico é usado e a biblioteca jQuery é
adicionada para que o arquivo contenha o seguinte HTML.
<! DOCTYPE html>
<head>
<title> </title>
<link rel = "stylesheet" type = "text / css" href = "Content / qunit.css" />
</head>
<body>
287
<div id = "qunit-fixture">
</div>
</ b ody>
</html>
Na janela Solution Explorer, o arquivo Test.html foi definido como a pá gina de inicializaçã o
clicando com o botã o direito do mouse no arquivo e escolhendo Definir como pá gina inicial.
var txtInput;
var txtResult;
function initialize () {
Claro();
function clear () {
txtInput.value = '0';
txtResult.value = '0';
mó dulo ('QUnit Test Suite', {setup: function () {initialize ();}}); test ("Inicializar teste",
funçã o () {
esperar (2);
}) ;
Agora que o teste está passando, altere algum có digo para usar jQuery. O có digo da
biblioteca jQuery está no namespace jQuery, mas esse namespace também possui um alias
de $ (sinal de dó lar) e pode ser usado da seguinte maneira.
jQuery.someFeature
$ .someFeature
Você pode usar qualquer um desses nomes para acessar os recursos da biblioteca,
portanto, para minimizar o pressionamento de teclas, use o símbolo do dó lar. Primeiro,
altere o có digo dentro da funçã o de inicializaçã o do arquivo default.js. O có digo para
localizar os elementos pode ser reescrito para usar os seletores jQuery e CSS da seguinte
maneira.
function initialize () {
Claro();
289
Quando você executa o teste, ele passa, mas nã o pelo motivo correto; txtInput e txtResult
fazem referência ao wrapper jQuery, nã o ao elemento DOM real . Quando a propriedade
value é definida como '0', uma nova propriedade é criada dinamicamente no objeto jQuery
e definida como '0'. No entanto, a intençã o desta consulta é definir o valor da caixa de texto
como '0'. Para corrigir esse problema, você pode usar o método val no objeto jQuery . O
método val obtém ou define a propriedade value de um controle de formulá rio que possui
uma propriedade value. A seguir está o có digo de teste modificado.
mó dulo ('QUnit Test Suite', {setup: function () {initialize ();}}); test ("Inicializar teste",
function () {
esperar (2 );
var esperado = '0';
});
Depois que as quatro alteraçõ es sã o feitas no teste, a execuçã o do teste mostra que as
asserçõ es de teste falham porque as propriedades de valor nos elementos DOM nã o estã o
sendo definidas. Para corrigir o problema, modifique o có digo na funçã o clear para definir o
valor usando o método val do jQuery . A seguir está o có digo completo.
var txtInput;
var txtResult;
function initialize () {
Claro();
function clear () {
txtInput.val ('0');
txtResult.val ('0');
recursos compatíveis com o navegador que o jQuery possui. Se precisar fazer referência ao
objeto DOM do wrapper jQuery, você pode fazer da seguinte maneira.
Nã o se esqueça de que você pode colocar esse có digo dentro de uma instruçã o condicional
que verifica a propriedade length para ver se um elemento existe antes de tentar acessar o
elemento 0 do resultado.
var domElement;
Ao aprender um novo idioma ou biblioteca, é sempre bom ter alguma ajuda para evitar que
você fique preso em cada declaraçã o que escreve. Quando você instalou o jQuery, um
arquivo IntelliSense foi adicionado, mas ainda nã o está sendo usado. Por exemplo,
no arquivo default.js , se você digitar uma expressã o jQuery que inclui um seletor e, em
seguida, pressionar a tecla Ponto, você gostaria de ver uma lista vá lida de métodos e
propriedades disponíveis. Antes de configurar o IntelliSense, Figura 6-12
FIGURA 6-12 A janela Intel iSense quando nã o configurada corretamente para jQuery
Liçã o 2: Trabalhando com jQuery CAPÍTULO 6
291
Para ativar o IntelliSense, você deve definir uma referência ao arquivo jQuery (nã o o
arquivo IntelliSense) em cada arquivo JavaScript que requer IntelliSense. A seguir está um
exemplo do arquivo default.js com o conjunto de referência.
var txtInput;
var txtResult;
function in itialize () {
Claro();
function clear () {
txtInput.val ('0');
txtResult.val ('0');
}
Por que você precisa do nome especial e por que ele precisa estar na pasta Scripts quando
você precisa fazer referência ao arquivo explicitamente? Se você usar um arquivo chamado
_references.js que está localizado na pasta Scripts, automaticamente terá uma referência a
esse arquivo em suas pá ginas HTML, embora ainda precise adicionar a referência aos seus
arquivos JavaScript. A seguir está o conteú do do arquivo _references.js.
var txtResult;
function initialize () {
Claro();
function clear () {
txtInput.val ('0');
txtResult.val ('0');
Depois de adicionar a referência, se você digitar uma expressã o jQuery, você ativa o
IntelliSense assim que inserir o sinal de dó lar e o parêntese de abertura, conforme
mostrado na Figura 6-13.
FIGURA 6-13 O jQuery Intel iSense fornecendo ajuda à medida que você digita Observe na
Figura 6-13 que, apó s terminar de digitar o seletor e pressionar Ponto, será fornecida uma
lista vá lida de propriedades e métodos para o objeto wrapper jQuery.
O que acontece se você estiver na funçã o limpar e digitar txtInput e pressionar ponto? O
IntelliSense fazia sentido? Você obtém uma resposta do IntelliSense semelhante à da Figura
6-12.
293
function initialize () {
Claro();
function clear () {
Este có digo é muito menor sem as variá veis globais, mas o teste agora está falhando
porque o teste ainda faz referência à s variá veis globais. Para corrigir o teste, substitua as
referências da variá vel global conforme a seguir.
mó dulo ('QUnit Test Suite', {setup: function () {initialize ();}}); test ("Inicializar teste",
function () {
esperar (2);
});
Verificação rápida
Você viu como o uso de seletores CSS cria um resultado jQuery, que é um empacotador em
torno de zero para muitos elementos DOM que correspondem ao seletor. Você também
pode criar um wrapper jQuery a partir de uma referência de elemento DOM, conforme
mostrado nos exemplos a seguir.
Neste exemplo, um botã o cujo id é btnSubmit está localizado, usando jQuery e o método .on
para adicionar uma chamada à funçã o myFunction definida pelo usuá rio para o evento click
do botã o. Para remover o ouvinte de evento, use o mesmo có digo, mas substitua o .on
por .off conforme a seguir.
Quando precisar acionar os manipuladores de eventos usando có digo, você descobrirá que
o jQuery pode ajudar. Provavelmente, o motivo mais comum para acionar manipuladores
de eventos usando có digo é testar seu có digo. Usar o gatilho do jQuery ou o método
triggerHandler faz com que o có digo do manipulador seja executado.
O método trigger faz com que o comportamento padrã o do controle seja executado,
enquanto o método triggerHandler nã o. Por exemplo, a execuçã o do método de disparo em
um botã o de envio faz com que a açã o de envio ocorra além da execuçã o do có digo do
manipulador de eventos. Outra diferença é que o método trigger é executado para todos os
elementos correspondidos no eleitor do jQuery , enquanto o método triggerHandler é
executado apenas para o primeiro elemento. A seguir está um exemplo de disparo do
có digo do manipulador de eventos para o evento click em um botã o de envio.
Freqü entemente, você precisará executar o có digo de inicializaçã o depois que o documento
HTML estiver carregado e pronto, e o jQuery for executado de forma independente do
navegador para executar o có digo quando o documento for carregado da seguinte maneira.
<script>
inicializar ();
});
</script>
295
É melhor colocar isso na parte inferior do seu documento HTML e chamar uma funçã o de
inicializaçã o que contém todo o có digo de inicializaçã o.
Resumo da lição
■■ Use o método val do jQuery para obter ou definir o valor de um elemento DOM que
possui uma propriedade de valor.
■■ Use os métodos .on e .off do jQuery para adicionar e remover ouvintes de eventos.
Revisão da aula
1. Você deseja localizar todos os elementos em sua pá gina da Web que foram atribuídos ao
nome de classe CSS Oculto. Qual instruçã o jQuery você pode usar?
2. Você está interessado em escrever có digo JavaScript orientado a eventos que funcionará
na maioria dos navegadores sem escrever có digo específico do navegador. Como você pode
fazer isso?
D. É impossível escrever có digo JavaScript orientado a eventos que nã o seja específico do
navegador.
3. Você está interessado em localizar todos os < p > elementos em sua pá gina da web, entã o
sua declaraçã o é var paragraph = $ ('p'). Qual linha de có digo confirmaria se pelo menos um
elemento foi encontrado?
C. if (paragraphs.length)
Pra exercícios ctice
1. Inicie o Visual Studio Express 2012 for Web. Clique em Arquivo e escolha Abrir Projeto.
Navegue até a soluçã o que você criou no Capítulo 5, “Mais HTML,” e selecione o arquivo
webCalculator.sln. Clique em Abrir.
Se você nã o completou os exercícios do Capítulo 5, pode usar a soluçã o na pasta Iniciar do
Capítulo 6, Exercício 1.
2. Na janela Solution Explorer, clique com o botã o direito do mouse no arquivo
CalculatorTests.html e escolha Definir como pá gina inicial. Pressione F5 para verificar se o
teste é executado e aprovado.
3. Na janela Solution Explorer, adicione jQuery ao projeto clicando com o botã o direito do
mouse no nó do projeto. Escolha Gerenciar Pacotes NuGet. Digite jQuery na caixa de texto
de pesquisa online e clique no botã o de pesquisa. Clique no botã o Instalar no resultado do
jQuery.
297
(funçã o () {
var ns = this.calculatorNamespace;
}) ();
ns.Calculator = (function () {
function numberClick () {
function plusClick () {
function minusClick () {
function clearEntry () {
txtInput.value = '0';
function clear () {
txtInput.value = '0';
txtResult.value = '0';
} ());
9. Adicione uma funçã o Calculadora dentro do IIFE, que será a funçã o construtora. Nã o há
có digo para o construtor neste momento. Na parte inferior do IIFE, adicione o có digo para
ret urnar esta funçã o de construtor. Tente fazer isso sozinho, mas se tiver um problema, o
có digo de amostra é mostrado na etapa 10.
(funçã o () {
var ns = this.calculatorNamespace;
function initialize () {
document.getElementById ('btn' + i)
.addEventListener ('click', numberClick, false);
document.getElementById ('btnPlus')
document.getElementById ('btnMinus')
document.getElementById ('btnClearEntry')
document.getElementById ('btnClear')
Claro();
ns.Calculator = (function () {
function Calculator () {
Calculator.prototype.numberClick = function () {
};
Calculator.prototype.plusClick = function () {
};
Calculator.prototype.min usClick = function () {
};
Calculator.prototype.clearEntry = function () {
txtInput.value = '0';
};
Calculator.prototype.clear = function () {
299
txtInput.value = '0';
txtResult.value = '0';
};
return Calculator;
} ());
}) ();
11. Na funçã o de inicializaçã o, crie uma variá vel calculadora e atribua um novo objeto
Calculadora a ela. Certifique-se de usar o namespace ao criar o novo objeto Calculadora.
12. Converta o loop que adiciona ouvintes de evento a cada um dos botõ es de nú mero em
uma ú nica instruçã o jQuery com base na localizaçã o de todos os elementos de botã o que
têm um id que começa com btnNumber.
16. Converta o có digo que adiciona ouvintes de evento a btnPlus, btnMinus, btnClearEntry
e btnClear para usar jQuery.
function initialize () {
Claro();
Calculator.prototype.numberClick = function () {
};
Calculator.prot otype.plusClick = function () {
Calculator.prototype.clearEntry ();
};
Calcu lator.prototype.minusClick = function () {
Calculator.prototype.clearEntry ();
};
(funçã o () {
var ns = this.calculatorNamespace;
ns.initialize = function () {
calculadora.clear ();
ns.Calculator = (function () {
function Calculator () {
Calculator.prototype.numberClick = function () {
};
301
Calculator.prototype.plusClick = function () {
Calculator.prototype.clearEntry ();
};
Calculator.prototype.minusClick = function () {
Calculator.prototype.clearEntry ();
};
Calculator.prototype.clearEntry = function () {
};
C alculator.prototype.clear = function () {
};
return Calculator;
} ());
}) ();
<head>
</head>
<head>
</head>
<body>
<div id = "container">
<cabeçalho>
<hgroup id = "headerText">
</hgroup>
</header>
<nav>
</nav>
<div id = "calculator">
<table>
<tr>
</td>
</tr>
<tr>
</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
<td>
<td>
<td>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
</td>
<td>
</td>
303
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>
</td>
<td> </td>
<td> </td>
</tr>
</table>
</div>
</div>
<ao lado>
</aside>
<footer>
</p>
</footer>
</div>
calculatorNamespace.initialize ();
});
</script>
</ body>
</html>
<head>
<title> </title>
<link rel = "stylesheet" type = "text / css" href = "Content / qunit.css" />
</head>
<body>
<div id = "qunit-fixture">
</div>
</body>
</html>
Você deve modificar o arquivo tests.js para usar jQuery, calculatorNamespace e o objeto
Calculadora.
calculatorNamespace.initialize ();
});
27. Modifique o resto do método para usar jQuery e execute o teste para ver se ele passa.
exp ect (2);
305
'Valor real:' + $ ('# txtInput'). Val ()); igual ($ ('# txtResult'). val (), esperado, 'Valor
esperado:' + esperado +
});
28. Modifique o botã o Clique em Teste para usar jQuery. Execute o teste para ver se ele
passa. Use o método triggerHandler do jQuery para testar cada botã o.
var result = $ ('# txtInput'). val () [$ ('# txtInput'). val (). length - 1]; var esperado = String
(i);
});
29. Modifique o Add Test para usar jQuery. Execute o teste para ver se ele passa.
esperar (2);
e esperado = '0';
30. Modifique o teste de subtraçã o para usar jQuery. Execute o teste para ver se ele passa.
esperar (2);
esperado = '0';
});
31. Modifique o Clear Entry Test para usar jQuery. Execute o teste para ver se ele passa.
esperar (1);
32. Modifique o Clear Test para usar jQuery. Execute o teste para ver se ele passa.
esperar (2);
});
Neste ponto, você deve ser capaz de executar todos os testes e todos devem passar.
33. Clique com o botã o direito do mouse no arquivo default.html e escolha Definir como
pá gina inicial. Para ver se sua calculadora ainda funciona, pressione F5 para iniciar
a depuraçã o do aplicativo.
Pode ser necessá rio atualizar a tela, mas a calculadora deve estar funcionando.
307
Respostas
Lição 1
1. Resposta correta : C
D. Incorreto: Um evento ocorre a partir de uma entrada externa, normalmente y de uma
entrada do usuá rio.
2. Resposta correta: A
A. Correto: O protó tipo é o objeto inicial que é clonado ao criar um novo objeto.
3. Resposta correta: A
A. Correto: você substitui o protó tipo do objeto filho por uma nova instâ ncia do objeto pai
e, em seguida, substitui o construtor do protó tipo pelo construtor filho.
Lição 2
1. Resposta correta : B
A. Incorreto: O uso do símbolo hash (#) no seletor CSS indica que você deseja localizar um
elemento com base em seu id.
B. Correto: O uso do ponto (.) No seletor CSS indica que você deseja localizar os elementos
que correspondem ao nome da classe CSS.
C. Incorreto: fornecer um nome para um seletor CSS indica que você deseja localizar os
elementos que possuem esse nome de tag.
2. Resposta correta: A
C. Incorreto: você precisa usar JavaScript para escrever o có digo n da unidade de evento .
3. Resposta correta: C
Respostas CAPÍTULO 6
309
CAPÍTULO 7
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
Um formulá rio é responsá vel por coletar dados e enviá -los a algum lugar. Na maioria dos
casos, os dados sã o enviados de volta ao servidor para processamento. Como o
processamento do lado do servidor ainda nã o foi explicado, você enviará os dados para um
endereço de e-mail. Esta nã o é uma prá tica recomendada; na verdade, você nunca deve
fazer isso porque expõ e seu endereço de e-mail ao pú blico. No entanto, essa técnica fornece
uma etapa intermediá ria para ajudá -lo a entender o lado do navegador dos formulá rios
antes que o processamento do lado do servidor seja discutido.
Para entender como os formulá rios funcionam, você precisa ter um conhecimento bá sico
de como funciona o protocolo HTTP. Esta liçã o fornece a introduçã o necessá ria ao
protocolo HTTP e discute a implementaçã o do formulá rio.
311
1. O usuá rio navega até um site da Web, o que faz com que o navegador inicie uma
solicitaçã o de recurso do servidor da web.
4. O servidor da web envia uma resposta ao navegador da web, também usando o
protocolo HTTP.
5. O navegador processa a resposta, fazendo com que uma pá gina da web seja exibida.
6. O usuá rio insere dados em um formulá rio na pá gina da web e clica no botã o Enviar que
faz com que os dados sejam enviados de volta ao servidor da web.
9. O servidor da web envia a resposta de volta ao navegador por meio do protocolo HTTP.
O servidor web
Os servidores da Web originalmente eram responsá veis apenas por receber e tratar as
solicitaçõ es dos navegadores por meio de HTTP. O servidor da web manipulou a solicitaçã o
e enviou uma resposta de volta ao navegador da web e, em seguida, o servidor da web
fechou a conexã o e liberou todos os recursos que estavam envolvidos na
solicitaçã o. Liberar todos os recursos era fundamental porque o servidor da web precisava
lidar com milhares de solicitaçõ es por minuto. As pá ginas da web originais eram pá ginas
HTML simples e está ticas. O ambiente da web foi considerado sem estado porque nenhum
dado foi mantido no servidor da web entre as solicitaçõ es do navegador da web e a conexã o
foi fechada apó s a chave
Termos a resposta, conforme mostrado na Figura 7-1.
313
O navegador da web
Embora a funçã o do navegador seja apenas apresentar dados e coletar dados, novas
tecnologias do lado do cliente estã o surgindo todos os dias e permitem que os navegadores
sejam mais robustos, portanto, é mais simples desenvolver uma pá gina da Web e, ao
mesmo tempo, melhorar a experiência do usuá rio. Tecnologias como JavaScript assíncrono
e XML (AJAX) permitem que os navegadores da web se comuniquem com os servidores da
web sem limpar as pá ginas da web existentes da janela do navegador.
FIGURA 7-3 A janela de ferramentas do desenvolvedor mostrando o trá fego da rede Esta
janela exibe todo o trá fego ao navegar para um site e possui as seguintes colunas.
■■ URL O endereço do recurso que está sendo acessado, que pode ser um endereço
relativo ou um endereço absoluto
■■ Timings Um grá fico de tempo sequencial que transmite uma linha do tempo das
solicitaçõ es Quando o usuá rio digita http://gjtt.com para navegar até este site, a primeira
entrada mostra que o có digo de resultado da solicitaçã o é 302, que é um indicador o fa
redirect. Nesse caso, o redirecionamento foi
para http://www.gjtt.com/Pages/default.aspx . Existem muitos có digos de retorno HTTP,
que sã o divididos em categorias com base no primeiro dos três dígitos do có digo de
retorno. A seguir descreve as categorias de có digos de status de retorno.
■■ 1xx mensagem informativa
■■ 2xx Success
■■ Redirecionamento 3xx
■■ 4xx cliente erro
■■ 5xx Erro de servidor
A segunda solicitaçã o é para a pá gina http://www.gjtt.com/Pages/default.aspx , que retorna
um có digo de resultado de 200, indicando sucesso. Quando o HTML resultante é retornado
dessa solicitaçã o, o HTML contém links para folhas de estilo, que sã o consequentemente
solicitadas pelo navegador.
Os termos solicitam um recurso. A seguir está uma lista dos valores de método vá lidos.
■■ PUT Solicitaçã o para o servidor aceitar os dados que estã o sendo enviados do cliente
para inserir novos dados do servidor.
315
■■ CONNEC T Usado com um proxy que pode mudar dinamicamente para ser um tú nel.
Quando você navega para uma pá gina da web, o método GET é usado para recuperar a
pá gina do servidor. Se a pá gina contém um formulá rio para coleta de dados do usuá rio e os
dados sã o enviados para o servidor, o navegador executará o método POST e repassará os
dados para o servidor. No Capítulo 8, “Sites e serviços”, você vê como pode usar GET, POST,
PUT e DELETE para executar operaçõ es de criaçã o, recuperaçã o, atualizaçã o e exclusã o
(CRUD), que você pode usar ao modificar dados.
Você pode usar o elemento HTML < form > para criar um formulá rio da web que coleta
dados e os envia ao servidor da web ou a outro local, como um endereço de e-mail. Um uso
típico do
O elemento < form > é o seguinte.
</form>
Este formulá rio solicita que o usuá rio insira uma ID de cliente, exibe uma caixa de texto que
coleta a ID de cliente desejada e exibe um botã o de envio que inicia o envio de dados para o
servidor da web. O método do formulá rio indica o método HTTP a ser usado ao enviar os
dados para o servidor. A açã o é uma URL absoluta ou relativa do recurso que receberá os
dados.
Nem todos os elementos podem enviar dados quando o botã o Enviar é clicado. Para
simplificar, os elementos que podem enviar dados no envio serã o chamados de elementos
de envio de formulário . Existem muitos novos tipos de entrada com HTML5. Se o
navegador nã o reconhecer o tipo de entrada, ele cairá
Os termos voltam a tratar a entrada como uma caixa de texto. A seguir está uma lista dos
elementos de envio de formulá rio disponíveis em HTML5.
Definir como suave (o padrã o) nã o insere avanços de linha nos dados postados. Definir
como hard insere avanços de linha com base na configuraçã o do atributo cols.
< selecione > elemento de uma lista suspensa para uma lista, definindo o atributo
de tamanho para a quantidade de itens que devem ser exibidos como uma lista. Se o
tamanho for menor que a quantidade de itens na lista, a lista exibirá uma barra de
rolagem. O elemento < opção > possui um atributo selecionado para indicar que a opçã o
está selecionada. O atributo selecionado é um atributo booleano. Você pode usar o jQuery
para localizar todos os elementos de < opção > selecionados usando o seguinte seletor.
$ ('opçã o: selecionada')
■■ <button> Um botã o clicá vel que pode ter conteú do HTML, como um elemento < img >, e
pode ser configurado como um botã o de envio usando o atributo de tipo , que pode ser
definido como botão (padrã o), redefinir ou enviar .
■■ <input type = 'button'> Um botã o clicá vel que exibe um prompt de texto.
■■ <input type = 'datetime-local'> Um controle de data e hora (sem fuso horá rio).
■■ <input type = 'radio'> Um botã o de opçã o. Além de ter um atributo de valor , o botã o
de opçã o tem um atributo marcado que é legível e configurá vel. O atributo verificado é um
atributo booleano. Você pode usar o jQuery para localizar todos os botõ es de opçã o
selecionados usando o seletor a seguir.
317
■■ <input type = 'range'> Um controle para inserir um valor numérico quando o valor
exato nã o é importante. Em navegadores mais recentes, isso é renderizado como um
controle deslizante e é comumente referido como um controle deslizante. Este controle tem
um atributo de valor , que é o valor atual do controle deslizante. O atributo min é o valor
mínimo configurá vel (o padrã o é 0). O atributo max é o valor má ximo configurá vel (o
padrã o é 100). O atributo step define a granularidade do valor, que é a quantidade de
mudança que o valor terá quando o controle deslizante se mover (o padrã o é 1). O atributo
step deve ser um int, a menos que o valor min seja definido como um valor nã o int.
■■ <input type = 'reset'> Um botã o que redefine todos os valores do formulá rio para os
valores padrã o; observe que isso nã o envia dados quando o formulá rio é enviado .
■■ <input type = 'search'> Um campo de texto para inserir uma string de pesquisa.
■■ <input type = 'text'> Um campo de texto de linha ú nica cuja largura padrã o é de 20
caracteres.
■■ <input type = 'time'> Um controle para inserir uma hora (sem fuso horá rio).
■■ <input type = 'week'> Um controle de semana e ano (sem fuso horá rio).
Usando o elemento < label >
O elemento < rótulo > pode ser usado para ró tulos que ajudam o usuá rio a identificar o
elemento de envio do formulá rio. Considere o seguinte formulá rio HTML.
</form>
Neste formulá rio, “Enter Customer ID:” pode ser colocado dentro de um elemento < label >
como a seguir.
</form>
Outro benefício interessante de usar o ró tulo é que você pode atribuir regras de estilo ao
ró tulo {
limpar ambos;
display: bloco;
flutuar: esquerda;
largura: 125px;
Este estilo exibe o elemento < label > como um bloco em vez de embutido e limpa os blocos
anteriores. O estilo é definido para flutuar para a esquerda e ter 125 pixels de largura. Se
você tiver vá rias entradas, pode alinhar as entradas verticalmente usando
o elemento < rótulo > e definir sua largura.
Versõ es anteriores de HTML exigiam que o elemento de envio de formulá rio estivesse em
um formulá rio para enviar seus dados. Isso pode se tornar um problema quando os
elementos de envio do formulá rio estã o espalhados em uma pá gina da Web e mais de um
formulá rio está na pá gina. Com HTML5, os elementos de envio de formulá rio têm
um atributo de formulário que pode ser definido como o id de um ou
mais elementos < form >, e os elementos de envio de formulá rio nã o precisam mais estar
dentro de um elemento < form >. A flexibilidade de um elemento de envio de
formulá rio pertencente a mais de um elemento < form > é especialmente ú til. Firefox,
Opera, Chrome e Safari implementam o atributo form, mas, até o momento, o Internet
Explorer 10 nã o.
O disparo do envio do formulá rio faz com que o navegador reú na os dados do elemento de
envio do formulá rio associado e os envie ao URI especificado no atributo de açã o do
formulá rio, usando o método HTTP especificado do formulá rio. Para acionar o envio de um
formulá rio, você pode usar qualquer um dos seguintes elementos .
<head>
<title> </title>
</head>
<body>
Carro favorito:
319
</form>
</body>
</html>
});
function submitTheForm () {
A URL agora inclui QueryString, que é tudo apó s o ponto de interrogaçã o (?). O QueryString
contém o seguinte.
O QueryString é uma lista de pares de valores de nomes que sã o codificados por URI. Os
espaços tornam-se sinais de mais (+), o apó strofo torna-se% 27 e o ponto de exclamaçã o
torna-se% 21. O separador entre cada nome e valor é o sinal de igual (=), enquanto o
separador entre cada par de valor de nome é o e comercial (&).
Verificação rápida
Serializando o formulário
Se você deseja criar a mesma string de pares de valores de nome codificados por URI para
usar em seu có digo, você pode usar o método de serialização jQuery . Este método converte
os dados do formulá rio em uma lista codificada por URI de pares nome-valor. Isso pode ser
ú til quando você deseja postar dados programaticamente no servidor. O método serialize
se parece com isso.
Se você estiver trabalhando com dados codificados por URI e quiser decodificar os dados,
poderá usar a funçã o decodeURI para decodificar um URI completo ou a funçã o
decodeURIComponent para decodificar um QueryString. Por exemplo, você pode usar o
exemplo de có digo a seguir para serializar os dados do formulá rio e, em seguida,
decodificar os dados.
Quando um formulá rio HTML é exibido, o comportamento de foco padrã o é que nenhum
controle tem foco. No passado, os desenvolvedores adicionavam JavaScript para definir o
foco para um controle específico quando a pá gina estava carregada e pronta. O seguinte é
um exemplo de uso de jQuery para definir o foco para a caixa de texto cujo atributo de
nome é comentá rio.
});
HTML5 introduz o atributo autofocus para controles de formulá rio. O atributo autofocus é
um atributo booleano e pode ser definido para o comentá rio da seguinte maneira.
321
Para enviar dados, cada elemento de envio de formulá rio deve atender a restriçõ es
específicas, conforme descrito na lista a seguir.
■■ O elemento de envio de formulá rio deve ter seu conjunto de atributos de nome.
■■ O elemento de envio de formulá rio nã o deve ser desabilitado, mas é permitido que o
elemento de envio de formulá rio seja oculto usando um estilo CSS como display: none .
■■ Se um formulá rio tiver mais de um botã o de envio, apenas o botã o de envio ativado
enviará seu valor.
■■ As caixas de seleçã o devem ser selecionadas para que seus valores sejam enviados.
■■ Os botõ es de opçã o devem ser selecionados para que seu valor seja enviado.
■■ Os elementos < select > devem ter um elemento < option > definido
como selecionado para que seu valor seja enviado.
É interessante notar que um elemento de envio de formulá rio nã o precisa ter um id para
que seus dados sejam enviados no envio, e o nome de um tributo nã o precisa ser
exclusivo. Se você tiver vá rios elementos de envio de formulá rio com o mesmo nome, eles
serã o enviados como uma matriz.
Existem dois métodos HTTP que podem ser usados para enviar os dados do formulá rio de
volta ao servidor da web: GET e POST . Quando o método GET é usado, o QueryString
que contém os dados é anexado ao URL. A QueryString é uma coleçã o de instruçõ es
de chave = valor codificadas por URI , separadas por caracteres e comercial (&), que podem
ser passadas para o servidor da web concatenando um ponto de interrogaçã o (?) Ao final
do URL e, em seguida, concatenando a QueryString do seguinte modo.
.aspx na raiz do site. A extensã o do arquivo da pá gina da web nã o será .html porque você
precisa enviar os dados para uma pá gina que suporte o processamento do lado do servidor,
como uma pá gina .aspx. O QueryString contém os dados que seguem o ponto de
interrogaçã o (?).
Uma vantagem de usar o verbo GET é que você pode ver e modificar o URL completo
e QueryString na barra de endereço do navegador da web, conforme necessá rio. No
entanto, dependendo do cená rio, isso também pode ser uma desvantagem. O URL completo
e QueryString sã o fá ceis de salvar ou enviar como uma unidade. Por exemplo, você pode
marcar uma pá gina da web contendo dados incluídos na QueryString.
Quando você usa o método POST para enviar dados de volta ao servidor da web, os dados
sã o colocados no corpo da mensagem em vez de serem concatenados para a URL. Isso torna
os dados invisíveis, pelo menos para o usuá rio típico. O uso do método POST remove a
restriçã o de tamanho dos dados.
Você pode postar megabytes de dados; embora funcione, o envio de tantos dados pela
Internet pode causar outros problemas, principalmente relacionados à largura de banda,
como erros de tempo limite e problemas de desempenho.
O método POST nã o permite que o usuá rio digite apenas os dados na QueryString porque
esses dados estã o ocultos no corpo da mensagem. Para a maioria dos cená rios, considere
usar o POST
Chave
Termos
Resumo da lição
< botão >.
■■ Use um < button type = 'submit' >, < input type = 'submit' > ou < input type = 'image' >
para enviar um formulá rio.
323
Revisão da aula
A. < nav >
B. < formulário >
C. < textarea >
D. < div >
2. Ao recuperar uma pá gina da web do servidor que contém informaçõ es do cliente, você
deseja poder especificar a id do cliente no URL. O que você pode usar para fornecer o id?
A. o PostBack
B. a QueryString
3. Você serializou os dados do formulá rio que possuem um elemento < input type =
”email” >. Você deseja desserializar os dados para ver o endereço de e-mail conforme
inserido. Qual funçã o você pode usar?
A. decodeURIComponent
B. desserializar
C. enviar
D. deserializeEmail
O problema com a validaçã o de entrada no servidor é que uma viagem de ida e volta deve
ser feita ao servidor para fazer a validaçã o, e o tempo para fazer a viagem de ida e volta
pode ser irritante para o usuá rio. Para gerenciar esse problema, você pode fornecer
validaçã o de entrada no navegador. No entanto, se você fornecer validaçã o no navegador,
precisará de validaçã o no servidor. O problema 324 CAPÍTULO 7 Trabalhando com
formulá rios
Carro favorito:
Comente:
</form>
Neste formulá rio, todos os elementos de envio do formulá rio têm atributos
obrigató rios. Quando a pá gina é exibida, nã o há indicaçã o de campos obrigató rios. Se o
usuá rio clicar imediatamente no botã o Enviar, o navegador cancelará o envio e o resultado
será exibido, conforme mostrado na Figura 7-5. O elemento < select > nã o tem a borda
vermelha porque a primeira opçã o é selecionada por padrã o.
O Opera e o Internet Explorer têm a mesma mensagem, “Este é um campo obrigató rio”, mas
em vez de uma borda vermelha, o fundo da mensagem é vermelho. Você pode fornecer
regras de estilos CSS para atender à s suas necessidades.
FIGURA 7-5 Os campos obrigató rios vazios com bordas vermelhas e a mensagem
obrigató ria exibida Uma das razõ es pelas quais HTML5 tem novos tipos de entrada para e-
mail, URL, data e assim por diante, é que a validaçã o pode ser aplicada automaticamente
com base no tipo. No exemplo anterior, o elemento < i nput type = ”email” > fornece
automaticamente validaçã o extra em uma tentativa de garantir que um endereço de e-mail
vá lido seja inserido. A validaçã o extra é diferente com base no navegador. Você
normalmente descobrirá que os navegadores procuram apenas * @ * para ser vá lido,
mas isso pode mudar.
Você também pode fornecer um atributo de espaço reservado na maioria dos elementos de
envio de formulá rio, que fornece um prompt no campo até que o usuá rio insira o primeiro
caractere. No passado, isso exigia muito có digo extra. O que se segue adiciona o marcador
de posiçã o ao exemplo de formulá rio anterior.
Carro favorito:
Comente:
</ fo rm>
Quando o formulá rio é exibido, o comentá rio e o endereço de e-mail exibem o texto do
marcador se estiverem vazios. O resultado é mostrado na Figura 7-6.
FIGURA 7-6 O texto do espaço reservado exibido até que o usuá rio insira
os dados Validando a entrada do URL
O elemento < input type = ”url” > valida um URL adicionando o atributo obrigató rio e o
espaço reservado opcional. Além disso, você pode adicionar o atributo pattern para
fornecer uma expressã o regular JavaScript para ajustar a entrada necessá ria. Considere
a seguinte forma.
O padrã o afirma que o URL deve começar com http. A letra s é seguida por um ponto de
interrogaçã o (?), O que significa que a letra s é opcional. Depois disso, os dois pontos e duas
barras (: //) sã o obrigató rios. A combinaçã o de ponto final e sinal de adiçã o significa que
você deve fornecer um a vá rios caracteres. A ú ltima parte pode ser ajustada para exigir
pelo menos um ponto ou para definir um limite no nú mero de caracteres.
Quando a pá gina é exibida e o usuá rio insere abc, a validaçã o falha com a mensagem
mostrada na Figura 7-7.
327
</form>
Depois que o atributo title é fornecido e o usuá rio insere dados invá lidos, a nova mensagem
de erro de validaçã o é exibida, conforme mostrado na Figura 7-8.
Validando números e intervalos
Use os elementos < input type = ”number” > e < input type = ”range” > para aceitar valores
numéricos. Ambos os elementos aceitam atributos de parâ metro min , max e step . O
atributo da etapa é padronizado para um, se omitido. Considere o
seguinte elemento < form > que contém as entradas de nú mero e intervalo.
</form>
A Figura 7-9 mostra a pá gina renderizada. O usuá rio deve inserir um valor na entrada
numérica, mas a entrada de intervalo é renderizada como um controle deslizante. Se você
nã o incluir o atributo obrigató rio na entrada de nú mero, poderá deixar o campo vazio, mas
se fornecer um valor, ele deve estar entre os atributos de valor mínimo e má ximo.
Verificação rápida
329
Estilizando as validações
Você pode aplicar regras de estilo a entradas vá lidas e invá lidas implementando regras de
estilo em: vá lido,
: invá lido,: obrigató rio e: pseudo classes opcionais. A seguir está um exemplo de
configuraçã o de pseudo classes para controlar a aparência da pá gina da web.
: vá lido {
: invá lido {
:requerido{
:opcional{
Resumo da lição
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
lesso n. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você está criando uma pá gina da web que solicita as informaçõ es do perfil de um novo
usuá rio. A pá gina do arquivo pro requer que o usuá rio forneça um nome de usuá rio e, se
nenhum nome de usuá rio for fornecido, o usuá rio nã o poderá enviar a pá gina ao
servidor. Qual atributo deve ser colocado na caixa de texto do nome do usuá rio para
cumprir esse requisito?
A. aplicada
B. obrigató rio
C. obrigató rio
2. Quando você deseja enviar dados de formulá rio ao servidor para atualizar dados no
banco de dados, qual método HTTP você deve especificar para o elemento < form >?
A. POST
B. OBTER
C. CONECTAR
D. ENVIAR
3. Se você deseja adicionar um controle deslizante a uma pá gina da web, qual elemento
você usa?
Neste exercício, você aplica seu formulá rio HTML5 e conhecimento de validaçã o de
formulá rio criando uma pá gina Fale Conosco para o aplicativo de calculadora no capítulo
anterior. A pá gina da Web solicitará ao usuá rio o nome e o sobrenome, o endereço de e-
mail e a natureza das comunicaçõ es. Todos os campos serã o obrigató rios.
1. Inicie o Visual Studio Express 2012 for Web. Clique em ARQUIVO e escolha Abrir
projeto. Navegue até a soluçã o que você criou no Capítulo 6, “JavaScript e jQuery
essenciais”. Selecione o arquivo WebCalculator.sln e clique em Abrir.
2. Na janela Solution Explorer, clique com o botã o direito do mouse no arquivo default.html
e escolha Definir como pá gina inicial. Pressione F5 para verificar se sua pá gina inicial é
exibida.
3. Na janela Solution Explorer, copie a pá gina default.html para um novo arquivo HTML
clicando com o botã o direito do mouse no arquivo default.html e escolhendo Copiar. Clique
com o botã o direito do mouse no nó do projeto WebCalculator e escolha Colar.
331
<head>
</head>
<body>
<div id = "container">
<cabeçalho>
<hgroup id = "headerText">
</hgroup>
</header>
<nav>
</nav>
</div>
<ao lado>
</aside>
<footer>
</p>
</footer>
</div>
</body>
</html>
Definir o método como GET permite que você veja quando o formulá rio é realmente
enviado, porque você vê os dados do formulá rio em QueryString no URL. O conteú do
principal deve ser semelhante ao seguinte.
<div id = "ContactUs">
</form>
</div>
<div>
</div>
<div>
<label for = "lastName"> Sobrenome: </label>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
</form>
11. Abra o arquivo default.css e, na parte inferior do arquivo, adicione uma regra de estilo
para o elemento < label > que limpa os elementos anteriores e exibe como um bloco que
flutua para a esquerda.
ró tulo {
limpar ambos;
display: bloco;
flutuar: esquerda;
largura: 125px;
altura: 12px;
vertica l-align: bottom;
preenchimento: 10px;
form input {
largura: 200px;
333
altura: 12px;
Defina o alinhamento vertical para cima. Defina a família da fonte como Arial e o tamanho
da fonte como 12
por cento.
widt h: 100px;
margin-bottom: 10px;
A ú ltima coisa que você deve fazer é adicionar um hiperlink na pá gina principal que faz
referência ao arquivo ContactUs.html.
15. Na seçã o < nav >, adicione um elemento <br /> e, em seguida, adicione o hiperlink para
fazer referência ao arquivo ContactUs.html.
Yo ur < nav > seçã o deverá ser parecido com o que é devido fol.
<nav>
<a href="default.html"> Pá gina inicial </a> <br />
</nav>
16. Pressione F5 para executar o aplicativo. Clique no link Fale conosco para exibir a pá gina
ContactUs.html. Sem inserir nenhum dado, clique no botã o Enviar.
http: // localhost: 55506 / ContactUs.html? firstName = & lastName = & email = & message
= & submit =
4. Substitua o atributo type no campo de e-mail por type = ”email”, que fornecerá validaçã o
adicional do endereço de e-mail.
<div>
Exercícios prá ticos CAPÍTULO 7
335
<input type = "text" id = "firstName" name = "firstName" obrigató rio = "obrigató rio" />
</div>
<div>
<input type = "text" id = "lastName" name = "lastName" obrigató rio = "obrigató rio" />
</div>
<div>
<input type = "email" id = "email" name = "email" obrigató rio = "obrigató rio" />
</div>
<div>
</div>
<div>
</div>
</form>
f orm textarea {
margem: 5px;
largura: 210px;
altura: 100px;
Se o seu navegador oferecer suporte à validaçã o, você verá os erros de validaçã o, conforme
mostrado na Figura 7-11.
Observe que, apó s clicar no botã o Enviar, o URL nã o mudou porque nenhuma tentativa foi
feita para enviar os dados ao servidor. Se você inserir dados em todos os campos e clicar no
botã o Enviar, verá o QueryString com seus dados.
337
Respostas
Lição 1
1. Resposta correta: B
2. Resposta correta: B
3. Resposta correta: A
A. Correto: A funçã o decodeURIComponent pode desserializar o QueryString.
B. Incorreto: Embora o jQuery tenha uma funçã o de serializaçã o, ele nã o tem uma funçã o
de desserializaçã o.
C. Incorreto: Embora o jQuery tenha uma funçã o de envio, ele serializa o formulá rio e
envia os dados para o servidor.
Lição 2
1. Resposta correta: C
2. Resposta correta: A
B. Incorre cção : O uso do método GET é geralmente preferido para recuperar dados do
servidor.
3. Resposta correta: D
Respostas CAPÍTULO 7
339
CAPÍTULO 8
Sites e serviços
Os capítulos anteriores apresentaram muitas coisas que você pode fazer no navegador, mas
também pode fazer no servidor. Ao usar tecnologias Microsoft, é comum criar um site
usando Visual Studio .NET, que usa ASP.NET ou tecnologias model, view, control (MVC) que
sã o programadas usando Visual Basic .NET ou C #. Essas tecnologias e linguagens estã o
fora do escopo deste livro, mas você pode aprender a criar um formulá rio sem criar um site
para processá -lo?
Este livro é sobre HTML5, CS S3 e JavaScript; este capítulo cobre serviços da web, usando
JavaScript no servidor da web, o que é possível usando Node.js, uma plataforma construída
no tempo de execuçã o de JavaScript do Google Chrome.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
Usando Node.js, você pode escrever JavaScript que é executado no servidor back-
end. Node.js interpreta e executa seu JavaScript usando a má quina virtual V8 do Google ,
que é o mesmo ambiente de tempo de execuçã o para JavaScript que o Google Chrome usa.
341
Após esta lição, você será capaz de:
■■ Instal Node.js.
Instalando Node.js
Para instalar Node.js em seu computador, baixe a versã o para sua má quina em http: //
Apó s a conclusã o da instalaçã o, você pode criar seu primeiro site Node.js abrindo o prompt
de comando e usando seu editor de texto favorito. Crie um arquivo chamado Hel oWorld.js
contendo o seguinte .
Este é o JavaScript! A primeira linha de có digo indica que o mó dulo http precisa ser
carregado. O mó dulo http é um mó dulo interno de baixo nível que é altamente
otimizado para desempenho.
A pró xima linha usa o mó dulo http para criar um objeto de servidor. A funçã o createServer
aceita um ú nico parâ metro que é uma funçã o anô nima e tem objeto de solicitaçã o e
parâ metros de objeto de resposta. Dentro da funçã o, você inclui todo o có digo para
executar seu site ou, melhor ainda, para fazer chamadas para outras funçõ es que
manipulam seu site. Este exemplo nã o faz nada com o objeto de solicitaçã o, mas usa o
objeto de resposta para escrever um cabeçalho HTTP no qual 200 significa sucesso e o tipo
de conteú do informa ao navegador que o conteú do é texto simples.
A pró xima linha encerra a resposta com a mensagem Hel o World e, por fim, uma
mensagem é enviada para a janela do console, informando que uma solicitaçã o foi tratada.
address é definido como localhost, que é 127.0.0.1. Contanto que você tenha um adaptador
de rede operacional instalado em seu computador, este servidor da web deve começar a
escutar as solicitaçõ es da web de entrada.
A ú ltima instruçã o usa o objeto console para escrever uma mensagem na tela para informá -
lo de que o servidor está aguardando solicitaçõ es .
Depois de salvar este arquivo, execute o seguinte no prompt de comando para iniciar a
execuçã o do seu servidor web.
Node HelloWorld.js
Deixe o prompt de comando aberto e abra o navegador. Navegue até o seguinte URL.
FIGURA 8-1 O site Hel oWorld em execuçã o respondendo com uma mensagem
Parabéns! Você instalou o Node.js e escreveu seu primeiro site Node.js. Para iniciar
a execuçã o, você nã o precisa fechar a janela do prompt de comando; você pode
simplesmente pressionar Ctrl + C para cancelar.
Obviamente, a pró xima coisa que você deseja fazer é processar os dados da solicitaçã o para
produzir uma resposta com base na solicitaçã o. Para isso, você pode solicitar o mó dulo url ,
que fornece ajuda para a aná lise do QueryString. O objeto url tem um método de aná lise
que aceita o URL real, e o segundo parâ metro é um sinalizador pelo qual passar um
valor true analisa QueryString. O có digo a seguir lê o nome do QueryStrin g e cria uma
resposta personalizada.
343
Nos exemplos anteriores , você usou a funçã o require para carregar mó dulos, que fornecem
reutilizaçã o de có digo ao adicionar funcionalidade ao Node.js. Você pode criar seu pró prio
mó dulo envolvendo seu có digo em uma funçã o e exportando-o para que possa ser chamado
de outro có digo, como a seguir.
function start () {
export.start = start;
Neste exemplo, o có digo existente foi agrupado com uma funçã o de início. Na parte inferior
do arquivo, a funçã o de início é atribuída a uma propriedade de início no objeto
de exportaçã o . O có digo é salvo em um arquivo hel o.js e o mó dulo é criado.
Você usa o novo mó dulo da mesma forma que usa outros mó dulos, usando a funçã o
require.
Crie um arquivo index.js e insira o có digo a seguir para usar seu mó dulo.
hello.start ();
Neste exemplo, o nome do mó dulo é “./hel o.js”. Observe que um caminho relativo para o
arquivo é usado. A funçã o require retorna um objeto que é atribuído à variá vel hel o e, em
seguida, o método de início é executado.
Depois de salvar o arquivo, você pode executar o có digo executando o seguinte no prompt
de comando.
node index.js
Este có digo funciona da mesma forma que o có digo hel o_joe.js, exceto que este có digo usa
seu novo mó dulo.
Um pacote Node.js , também conhecido como um aplicativo , é uma coleçã o de mó dulos com
um manifesto que descreve o pacote e suas dependências e pode ser uma chave publicada
de forma pú blica e privada
Termos para você e outros usarem. Depois de publicar seu pacote, você pode usar o
gerenciador de pacotes de nó (npm) para instalar um pacote. O pacote pode ser instalado
em um ú nico aplicativo que você está criando ou globalmente para uso com muitos
aplicativos.
Neste exemplo, será criado um mó dulo cal _counter.js, que produzirá uma mensagem de
console sempre que sua funçã o count_call for executada. Um mó dulo simple_math.js será
criado, que conterá uma funçã o de adiçã o e uma funçã o de subtraçã o. Um mó dulo
advanced_math.js será criado, o qual conterá as funçõ es multiplicaçã o, divisã o e
Fibonacci. Todas as funçõ es matemá ticas serã o utilizá veis por outros aplicativos, mas o
contador de chamadas permanecerá privado para o pacote, de modo que cada funçã o
matemá tica chamará a funçã o count_call. Embora todas essas funçõ es possam ser
colocadas em um ú nico mó dulo, este exemplo demonstra o uso de vá rios mó dulos.
Esses mó dulos serã o empacotados para que possam ser publicados. Apó s a publicaçã o do
pacote, você e outras pessoas podem instalá -lo e usá -lo em outros aplicativos.
345
\nome do pacote
\ bin
main.js
\ lib
module1.js
module2.js
package.json
README.md
Dentro da pasta raiz do pacote, você tem um arquivo package.json, que é o arquivo de
manifesto. Você também precisa de um arquivo README.md contendo ajuda suficiente
para iniciar o usuá rio. Além disso, você precisa de uma pasta bin e uma pasta lib . A pasta
bin contém o ponto de entrada para seu pacote; a pasta lib contém os mó dulos.
Na pasta lib, é criado o primeiro mó dulo, denominado cal _counter.js, que possui o seguinte
có digo.
var internal_call_counter = 0;
function count_call () {
++ interna l_call_counter;
module.exports = count_call;
O pró ximo mó dulo criado na pasta lib é simple_math.js, que possui o có digo a seguir.
call_counter ();
retornar x + y;
call_counter ();
return x - y;
module.exports = {
adiçã o: adicionar,
subtraçã o: subtrair
No arquivo simple_math.js, a funçã o require faz referência ao mó dulo cal _counter.js. O uso
da sintaxe './cal _counter' indica que este é um mó dulo local na pasta atual em oposiçã o a
um pacote. A referência é atribuída à variá vel cal _counter . As funçõ es de adiçã o e
subtraçã o chamam a variá vel cal _counter , que faz referência à funçã o count_call. Este
mó dulo exporta duas funçõ es, portanto, um objeto é criado para fornecer acesso a essas
funçõ es. Nesse caso, o método de adiçã o faz referência à funçã o de adiçã o, enquanto o
método de subtraçã o faz referência à funçã o de subtraçã o. É mais comum que o nome do
método seja igual ao nome da funçã o , mas este exemplo demonstra que eles podem ser
diferentes.
O pró ximo mó dulo criado na pasta lib é advanced_math.js, que possui o seguinte có digo.
call_counter ();
return x * y;
}
call_counter ();
return x / y;
call_counter ();
se (contagem == 0) retornar 0;
if (contador == indefinido) {
contador = 1
primeiro = 1;
segundo = 2;
resultado de retorno;
module.exports = {
multiplicaçã o: multiplique,
fibonacci: fibo
347
A funçã o fibo se chama funçã o private_fibo, uma funçã o recursiva que se auto chama até
que a contagem e o contador sejam iguais. A funçã o private_fibo nã o é exportada, portanto,
estará acessível apenas a partir da funçã o fibo que é exportada.
Depois que os mó dulos sã o criados, você pode desejar expor um ú nico objeto com os itens
que sã o exportados para todos os mó dulos. Expor um ú nico objeto torna mais fá cil para os
usuá rios do seu pacote acessarem os recursos do seu pacote. Este é o mó dulo de ponto de
entrada, que é um agregado dos outros mó dulos em seu pacote.
module.exports = {
adiçã o: simple.addition,
subtraçã o: simples.subtraçã o,
multiplicaçã o: avançada.multiplicaçã o,
divisã o: advanced.division,
fibonacci: advanced.fibonacci
math.js sã o criados usando este caminho para a biblioteca. O mó dulo cal _counter.js nã o é
referenciado porque o pacote o usa, mas nã o o expõ e. Finalmente, module.exports é
atribuído a um objeto no qual as funçõ es que foram expostas em simple_math.js e
ad vanced_math.js agora sã o exportadas pelo pacote.
O arquivo README.md contém ajuda suficiente para que o usuá rio comece com seu
pacote. A extensã o de arquivo .md denota um arquivo Markdown . Um arquivo Markdown é
uma maneira simples de fornecer formataçã o em um documento de texto para que ele
possa ser exibido como texto ou em um navegador. Uma chave rá pida
======================
Quando você executa esse comando, ele o conduz por uma série de prompts e, em seguida,
o arquivo é criado para você. Você sempre pode editar o arquivo mais tarde, se necessá rio.
Como a extensã o do arquivo indica, esse arquivo é escrito em JSON, que é JavaScript Object
Notatio n. O seguinte é o arquivo package.json para math_example.
"nome": "math_example",
"scripts": {
"test": "echo \" Erro: nenhum teste especificado \ "&& exit 1"
},
"palavras-chave": [
"matemá tica",
"exemplo",
349
"Adiçã o",
"subtraçã o",
"multiplicaçã o",
"divisã o",
"fibonacci"
],
"licença": "BSD"
Você pode fornecer scripts de teste em seu pacote para que os usuá rios possam instalar seu
pacote e executar os testes em seus computadores.
Publicação do pacote
\nome do pacote
\ bin
main.js
\ lib
advanced_math.js
call_counter.js
simple_math.js
package.json
README.md
Publicar um pacote torna o pacote disponível para todos os usuá rios para uso em seus
aplicativos.
Use o npm para publicar no registro do npm e, em seguida, use o npm para pesquisar
pacotes e instalar o pacote.
Antes de publicar um pacote node.js, você deve criar uma conta para publicar todos os seus
pacotes. Use o npm para criar a conta executando o seguinte comando.
npm adduser
Siga as instruçõ es para um nome de usuá rio (letras minú sculas), senha e endereço de e-
mail. Depois de inserir todas as informaçõ es necessá rias , o npm contata o
registry.npmjs.org para criar sua conta.
A validaçã o da conta atualmente nã o é necessá ria, entã o qualquer pessoa pode criar uma
conta e colocar um có digo incorreto no registro; portanto, ao instalar um pacote
desconhecido do registro npm, cuidado !
Agora que você tem uma conta, pode publicar no registro do npm. Abra a janela do prompt
de comando e mude de seu diretó rio atual para o diretó rio raiz do pacote, onde o arquivo
package.json está localizado. Digite o seguinte comando para publicar o pacote.
npm publicar
Você verá o npm enviando métodos HTTP GET e PUT até que a publicaçã o seja
concluída. Se você nã o tiver erros, o pacote deve ser publicado e imediatamente disponível
para uso de todos.
Agora que seu pacote foi publicado, você pode instalá -lo e usá -lo. Você pode instalar o
pacote globalmente ou localmente no aplicativo que está criando. Instalar o pacote global y
dá a todos os aplicativos a mesma versã o do pacote, de forma que, quando você atualizar o
pacote global com uma nova versã o, todos os aplicativos obtenham a nova versã o. Se você
instalar o pacote local y no aplicativo, você reinstalará o pacote para cada aplicativo. Você
pode atualizar o pacote para um aplicativo e nã o precisa se preocupar em atualizar o
pacote para todos os aplicativos. A opçã o global é tipicamente mais atraente para a maioria
das pessoas, mas geralmente você nã o quer ser forçado a um teste de regressã o para todos
os aplicativos ao atualizar o pacote. Essa escolha é sobre ter controle para atualizar
quando necessá rio versus a conveniência de atualizar tudo de uma vez.
Neste exemplo, um novo aplicativo, math_user, é criado, portanto, essa pasta é criada na
pasta node_samples.
Para instalar o pacote localmente, use a janela do prompt de comando para navegar até
a pasta que contém seu aplicativo e digite o seguinte comando.
Isso cria um subdiretó rio node_modules; na pasta que contém seu aplicativo está uma
pasta para o pacote instalado com todos os seus arquivos.
A Figura 8-4 mostra a tela apó s a execuçã o deste comando. A ú ltima linha mostra a
localizaçã o da pasta na qual o pacote foi instalado.
351
Depois que o pacote estiver globalmente instalado, crie um link para a instalaçã o global de
cada aplicativo que usará o pacote global. Para fazer isso, navegue até a pasta raiz do seu
aplicativo e digite o seguinte comando.
npm link math_example
FIGURA 8-5 O comando npm link mostrando uma junçã o para a instalaçã o global Uma
junçã o é uma rota para a instalaçã o global. Ele se comporta como uma pasta. Você pode
mudar da pasta node_modules para essa pasta usando o comando cd math_example e pode
voltar para a pasta node_modules usando o comando cd ...
Verificação rápida
Agora que você instalou o pacote math_example, escreva algum có digo que acesse o pacote
math_example. Na pasta math_user, crie um arquivo JavaScript denominado main.js e digite
o có digo a seguir.
console.log ();
console.log ();
co nsole.log ();
console.log ();
console.log ();
console.log ('feito');
Este có digo define uma referência ao pacote math_example. O có digo executa um pequeno
teste de cada uma das funçõ es exportadas. Execute o có digo executando o
seguinte comando.
nó principal
353
Embora seja relativamente fá cil criar um mó dulo Hel o com Node.js, muito mais trabalho é
necessá rio se você pretende criar um framework web completo. Por exemplo, quando uma
solicitaçã o é recebida no servidor para um recurso como uma pá gina da Web ou um serviço
da Web, você normalmente precisa encaminhar a solicitaçã o para obter o recurso
adequado. Você também pode querer implementar sessõ es para manter dados entre cada
solicitaçã o. E a autenticaçã o? Nã o faz sentido para você criar esta estrutura quando você
pode instalar uma estrutura mais simplificada . A estrutura de aplicativo da
web expressa para node.js está disponível em http://expressjs.com/ . Você pode instalar o
Key
Começando com expresso
Para começar a usar o Express, você deve instalar o Node.js primeiro e, em seguida, criar
uma pasta para seu aplicativo da web. Neste exemplo, a pasta é a seguinte.
C: \ node_samples \ HelloExpress
Em seguida, você configura uma dependência do expresso, portanto, precisa do nú mero
da versã o atual do expresso. Execute o seguinte comando para obter as informaçõ es da
versã o.
No momento em que este artigo foi escrito, a versã o era 3.0.0. Você precisa desse nú mero
de versã o ao adicionar a dependência ao arquivo package.json.
Para criar o arquivo package.json na pasta Hel oExpress, navegue até essa pasta, execute o
seguinte comando e siga os prompts.
npm init
{
"nome": "HelloExpress",
"ve rsion": "0.0.0",
"main": "index.js",
"scripts": {
"test": "echo \" Erro: nenhum teste especificado \ "&& exit 1"
},
"licença": "BSD"
Abra o arquivo com um editor de texto e adicione a dependência para expressar como
segue.
"nome": "HelloExpress",
"main": "index.js",
"scripts": {
"test": "echo \" Erro: nenhum teste especificado \ "&& exit 1"
},
"licença": "BSD ",
“Privado”: verdadeiro,
“Dependências”: {
“Expresso”: “3.0.0”
O nú mero da versã o pode ter sido definido como “3.x” para recuperar o mais recente da
versã o 3 e private é definido como true, o que indica que este aplicativo será usado apenas
localmente. Se você nã o fornecer o indicador privado, poderá receber uma mensagem do
seu provedor de firewall informando que o site está sendo executado com funcionalidade
limitada.
Agora que você tem a dependência para expressar configurada, pode usar o npm para
instalar todas as dependências executando o seguinte comando.
npm install
npm ls
Este comando fornece uma lista de pacotes instalados para este aplicativo. Você vê que o
express está instalado, mas muitos outros pacotes também estã o instalados, conforme
mostrado na Figura 8-7.
355
FIGUR E 8-7 Instalação do Express, que também instala suas dependências Usando o
Visual Studio 2012 Express para Web
Você pode usar o Visual Studio 2012 Express for Web como seu editor e gerenciador de
arquivos para um nó . Estrutura de pastas js abrindo Visual Studio 2012 Express for Web,
clicando em Arquivo e escolhendo Abrir Site. Selecione a pasta Hel oExpress e clique em
Abrir. O Visual Studio abre a estrutura de pastas para seu uso. Se você clicar no botã o
Salvar tudo, verá que o Visual Studio cria um arquivo de soluçã o (.sln) que contém as
configuraçõ es, para que você possa usar facilmente o arquivo .sln para reabrir a soluçã o.
Você pode continuar a usar seu editor de texto favorito para trabalhar com os arquivos
Node.js. e ainda deve manter uma janela de prompt de comando aberta para executar o
aplicativo Node.js.
Agora você instalou o Express, entã o crie um aplicativo da web. Na pasta Hel oExpress, crie
um arquivo app.js e adicione o seguinte ao arquivo.
Este có digo define uma referência ao pacote expresso que você instalou e, em seguida, cria
um objeto de aplicativo expresso e o atribui à variá vel app. Este objeto fornece muitos
recursos que economizam tempo, em vez de criar tudo desde o início em Node.js.
Express fornece a capacidade de definir rotas usando o app. Sintaxe de Method (), em
que Method é o método HTTP ou verbo. O có digo a seguir é adicionado ao arquivo app.js,
que define uma rota que corresponde a uma solicitaçã o usando o método GET e a URL
relativa de “/”. Na partida, o có digo é programado para entregar uma mensagem Hel o
World ao usuá rio.
});
app.listen (porta);
});
app.listen (porta);
app de nó
Quando o aplicativo é iniciado, você vê uma mensagem informando que o aplicativo está
escutando na porta 8080. Abra o navegador e digite o seguinte URL.
Essa solicitaçã o é roteada para a funçã o que a trata, e Hel o World é enviado para a
resposta, conforme mostrado na Figura 8-8.
Em vez de escrever JavaScript para renderizar cada pá gina, você pode criar pá ginas HTML
que podem ser recuperadas automaticamente com um mínimo de có digo. No arquivo
app.js, substitua a instruçã o app.get pelo seguinte.
357
Essa instruçã o começa com app.use, que monta um caminho a partir do qual os arquivos
sã o veiculados. Na funçã o app.use, express.static especifica a localizaçã o dos arquivos
está ticos. Nesse caso, você precisa criar uma pasta pública em seu aplicativo.
Depois de criar a pasta pú blica, crie um arquivo HTML na pasta pú blica chamado Hel
oForm.
<title> </title>
</head>
<body>
<form method = "get" action = "/ SubmitHello"> Nome de entrada: <input type = "text"
name = "userName" />
</form>
</body>
</html>
Este arquivo HTML contém um elemento < form > e seu atributo method é definido como
GET, enquanto o atributo action é definido como / SubmitHel o. Isso significa que você
precisa de um recurso chamado /
});
Este có digo é semelhante à instruçã o app.get original, exceto que o recurso SubmitHel o é
especificado e o QueryString é acessível usando request .query. A seguir está o arquivo
app.js completo.
app.use (express.static (__ dirname + '/ public'));
});
app.listen (porta);
app de nó
Depois que o aplicativo estiver em execuçã o, abra o navegador e digite a seguinte URL.
Neste exemplo, quando você clica no botã o Enviar, o URL muda para o seguinte.
359
Você percebeu que o URL para obter a pá gina Hel oForm.html era o seguinte?
Você nã o precisa fornecer a palavra “pú blico” no URL porque a funçã o app.use nã o
especifica uma pasta de recursos para o URL. O app.use especificou a localizaçã o dos
arquivos apenas, portanto, o caminho do URL é a raiz do site (\). Você pode especificar
o caminho do URL explicitamente inserindo o caminho na frente do argumento original,
conforme mostrado no exemplo a seguir.
app.use ( '/ forms', express.static (__ dirname + '/ public')); Depois de fazer essa alteraçã o,
execute o aplicativo novamente. Desta vez, insira o seguinte URL no navegador.
Se você tentar o URL original, ainda poderá ver o formulá rio porque ele está armazenado
em cache. Em caso afirmativo, atualize a tela do navegador e nã o será mais possível
recuperar Hel oForm.html do URL original.
Copie o arquivo Hel oForm.html para um novo arquivo denominado Hel oPost.html na
mesma pasta pú blica.
<head>
<title> </title>
</head>
<body>
</form>
</body>
</html>
Como o atributo do método é definido como POST, o processamento dos dados é diferente,
e é por isso que uma nova açã o é fornecida. Nesse ínterim, a pá gina HTML existente
continua a funcionar .
No momento em que este artigo foi escrito, a versã o mais recente é 1.0.10, mas você
também pode usar um curinga para especificar a versã o no arquivo package.json na qual
você deve especificar essa dependência. O seguinte é o arquivo package.json modificado.
"nome": "HelloExpress",
"main": "index.js",
"scripts": {
"test": "echo \" Erro: nenhum teste especificado \ "&& exit 1"
},
"privado": verdadeiro,
"dependências": {
“Formidável”: “1.x”,
"expresso": "3.0.0"
A adiçã o da formidá vel versã o 1.x recupera a versã o mais recente da versã o 1.
npm install
Em seguida, processe os dados postados. Em vez de adicionar uma funçã o cal app.get,
adicione um aplicativo.
pó s funçã o cal. Na cal, você deve criar uma instâ ncia do objeto IncomingForm do pacote
formidá vel e atribuí-lo a uma variá vel de formulário . Em seguida, você deve usar
os campos de variá veis do formulário e exibir uma mensagem ao usuá rio. O arquivo app.js
completo com a funçã o app.post deve se parecer com o seguinte.
app.post ('/ SubmitHelloPost', function (reque st, response) {
361
if (request.method.toLowerCase () == 'post') {
});
});
});
app.listen (porta);
Digite um na me na caixa de texto e clique em Enviar. Você deve ver o resultado exibido na
janela do navegador, conforme mostrado na Figura 8-11.
Lembre-se de que você sempre deve enviar dados de volta ao servidor usando o método
POST.
Verificação rápida
npm install
Resumo da lição
■■ Node.js fornece uma maneira do lado do servidor de criar sites baseados em JavaScript.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
B. Um mó dulo
D. Um pacote
B. Agrupado
C. Nomeado
D. Global
363
Lição 2: Trabalhando com serviços da web
Na liçã o anterior, você viu como pode criar um site que pode servir pá ginas da web e
fornecer respostas HTML para solicitaçõ es. Um problema com o cená rio do site é que
postar dados de formulá rio causa uma resposta que repinta a pá gina com o resultado
HTML. Se a resposta HTML se parece com a pá gina existente, você desperdiça largura de
banda e recursos para redesenhar a pá gina.
Para enviar solicitaçõ es a um serviço da web de sua pá gina da web, você usará AJAX, que
significa Asynchronous JavaScript and XML. Usando AJAX, você pode escrever JavaScript
que chame o servidor de forma assíncrona e processe o resultado. Enquanto isso está
acontecendo, a tela do usuá rio nã o bloqueia ou congela enquanto aguarda a conclusã o da
chamada para o servidor.
Chave
■■ Inserir cliente O método HTTP é definido como PUT e os dados de postback estã o no
corpo da solicitaçã o, portanto, você nã o vê os dados no URL ou QueryString. O seguinte é o
URL e os dados de postback.
para conter o método porque isso quebra a interface RESTful, que especifica que o URL
deve ser uma referência a uma entidade ou coleçã o de entidades. Aqui estã o alguns
exemplos de como colocar o verbo nos dados.
■■ Inserir cliente O método HTTP é definido como POST e os dados de postback estã o no
corpo da solicitaçã o, entã o você nã o vê os dados no URL ou QueryString. O verbo é definido
como PUT nos dados. O seguinte é o URL e os dados de postback.
varb = PUT & name = ACME & Address = 123 + Bumblebee + Lane
365
Uma das maiores desvantagens de usar REST é que alguns navegadores suportam apenas
GET
e métodos POST, enquanto muitos firewal permitem a passagem apenas de métodos GET e
POST .
Por causa desse problema, muitos desenvolvedores criam APIs semelhantes a REST
(sã o RESTful) quando a compatibilidade é mantida com navegadores e firewal se apenas
GET e POST sã o usados.
Os serviços arbitrá rios da Web normalmente têm um formato de interface que permite ao
cliente ler e analisar as informaçõ es. Essas informaçõ es permitem que o cliente faça
chamadas para o serviço da web imediatamente. Um dos formatos de API mais comuns é o
Web Services Description Language (WSDL), pelo qual um documento WS DL que descreve
totalmente as operaçõ es expostas pode ser recuperado do serviço da web.
Os serviços da Web arbitrá rios exigem que o cliente reú na uma solicitaçã o, ou mensagem,
usando uma mensagem XML com formataçã o especial, chamada de mensagem Simple
Object Access Protocol ( SOAP).
"nome": "math_service",
"main": "index.js",
"scripts": {
"t est": "echo \" Erro: nenhum teste especificado \ "&& exit 1"
},
"licença": "BSD",
"privado": verdadeiro,
"dependências": {
"expresso": "3.0.0",
"math_example": "0.x"
}
}
Neste exemplo, existem três dependências. Depois de criar esse arquivo e salvá -lo, você
pode abrir uma janela de prompt de comando, navegar até a pasta math_service e executar
o seguinte comando para instalar as dependências do npm.
npm install
Apó s a conclusã o da instalaçã o, você pode usar esses pacotes. Na pasta math_service, crie
um arquivo app.js e adicione referências a esses pacotes conforme a seguir.
Neste exemplo, as operaçõ es farã o parte da URL, portanto, a operaçã o de adiçã o é criada
adicionando-se o có digo a seguir.
y = Nú mero (request.query.y),
});
A operaçã o de adiçã o usa o método GET conforme indicado pela funçã o app.get cal. Isso
cria uma rota pela qual uma solicitaçã o GET que corresponde à adiçã o executa o bloco de
có digo. No bloco de có digo, três variá veis ( x , y e resultado ) sã o declaradas e
inicializam d. A x e y parâ metros sã o recuperados do QueryString e convertidos em
nú meros. Em seguida, o resultado é preenchido executando o método de adiçã o no objeto
matemá tico com x e y . Finalmente, o objeto de resposta é usado para escrever o có digo de
status no qual 200 é um sucesso e o tipo de conteú do é definido para retornar um resultado
JSON. O objeto de resposta é entã o usado para escrever o objeto JSON.
app.listen (porta);
Depois de salvar o arquivo app.js, você pode iniciar o serviço da web executando o
seguinte comando.
app de nó
Para testar isso, você pode usar o navegador, mas dependendo do navegador que você usa,
pode ser necessá rio clicar em vá rios prompts para ver os resultados. Aqui está o URL.
Quando você finalmente vir o resultado, ele deve se parecer com o seguinte.
{"resultado": 15}
O có digo neste exemplo é semelhante ao có digo no site math_user; no entanto, esse site
retornou HTML, embora um HTML bruto, enquanto este exemplo retornou um objeto
JSON. Este é o seu serviço da web, mas como você pode chamá -lo de uma pá gina da web e
usar o objeto de retorno? É quando o AJAX entra em açã o.
Crie e considere a seguinte pá gina da web Math.html que é criada na pasta pú blica de
math_service.
<head>
<title> </title>
<script type = "text / javascript" src = "/ scripts / default.js"> </script> 368 CAPÍTULO
8 Sites e serviços
</head>
<body>
<form id = "mathForm">
Insira X: <input type = "text" id = "x" /> <br /> Insira Y: <input type = "text" id = "y" />
<br /> Resultado: <span id = "resultado "> </span> <br />
</form>
</body>
</html>
Na pasta pú blica, crie uma pasta de scripts e um arquivo JavaScript default.js para
conter em seu có digo. Adicione a biblioteca jQuery a esta pasta. Você pode obter a
biblioteca jQuery em http://jquery.com se ainda nã o a tiver.
Embora o jQuery seja um produto bastante estável e maduro, ele ainda está sendo
atualizado. Su re que sua tag de script referencie a versão do jQuery que você
instalou.
Usando XMLHttpRequest
O objeto principal que faz uma chamada AJAX é XMLHttpRequest. Como o nome indica, esse
objeto certamente pode ser usado para enviar e receber dados XML, mas também pode ser
usado para enviar e receber outros dados. Em sua forma mais simples, você pode usar este
objeto da seguinte maneira.
A pró xima linha configura a solicitaçã o para usar o método GET com uma URL relativa de /
adiçã o e QueryString de x = 5 & y = 10. O ú ltimo parâ metro (falso) indica se a operaçã o
deve ser executada de forma assíncrona, quando falso significa que a operaçã o é
síncrona. O método aberto nã o se comunica com o servidor; apenas configura a
solicitaçã o. O xmlhttp.
369
No serviço da web de matemá tica, o resultado nã o é XML; é JSON, entã o a ú ltima linha de
có digo precisa ser alterada. Além de ter uma propriedade responseXML, o objeto
XMLHttpRequest tem uma propriedade response que é uma string. A string de resposta
precisa ser convertida em um objeto, e o método JSON.parse pode realizar a tarefa. Além
disso, a URL deve ser montada tomando os valores das caixas de texto para construir esta
QueryString. O có digo a seguir pode ser adicionado ao arquivo default.js para fazer o cal
AJAX.
});
function addNumbers () {
result.innerHTML = jsonObject.result;
A primeira parte deste có digo usa jQuery e adiciona a assinatura ao botã o btnAdd depois
que o documento está pronto. Isso faz com que a funçã o addNumbers seja executada
quando o botã o for clicado.
A funçã o addNumbers ainda nã o usa jQuery. Em primeiro lugar, os x e y valores sã o
extraídos das < entrada > elementos. A variá vel de resultado é definida para fazer
referência ao elemento < span > cujo id é o resultado. O objeto XMLHttpRequest é criado e,
em seguida, o método aberto é executado com uma QueryString construída. O método send
é executado e a resposta é analisada para criar um objeto. Finalmente, o innerHTML para o
elemento result < span > é preenchido com o valor da propriedade result do servidor. Para
testar esta pá gina, primeiro execute o seguinte comando para iniciar o serviço da web.
app de nó
Depois que o serviço da web estiver em execuçã o, abra o navegador e entre no seguinte
URL.
Insira os valores em X e Y e clique no botã o Adicionar. Você deve ver o resultado conforme
mostrado na Figura 8-12.
Agora que o có digo está operacional, você pode querer executar a chamada AJAX de forma
assíncrona.
Você pode fazer isso localizando a chamada do método aberto e alterando o falso para
verdadeiro. No entanto, como essa configuraçã o faz com que um encadeamento seja criado
e o método de envio seja chamado , o có digo nã o aguardará o resultado ser retornado. Em
vez disso, o programa continua para a pró xima linha de có digo, onde tenta processar o
resultado, mesmo que o resultado possa nã o ter chegado do servidor. Para lidar com
a chamada assíncrona, você deve se inscrever no evento onready-stateschange , que é
disparado sempre que o estado de XMLHttpRequest muda. Se o estado pronto mudar para
4, a chamada foi concluída, mas você também deve testar o có digo de status HTTP para
garantir que nenhum erro ocorreu, verificando se o có digo de retorno é 200. A seguir está a
funçã o addNumber modificada que trata corretamente o cal assíncrono.
function addNumbers () {
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
result.innerHTML = jsonObject.result;
Você deve estar se perguntando o que significa o nú mero 4. A seguir está uma lista dos
có digos readyState.
function addNumbers () {
371
result.innerHTML = jsonObject.result;
if (evt.lengthComputable) {
// exibe percenComplete
} outro {
O servidor deve fornecer um valor para a propriedade carregada e a propriedade total para
que funcione corretamente. O evento de progresso pode ser mais ú til ao carregar uma
grande quantidade de dados no navegador ou ao carregar um arquivo grande.
Manipulação de erros
Se ocorrer um erro , o có digo de status HTTP será diferente de 200. Você também pode se
inscrever nos eventos de erro e abortar, conforme mostrado no exemplo de có digo a seguir.
function addNumbers () {
xmlhttp.onreadystatechange = function () {
resu lt.innerHTML = jsonObject.result;
Agora que você sabe sobre o objeto XMLHttpRequest, esteja ciente de que os navegadores
podem implementar esse objeto de maneira diferente. Portanto, em vez de escrever uma
grande quantidade de có digo para lidar com as diferenças, use um dos wrappers jQu ery
para XMLHttpRequest.
Você pode usar o jQuery para simplificar as chamadas AJAX e ser independente do
navegador. Os métodos jQuery podem ser executados de forma síncrona ou assíncrona. A
seguir está uma lista dos métodos jQuery disponíveis ; lembre-se de que o objeto jQuery
tem o alias do sinal de dó lar ($) para evitar a digitaçã o de tantos caracteres. Onde nã o há
sinal de dó lar, o método pode ser executado em objetos jQuery que sã o referenciados com
um seletor.
■■ $ .ajaxPrefilter () Interface de baixo nível que lida com opçõ es AJAX personalizadas
antes de cada solicitaçã o ser enviada e antes de $ .ajax () processar as solicitaçõ es
■■ .ajaxSend () manipulador de eventos AJAX global que você usa para anexar uma funçã o
a ser executada antes que um pedido AJAX seja enviado
■■ $ .ajaxSetup () Interface de baixo nível que define valores padrã o para solicitaçõ es
AJAX futuras
■■ .ajaxSuccess () manipulador de eventos AJAX global para anexar uma funçã o a ser
executada sempre que uma solicitaçã o AJAX for concluída com êxito y
■■ $ .get () Método abreviado para carregar dados do servidor usando HTTP GET
solicitaçã o
■■ $ .getJSON () Método abreviado para carregar dados codificados em JSON do servidor
usando uma solicitaçã o GET HTTP
■■ .load () Método abreviado para carregar dados do servidor e colocar o HTML retornado
no elemento correspondente
■■ $ .param () Método auxiliar para criar uma representaçã o serializada de uma matriz ou
objeto, adequada para uso em uma string de consulta de URL ou uma solicitaçã o AJAX
■■ $ .post () Método abreviado para carregar dados do servidor usando um HTTP POST
solicitaçã o
373
Alguns desses métodos sã o discutidos em capítulos posteriores, mas você pode obter mais
informaçõ es em http://jquery.com .
O método $ .ajax () é um wrapper para o objeto XMLHttpRequest que fornece uma maneira
independente do navegador de escrever sua cal AJAX. O método $ .ajax () aceita um
parâ metro de objeto que contém todas as configuraçõ es da cal AJAX. O exemplo de có digo a
seguir é uma substituiçã o para a funçã o add Number.
function addNumbers () {
dados: dados,
tipo: 'GET',
cache: falso,
dataType: 'json',
});
Neste exemplo, jQuery recupera os valores de x e y . Um objeto de variá vel de dados é entã o
criado para conter x e y . A chamada $ .ajax () é executada a seguir; leva um argumento de
objeto com todas as configuraçõ es de cal. Neste exemplo, o objeto é criado embutido. A
propriedade url é definida e os dados sã o definidos para o objeto de dados criado na
instruçã o anterior. A propriedade type é o método HTTP, que suporta GET, POST, PUT e
DELETE, mas lembre-se de que muitos Firewal bloqueiam PUT e DELETE. A propriedade
cache é definida como false para indicar que o resultado nã o deve ser armazenado em
cache. A propriedade dataType define o tipo de dados que você espera receber do servidor
e pode ser definida como 'json', 'xml', 'html', 'script', 'jsonp' ou 'texto'.
O uso de JSONP fornece acesso de domínio cruzado a uma API JSON existente
envolvendo um JSON
A ú ltima propriedade, sucesso, é definida como uma funçã o a ser executada quando a
chamada retorna com sucesso.
Pode ser um nome de funçã o que contém o có digo ou, conforme mostrado no exemplo,
pode ser uma funçã o anô nima com o có digo. Este có digo é executado de forma
assíncrona como o có digo XMLHttpRequest anterior.
374 CAPÍTULO 8 Sites e serviços
Você pode usar uma maneira mais concisa de escrever este có digo com o método $ .get ()
ou, melhor ainda, usar o método $ .getJSON (), conforme mostrado no exemplo a seguir.
});
<head>
<title> </title>
</head>
<body>
<form id = "mathForm">
Insira X: <input type = "text" id = "x" /> <br /> Insira Y: <input type = "text" id = "y" />
<br /> Resultado: <span id = "r esult "> </span> <br />
</form>
</body>
</html>
});
Para a funçã o subtractNumbers, você pode usar o método $ .post () onde o HTTP POST
método é obrigató rio. Para a funçã o multiplyNumbers onde o método HTTP PUT será
usado, e para a funçã o divideNumbers onde um método HTTP DELE TE será usado, o
método $ .ajax () será chamado. O exemplo de có digo a seguir demonstra essas funçõ es,
mas elas nã o funcionarã o até que o arquivo app.js seja atualizado para aceitar essas
chamadas.
function subtractNumbers () {
375
}, 'json');
function multiplyNumbers () {
$ .ajax ({
dados: dados,
tipo: 'PUT',
dataType: 'json',
cache: falso,
});
function divideNumbers () {
dados: dados,
tipo: 'DELETE',
dataType: 'json',
cache: falso,
sucesso: funçã o (dados) {
});
A seguir está o arquivo app.js concluído que mostra o roteamento para as solicitaçõ es de
subtraçã o, multiplicaçã o e divisã o.
y = Nú mero (request.query.y),
response.writeHead (200, {'Content-Type': 'application / jso n'}); 376 CAPÍTULO 8 Sites e
serviços
});
y = Nú mero (campos.y),
});
});
y = Nú mero (campos.y),
});
});
y = Nú mero (campos.y),
});
});
app.listen (porta);
Você pode ver que o jQuery simplifica as chamadas AJAX. Todas essas funçõ es executam o
mesmo có digo quando bem-sucedidas, e você pode querer refatorar esse có digo para
chamar uma funçã o comum. Você também pode estar trabalhando com um grande
aplicativo que chama addNumbers de vá rias funçõ es, mas deseja que um có digo diferente
seja executado com êxito. Nã o há có digo para lidar com erros.
Você também pode querer executar o có digo de limpeza, independentemente de a chamada
AJAX ter sido bem-sucedida ou falhar. Mais importante, você pode querer executar outra
chamada AJAX apó s o primeiro AJAX
a chamada foi bem sucedida. Você pode usar promessas para fazer isso.
377
Quando você usa jQuery para executar uma cal AJAX, um objeto de promessa é
retornado. Pense em uma promessa como uma promessa de trabalho. O objeto de
promessa permite que você registre uma chamada -
método de retorno a ser executado quando a chamada AJAX for bem-sucedida, falhar,
estiver progredindo e for concluída. O objeto de promessa tem os seguintes métodos que
você pode usar para registrar funçõ es chamadas.
■■ done () Adicionar manipuladores a serem chamados quando a chamada AJAX for bem-
sucedida
O có digo a seguir demonstra a refatoraçã o da funçã o addNumbers para usar a promessa
que é retornada do cal AJAX.
function addNumbers () {
function getFormData () {
A funçã o addNumbers é responsá vel por coletar os dados a serem passados para a funçã o
serverAddition e decidir como processar o resultado. Para coletar os dados, uma chamada é
feita para a funçã o getFormData que coleta os dados e cria um objeto que pode ser usado
para a calibraçã o AJAX. O objeto de dados é passado para a funçã o serverAddition. A
promessa retornada é usada encadeando uma chamada ao método executado. O método
done requer um parâ metro de funçã o, que pode ser uma funçã o anô nima como nos
exemplos anteriores, ou você pode passar o nome de uma funçã o como no exemplo em que
a funçã o displayResult é especificada. A criaçã o de uma funçã o específica permite que as
outras funçõ es chamem a funçã o displayResult, o que ajuda a promover a reutilizaçã o do
có digo. O seguinte é o arquivo default.js apó s refatorar as outras funçõ es.
function addNumbers () {
function getFormData () {
function subtractNumbers () {
}
function multiplyNumbers () {
return $ .ajax ({
dados: dados,
tipo: 'PUT',
dataType: 'json',
cache: falso
});
function divideNumbers () {
379
return $ .ajax ({
dados: dados,
tipo: 'DELETE',
dataType: 'json',
cache: falso
});
Se você exibir a pá gina da Web e digite os nú meros de x e y , você deve ver valores de
retorno adequadas até que você tente dividir b y zero. Em JavaScript, dividir por zero nã o
lança uma exceçã o; ele retorna infinito. A conversã o para um objeto JSON, no entanto,
lançará um erro de aná lise, portanto, nenhum valor é exibido.
Para resolver esse problema, uma funçã o displayError é adicionada e o método de falha da
promessa é usado para assinar a falha da cal AJAX, conforme mostrado no exemplo de
có digo a seguir.
function divideNumbers () {
O método fail é encadeado à chamada serverDivision apó s o método feito cal. Além disso,
a funçã o displayE rror determina se serverData tem uma propriedade de resultado usando
a palavra-chave in . Se a propriedade do resultado existir, seu valor será exibido. Esta
funçã o possui um segundo parâ metro, denominado erro, que identifica a origem do
erro. Ambos os itens sã o concatenados e exibidos.
Nos exemplos anteriores, a pá gina da web Math.html veio do mesmo site que continha o
serviço da web, e o URL para as solicitaçõ es de serviço da web era um URL relativo no
site. Se a pá gina Math.html tivesse chamada AJAX e contivesse URLs para acessar serviços
da web em outros sites, a chamada AJAX falharia porque isso representa um possível
ataque de script entre sites (XSS). Existem maneiras de permitir chamadas AJAX entre sites,
a mais comum das quais é o compartilhamento de recursos de origem cruzada (CORS) . CORS
é uma especificaçã o de navegador que define maneiras de um servidor web permitir que
seus recursos sejam acessados por uma pá gina web de um domínio diferente. CORS
Chave
Os termos fornecem um meio-termo pelo qual você pode configurar o acesso entre
domínios em vez de permitir o acesso a todos ou negar o acesso a todos.
Access-Control-Allow-Origin: *
Verificação rápida
■■ Você tem um serviço da web que fornece acesso somente leitura aos dados. Você
deseja expor esse serviço da web para que ele possa ser chamado de qualquer outro
site. Qual cabeçalho você retornaria?
Access-Control-Allow-Origin: *
Resumo da lição
■■ AJAX, que significa Asynchronous JavaScript and XML, permite escrever JavaScript que
chama o servidor de forma assíncrona e processa o resultado.
■■ Você pode usar o jQuery para criar chamadas assíncronas independentes do navegador
para o servidor.
JQuery tem um objeto de promessa que você pode usar para registrar funçõ es a
serem executadas quando a chamada AJAX está progredindo, foi bem-sucedida, falhou ou
foi concluída. Um objeto de promessa é retornado de todas as chamadas AJAX.
■■ Compartilhamento de recursos de origem cruzada (CORS) pode ser implementado no
servidor para permitir que os navegadores façam ligaçõ es para o serviço da web de outros
domínios.
381
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que
cada escolha está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Você deseja criar um serviço REST para seu serviço da web interno e usar os verbos
HTTP que correspondem à s operaçõ es CRUD. Você sabe que o navegador que seus usuá rios
usarã o é compatível e o firewall nã o será um problema. Quais sã o os verbos HTTP que
correspondem a CRUD (em ordem)?
2. Qual é o objeto principal usado para fazer uma chamada AJAX assíncrona que retorna um
resultado JSON?
A. XMLHttpRequest
B. AjaxRequest
C. JsonResponse
D. AjaxAsync
3. Você deseja usar jQuery para fazer uma chamada AJAX que usará o método HTTP POST.
A. $ .post ()
B. $ .getJSON ()
C. $ .get ()
D. $ .param ()
Pratica exercícios
Neste exercício, você aplica seu conhecimento de site, serviço da web e Node.js criando um
site que recebe dados de postback da pá gina ContactUs.html do projeto WebCalculator que
você modificou no capítulo anterior. Você cria o site em uma pasta separada de sua soluçã o
WebCalculator e, a seguir, copia o projeto WebCalculator para uma subdiretó rio do
site. Nesse cená rio, o Node.js ainda pode servir pá ginas do WebCalculator 382 CAPÍTULO
8 Sites e serviços
projeto. Da perspectiva do Node.js, todos os arquivos estã o em seu site, mas você ainda
pode abrir a soluçã o WebCalculator no Visual Studio conforme necessá rio.
Isso requer que você navegue até o local e crie a pasta. Por exemplo, os comandos a seguir
navegam até a pasta Practice Exercises na raiz da unidade C, crie uma nova pasta
ContosoWeb e navegue até a nova pasta.
C:
md ContosoWeb
cd ContosoWeb
npm init
■■ versã o: 0.0.0
■■ main: index.js
■■ autor: seu nome
■■ licença: BSD
"nome": "ContosoWeb",
"main": "index.js",
"scripts": {
"test": "echo \" Erro: nenhum teste foi especificado \ "&& exit 1"
},
"palavras-chave": [
"Contoso",
"WebCalculator"
],
"licença": "BSD" ,
“Dependências”: {
383
“Formidável”: “1.x”,
“Expresso”: “3.0.0”
npm install
8. Abra o Visual Studio Express 2012 for Web. Clique em Arquivo e escolha Abrir
Site; selecione a pasta ContosoWeb.
9. Na pasta do site da Contoso, crie um arquivo index.js e adicione uma referência aos
pacotes expressos e formidá veis da seguinte maneira.
10. Adicione uma instruçã o para mapear solicitaçõ es está ticas para a pasta WebSolution /
We bCalculator da seguinte maneira.
response.redirect ('default.html');
});
12. Adicione o có digo para ouvir na porta 8080 e registre uma mensagem no console
informando isso.
response.redirect ('default.html');
});
app.listen (porta);
13. Teste seu trabalho executando o site e usando o seguinte comando na janela do prompt
de comando.
índice de nó
16. Modifique o arquivo index.js para que um POST para / ContactMessage retorne uma
mensagem de agradecimento ao cliente e registre uma pequena mensagem na janela do
console como a seguir.
firstName = fields.firstName,
email = fields.email,
me ssage = fields.message;
});
});
17. No Visual Studio, abra a pá gina ContactUs.html e altere o elemento < form > para POST
na URL / ContactMessage.
Exercícios de prá tica CAPÍTULO 8
385
2. Abra o arquivo index.js. Crie uma có pia da funçã o app.post () que você criou no Exercício
1. Modifique a có pia para que seja o serviço da web e acessível usando a URL relativa /
ContactService. Modifique o có digo para que um objeto JSON seja retornado com uma
propriedade de resultado que contém a mesma mensagem que estava na resposta da
pá gina da web do Exercício 1. Modifique a mensagem registrada no console para que você
possa saber a diferença entre lidar com um postback de pá gina e um postagem de serviço
da web.
response.redirect ('default.html');
});
firstName = fields.firstName,
email = fields.email,
mensagem = f ields.message;
});
});
app.post ('/ ContactService', function (request, response) {
firstName = fields.firstName,
email = fields.email,
mensagem = campos.mensagem,
});
});
app.listen (porta);
Clique com o botã o direito na pasta de scripts e adicione um novo arquivo JavaScript
denominado ContactUs.js.
<head>
<link href = "Content / default.css" rel = "stylesheet" /> Exercícios prá ticos CAPÍTULO 8
387
</head>
<body>
<div id = "container">
<cabeçalho>
<hgroup id = "headerText">
</hgroup>
</header>
<nav>
</nav>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
</form>
</div>
</div>
<ao lado>
</aside>
<footer>
</p>
</footer>
</div>
</body>
</html>
7. No arquivo ContactUs.js, adicione uma funçã o de servidor cal que usa jQuery para fazer
um AJAX
function callServe r () {
}, 'json');
8. No arquivo ContactUs.js, adicione uma referência a jQuery e adicione uma funçã o $
(document) .ready () com uma chamada para se inscrever no evento click do botã o submit
para que clicar no botã o submit execute o Cal Server funçã o.
$ (document) .ready (function () {
});
function callServer () {
var data = $ ('form [name = "ContactForm"]'). serialize (); $ .post ('/ ContactService', data,
function (returnObject) {
}, 'json') ;
11. Pressione Ctrl + F5 para garantir que você tenha a versã o mais recente do arquivo.
Em vez de ver uma nova pá gina, você deve ver o resultado na mesma pá gina, conforme
mostrado na Figura 8-15.
Exercícios de prá tica CAPÍTULO 8
389
FIGURA 8-15 O formulá rio enviado exibindo uma mensagem na mesma pá gina Exercícios
práticos sugeridos
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Aprenda mais sobre Node.js criando um serviço da web que tenha mais
funcionalidades.
■■ Exercício 2 Saiba mais sobre serviços da web criando um serviço da web no Visual
Studio
Respostas
Lição 1
1. Resposta correta: D
2. Respostas corretas: A e D
3. Resposta correta: D
C. Incorreto: O pacote expresso simplifica a recuperaçã o de conteú do está tico, mas faz
mais.
Lição 2
1. Resposta correta: C
C. Correto: PUT é para criar, GET é para recuperar, POST é para atualizar e DELETE é
para excluir.
D. Incorreto: UPDATE nã o é um método HTTP.
Respostas CAPÍTULO 8
391
2. Resposta correta: A
3. Resposta correta: A
CAPÍTULO 9
Operações assíncronas
Você esperou até que sua operaçã o fosse concluída e, em seguida, o aplicativo começou a
funcionar novamente. Você já viu esse comportamento em pá ginas da web? Você sabe que
o problema é devido a operaçõ es de longa duraçã o, mas nã o deveria haver uma maneira
melhor de escrever esse có digo?
A resposta a essas perguntas é implementar operaçõ es de longa duraçã o como operaçõ es
assíncronas porque essas operaçõ es sã o atualmente operaçõ es síncronas. O có digo
síncrono tem um caminho de execuçã o sequencial e, quando o có digo de longa duraçã o está
em execuçã o, nada mais pode ser realizado. O que é necessá rio é outro caminho de
execuçã o para que o có digo de longa execuçã o possa ser executado em um caminho de
execuçã o enquanto a interface do usuá rio responde em outro caminho de execuçã o; isso é o
que as operaçõ es assíncronas fazem.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
WinJS
393
Esta liçã o enfoca os objetos adiados e prometidos do jQuery para controlar a execuçã o de
execuçã o assíncrona.
Termos que ainda nã o podem ser calculados. O objeto de promessa pode estar em um dos
três estados: pendente, resolvido ou rejeitado. Ele começa no estado pendente, passa para
resolvido ou rejeitado e nã o muda. O benefício é que ele permite que você escreva uma
ló gica sem bloqueio que seja executada de forma assíncrona, sem ter que escrever muitos
có digos de sincronizaçã o e plumbing.
CommonJS, que define uma especificaçã o para usar JavaScript em todos os lugares, define a
especificaçã o Promise / A que muitas tecnologias JavaScript implementam. O objeto de
promessa é implementado em WinJS e jQuery. Depois de entender o conceito de um objeto
de promessa, você descobrirá que é fá cil de implementar usando qualquer tecnologia .
Considere o seguinte exemplo de có digo síncrono que usa o objeto XMLHttpRequest para
fazer uma calibraçã o AJAX.
xhr.send ();
if (xhr.status == 200) {
return xhr;
Neste exemplo, passar um valor false para o método open faz com que o có digo seja
executado de forma síncrona. Quando o método de envio é chamado, o programa espera
até que o resultado esteja disponível e entã o prossegue para a pró xima linha de có digo,
onde o status retornado é verificado para determinar se ocorreu um erro. Neste exemplo, o
resultado pode apenas ser retornado ao calmante que está aguardando a conclusã o da
operaçã o. É como se o cal e r puxasse o resultado da funçã o fetchAjaxSync.
O bloco de có digo é compacto, fá cil de ler e simples. Neste exemplo, a chamada AJAX leva
30 segundos para ser concluída e outro có digo nã o pode ser executado. O resultado é que a
tela parece travar até que a chamada AJAX seja concluída. Esse é o caso de fornecer um
modelo de programaçã o assíncrona. O có digo a seguir il ustra a reescrita.
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
processResult ();
outro {
Além disso, o evento onreadystatechanged recebe uma funçã o que é executada sempre que
o objeto XMLHttpRequest muda de estado. Quando o estado tem o valor 4 , a operaçã o é
concluída e o status é verificado em busca de um erro. Como essa é uma operaçã o
assíncrona, o programa nã o espera quando chama o método de envio. Em vez disso, o
programa prossegue para a pró xima linha e sai da funçã o fetchAjaxAsync. Quando o
resultado está disponível, uma chamada para a funçã o processResult é feita e o resultado é
passado. É como se a chamada assíncrona enviasse o resultado ao có digo que o processará .
Quando você tem um có digo que precisa encadear vá rias chamadas assíncronas, de modo
que cada chamada deve ser concluída antes do início da pró xima, você deseja criar uma
chamada assíncrona para uma sequência de chamadas . Isso fica difícil
rapidamente. Atualmente, a funçã o fetchAjaxAsync é um tanto genérica; você passa os
parâ metros e obtém um resultado. No entanto, se você deseja encadear chamadas
adicionais, pode ser necessá rio modificar este có digo para torná -lo mais específico para a
tarefa que você está tentando realizar. O objeto de promessa ajuda a resolver esses
problemas e permite que as operaçõ es sejam encadeadas facilmente.
Por exemplo, chamar o método feito no objeto de promessa permite que você passe uma
funçã o contendo có digo que é executado quando o objeto de promessa é resolvido
(concluído).
Liçã o 1: Operaçõ es assíncronas usando jQuery e WinJS CAPÍTULO 9
395
A seguir está um exemplo de uso do método $ .Deferred () para definir um tempo limite
que um usuá rio pode assinar usando os métodos no objeto de promessa.
Neste exemplo de có digo, o nome da funçã o termina com Async como uma convençã o para
ajudar o desenvolvedor a entender que uma chamada assíncrona está sendo feita nesta
funçã o. Um objeto adiado é criado usando o método $ .Deferred e atribuído à variá vel
adiada.
Em seguida, é chamada a funçã o global JavaScript setTimeout, que tem um parâ metro de
funçã o e um parâ metro de tempo limite em milissegundos. O parâ metro de funçã o
contém o có digo a ser executado quando o cronô metro expira. Nenhum có digo específico
do aplicativo está na funçã o. Em vez disso, o método de resoluçã o é chamado no objeto
adiado para indicar a conclusã o do cronô metro. Chamar o método de resoluçã o no objeto
adiado altera o estado do objeto de promessa para resolvido e executa todo o có digo que foi
anexado ao objeto de promessa usando o método executado.
Além do método de resoluçã o, você pode chamar o método de rejeiçã o para indicar uma
falha da funçã o assíncrona. A seguir está um exemplo do uso da funçã o timeoutAsync.
function abcAsync () {
promessa de retorno;
Neste exemplo, o nome da funçã o também termina com Async para indicar que é
assíncrona.
É importante manter esta convençã o e sempre retornar um objeto de promessa que foi
chamado de 396 CAPÍTULO 9 Operaçõ es assíncronas
A funçã o pode usar para adicionar mais có digo a ser executado na conclusã o ou que o
calmante pode usar para verificar o estado da promessa. A funçã o timeoutAsync é
chamada, o que executa a açã o de tempo limite, mas nã o executa o có digo específico do
aplicativo. Em seguida, o có digo específico do aplicativo é adicionado ao objeto de
promessa chamando o método feito no objeto de promessa e passando o có digo. Quando
você assina o objeto de promessa usando o método done, seu có digo é executado apó s a
conclusã o bem-sucedida (resolvido, nã o rejeitado). Finalmente, o objeto de promessa é
retornado ao telefone.
Quando este có digo é executado, há um atraso de dois segundos e, em seguida, um pop-up é
exibido com a mensagem “pronto!”
Você pode chamar o método done vá rias vezes para adicionar mais có digo a ser executado
apó s a conclusã o bem-sucedida. A ordem em que você adiciona o có digo é como o có digo
será executado. Além disso , o có digo tem garantia de execuçã o apenas uma vez, porque
você nã o pode alterar o estado depois que ele foi alterado para resolvido ou falhou.
Falha de manuseio
Você pode executar o có digo em caso de falha da chamada assíncrona, inscrevendo-se no
objeto de promessa e usando o método fail. O exemplo a seguir demonstra o uso do método
fail para executar có digo em caso de falha, que é o estado rejeitado.
function abcAsync () {
promessa de retorno;
Além de assinar o sucesso ou a falha, você pode adicionar có digo para executar quando a
chamada assíncrona for concluída, independentemente do sucesso ou da falha. Inscreva-se
no objeto de promessa usando o método always. O exemplo a seguir demonstra o uso do
método always.
function abcAsync () {
promessa de retorno;
Nos bastidores, há uma coleçã o feita de funçõ es e uma coleçã o falhada de funçõ es.
397
"sempre!" mensagem antes do "pronto!" ou “falhou!” mensagem porque a assinatura
sempre está antes das outras. Se a assinatura always for a ú ltima assinatura, ela será
executada por ú ltimo.
É ú til saber que você pode assinar o objeto de promessa mesmo depois de resolvido.
Isso executa imediatamente a funçã o que você passa para o método executado. Considere o
exemplo a seguir, no qual dois objetos de promessa sã o usados para encadear açõ es, e a
conclusã o de secondPromise adiciona uma funçã o a firstPromise, que já foi concluída.
function abcAsync () {
firstPromise.done (function () {
secondPromise.done (function () {
});
});
return firstPromise;
Neste exemplo, apó s 2 segundos, o objeto firstPromise é concluído, o que inicia um novo
tempo limite, criando assim o objeto secondPromise. Apó s 3 segundos (5 segundos a partir
do início da funçã o), o objeto secondPromise é concluído, o que adiciona uma funçã o ao
objeto firstPromise. Como o objeto firstPromise já foi concluído, a funçã o é executada
imediatamente. As assinaturas existentes nã o sã o executadas novamente porque as funçõ es
de assinante têm garantia de execuçã o apenas uma vez.
Você também percebeu que o encadeamento da segunda operaçã o assíncrona exigia que
você aninhasse a segunda operaçã o dentro do có digo de conclusã o bem-sucedida da
primeira operaçã o assíncrona? Quando você precisa encadear três, quatro ou mais
operaçõ es, pode se envolver em aninhar vá rios níveis e criar có digo nã o gerenciá vel, como
demonstra o exemplo a seguir.
function abcAsync () {
firstPromise.done (function () {
se condPromise.done (function () {
thirdPromise.done (function () {
fourPromise.done (function () {
});
});
});
});
return firstPromise;
function abcAsync () {
var firstPromise = timeoutAsync (2000);
});
});
});
fourPromise.done (function () {
});
return fourPromise;
O método pipe cria imediatamente um objeto de promessa que pode ser inscrito
e devolvido de forma adequada ao emissor. Isso é interessante porque timeoutAsync
(1234) ainda nã o é chamado por 6 segundos e essa chamada estava criando o objeto
fourPromise. O método pipe criou um objeto proxy e o retornou, mas apó s 6 segundos, a
chamada para timeoutAs ync (1234) criou um objeto de promessa, que foi anexado ao
objeto proxy original.
Há mais nesta histó ria, no entanto. Se a primeira chamada assíncrona falhar, a falha será
automaticamente passada para o objeto de promessa canalizada na cadeia. Você
nã o precisa de có digo extra para lidar com isso. Você pode assinar a falha do objeto
fourPromise e será notificado automaticamente se qualquer chamada assíncrona na cadeia
falhar.
399
Verificação rápida
Você pode usar o método $ .when () para indicar a conclusã o de vá rias operaçõ es
assíncronas. O método $ .when () nã o é bloqueador, entã o é normalmente usado com um
objeto adiado . No exemplo a seguir, o exemplo anterior foi reescrito para executar todas as
quatro operaçõ es em paralelo.
function abcAsync () {
Atualizando progresso
O objeto adiado também pode notificar seu objeto de promessa quando o progresso for
alterado. Ele faz isso executando o método de notificaçã o do objeto adiado quando você
deseja atualizar o progresso.
O exemplo a seguir é uma reescrita do exemplo anterior; o objeto adiado notifica seus
assinantes da mudança de progresso .
function abcAsync () {
var count = 0;
function runAbcAsync () {
promessa de retorno;
À s vezes, você precisa fazer uma chamada assíncrona condicional y. No caso de operaçõ es
encadeadas nas quais uma operaçã o intermediá ria é executada condicionalmente, você
precisa de uma maneira de unir (ou remover) a operaçã o. Considere o seguinte exemplo,
no qual a terceira operaçã o assíncrona é executada condicionalmente.
}): secondPromise;
});
fourPromise.done (function () {
401
});
return fourPromise;
Neste exemplo, o includeThird variá vel é passado para a funçã o abcAsync e é usado para
determinar se a terceira funçã o assíncrona deve ser cal ed. Se includeThird for false,
a variá vel thirdPromise ainda precisa ser atribuída a uma promessa para encadear a quarta
cal assíncrona, entã o secondPromise é atribuído diretamente à variá vel thirdPromise . Isso
mantém a cadeia de operaçõ es.
Quando você precisar criar um objeto de promessa cujo estado seja resolvido, use
o método $ .when () .
Resumo da lição
■■ O objeto de promessa tem os métodos done, fail, always e progress que aceitam um
parâ metro de funçã o, o que permite que você assine a mudança de estado. O método then
() no objeto de promessa permite que você se inscreva em done, fail e progress.
■■ O método state pode ser usado para obter o estado atual do objeto de promessa.
Os métodos rejeitar e rejeitar com o objeto diferido indicam uma operaçã o com falha. Os
métodos de notificaçã o e notificaçã o com o objeto adiado atualizam o progresso.
■■ O nome de todas as funçõ es que executam chamadas assíncronas deve terminar com
Async, e essas funçõ es devem sempre retornar um objeto de promessa.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. tubo ()
B. feito ()
C. resolve ()
D. sempre ()
A. resolve ()
B. feito ()
C. $ .when ()
3. Qual método você chama para assinar a conclusã o bem-sucedida de uma operaçã o
assíncrona?
A. feito
B. sempre
C. completo
D. sucesso
4. Qual método você chama no objeto adiado para indicar uma mudança em andamento?
A. progresso
B. notificar
C. feito
D. resolver
403
Outra maneira de realizar operaçõ es assíncronas é usar web workers. Os Web workers sã o
ú teis para a execuçã o de um arquivo de script em uma tarefa bac kground. O trabalhador
pode enviar mensagens para a tarefa de geraçã o postando mensagens para um
manipulador de eventos especificado pelo criador. As mensagens podem ser qualquer
objeto que possa ser serializado. O thread de trabalho nã o bloqueia o thread da interface do
usuá rio, entã o a IU permanece rá pida e fluida.
É comum iniciar um web worker, que cria seu pró prio loop de eventos e aguarda novas
entradas. Isso é semelhante a um serviço, que inicia e espera pela entrada e nã o termina
apó s o processamento da entrada.
Considere a seguinte pá gina HTML que aceita entrada e tem um botã o que envia a entrada
a um web worker. O web worker responde uma vez para cada caractere da mensagem
enviada, retornando a letra maiú scula.
<head>
<title> </title>
</head>
<body>
<input type = "text" id = "message" value = "Digite a mensagem aqui" /> <br />
<button id = "btnSend" type = "button"> Enviar mensagem </ bu tton> <br />
</body>
</html>
Esta pá gina HTML tem uma referência a jQuery e um arquivo default.js. O arquivo default.js
tem có digo para criar um novo web worker chamando o construtor Worker () e passando o
URI de um script para execuçã o. Você pode receber notificaçõ es do web worker
configurando as propriedades onmessage e onerror para uma funçã o de manipulador de
eventos, conforme mostrado no exemplo a seguir.
/// <reference path = "Scripts / jquery-1.8.2.js" / > var worker = new Worker
('myWork.js');
});
});
para (c em e.data) {
Verificação rápida
Resumo da lição
405
Revisão da aula
1. No có digo do web worker, você deseja que o có digo assíncrono atualize o
DOM. Qual método você pode usar?
A. updateDom ().
B. workerUpdate ().
C. dom ().
2. Qual objeto pode ser usado quando o web worker e o criador precisam fazer referência
ao mesmo objeto?
A. Mutex.
B. Semaphore.
C. Encerramento.
Você pode animar a exibiçã o da caixa de mensagem e usar objetos de promessa para
sequenciar as animaçõ es.
5. Certifique-se de manter a caixa de seleçã o Criar diretó rio para soluçã o selecionada .
8. Para defini-la como a pá gina inicial, clique com o botã o direito na nova pá gina
default.html no Gerenciador de Soluçõ es e clique em Definir como Pá gina Inicial.
10. Na janela Solution Explorer, clique com o botã o direito na pasta Scripts e adicione um
arquivo JavaScript chamado default.js.
11. Na janela Solution Explorer, clique com o botã o direito do mouse no projeto
AnimationExample, escolha Adicionar, selecione Nova pasta e nomeie como Conteúdo . Na
pasta Conteú do, adicione um arquivo de folha de estilo default.css.
elemento < title >.
Lembre-se de que você deve usar a versã o do jQuery que instalou usando o Gerenciador de
Pacotes NuGet. Seu elemento < head > deve ser semelhante ao seguinte.
<head>
<title> </title>
</head>
13. Adicione um elemento < div > que cubra a tela com seu atributo id definido para cobrir.
< corpo>
<div id = "cover">
</div>
<div id = "messageBox">
</div>
</body>
407
<body>
<div id = "cover">
</div>
<div id = "messageBox" >
<div id = "messageContent">
</div>
</div>
</body>
17. Apó s o elemento message < div >, adicione um elemento <br /> e, em seguida, adicione
um elemento < button >, que será usado para testar a caixa de mensagem personalizada, e
defina seu atributo id como btnShowMessage.
<head>
<title> </title>
</head>
<body>
<div id = "cover">
</div>
<div id = "messageBox">
<div id = "messageContent">
<br />
</div>
</div>
</body>
</html>
18. No arquivo default.css, adicione uma regra de estilo para o elemento de capa.
Este elemento nã o será exibido por padrã o. Seu tamanho deve ser a tela inteira. Seu Z-
Index deve ser maior do que qualquer coisa na pá gina, exceto a capa que é definida na
pró xima etapa. Sua cor de fundo deve ser definida como preto. Seu estilo deve ser
semelhante ao seguinte.
#cobrir {
Mostrar nenhum;
posiçã o: absoluta;
índice z: 100;
topo: 0px;
esquerda: 0px;
largura: 100%;
altura: 100%;
Este elemento nã o será exibido por padrã o. Seu tamanho deve ser a tela inteira. Seu Z-
Index deve ser maior do que qualquer coisa na pá gina, incluindo a capa que você acabou
de definir. Seu estilo deve ser o seguinte.
#caixa de mensagem {
Mostrar nenhum;
posiçã o: absoluta;
topo: 0px;
esquerda: 0px;
largura: 100%;
altura: 100%;
índice z: 101;
Este elemento nã o será exibido por padrã o. Seu tamanho deve ser 30 por cento de largura e
30 por cento tal. Ele será centralizado definindo as margens esquerda e direita como
automá ticas. Sua margem superior será de 100 pixels do topo. O estilo da borda será
definido como só lido e a largura da borda será definida como 1 pixel. Seu preenchimento
será definido em 10 pixels. Seu estilo deve ser o seguinte.
#conteú do da mensagem {
Mostrar nenhum;
posiçã o: relativa;
largura: 30%;
altura: 30%;
preenchimento: 10px;
409
});
return messagePromise;
}
26. Quando btnShowMessage for clicado, ele mostrará uma mensagem usando a hora
atual. Adicione uma funçã o getTime que retorna a hora atual. Adicione uma funçã o
displayTimeAsync que cria uma mensagem chamando a funçã o getTime e, em seguida,
chama a funçã o showMessageAsync .
function displayTimeAsync () {
function getTime () {
});
Você deverá ver a capa animada que aparece gradualmente e, em seguida, deverá ver a
janela de mensagem deslizar para baixo a partir da parte superior da tela. A tela final é
mostrada na Figura 9-2.
Observe que, embora o botã o Mostrar mensagem ainda esteja visível, você nã o pode clicar
nele agora porque a capa está sobre o botã o. Além disso, o botã o OK nã o está programado
para fechar a janela de mensagem. Quando você clica no botã o OK, a janela de mensagem
deve recuar e desaparecer, e a capa deve esmaecer. O botã o Mostrar mensagem deve ser
clicá vel.
promessa de retorno;
411
function hideMessageAsync () {
});
return coverPromise;
33. Modifique o có digo pronto para documento existente para assinar o evento click do
botã o messageOk e chame a funçã o hideMessageAsync conforme a seguir .
});
34. Execute o aplicativo.
■■ Exercício 1 Aprenda mais sobre operaçõ es assíncronas, escrevendo mais có digo que faz
chamadas assíncronas para serviços da web.
■■ Exercício 2 Saiba mais sobre web workers, escrevendo um aplicativo que tem um web
worker que executa có digo do lado do cliente.
Respostas
Lição 1
1. Resposta correta: A
A. Correto: Use o método pipe para encadear operaçõ es assíncronas porque ele fornece
acesso ao progresso, falha, sucesso e conclusã o.
2. Resposta correta: C
3. Resposta correta: A
4. Resposta correta: B
Respostas CAPÍTULO 9
413
Lição 2
1. Resposta correta: D
2. Resposta correta: D
D. Correto: o web worker nã o pode acessar o mesmo objeto, e os objetos passados ao web
worker pelo criador sã o serializados para produzir uma có pia do objeto que o web worker
acessará .
Comunicações WebSocket
Este livro cobriu AJAX e serviços da Web, que fornecem um meio de comunicaçã o com o
servidor a partir do cliente do navegador. Este capítulo é sobre como iniciar a comunicaçã o
do navegador para o servidor ou do servidor para o navegador. Se o servidor pode
enviar mensagens ao navegador, o navegador nã o precisa consultar o servidor para obter
informaçõ es de status.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
O protocolo WebSocket é uma tecnologia da web que fornece comunicaçõ es ful -duplex em
uma ú nica conexã o TCP. A interface de programaçã o de aplicativos (API) WebSocket está
atualmente em status de rascunho de trabalho pelo World Wide Web Consortium (W3C),
mas o protocolo WebSocket foi padronizado pela Internet Engineering Task Force (IETF)
como RFC 6455.
WebSocket substitui a longo polling con CEPT. Com o polling longo, o cliente envia uma
solicitaçã o ao servidor e, se o servidor tiver informaçõ es para responder, ele responde.
Chave
415
que o cliente está esperando por dados e o servidor tem uma conexã o aberta. Quando os
dados estã o prontos, eles sã o enviados imediatamente, o que resulta em diminuiçã o da
latência. Um problema com esse conceito é que as conexõ es podem expirar, o que requer a
criaçã o de uma nova conexã o.
■■ binaryType Uma propriedade que indica o formato de dados biná rios que o evento
onmessage recebe.
<head>
<title> </title>
</head>
<body>
</body>
</html>
Enquanto um URL HTTP começa com http: // ou https: // para HTTP seguro, o URL
WebSocket
var webSocket;
if (checkSupported ()) {
conectar();
});
function checkSupported () {
if (window.WebSocket) {
return true;
outro {
function connect () {
function doSend () {
if (webSocket.readyState! = webSocket.OPEN)
Retorna;
writeOutput ("CONNECTED");
}
writeOutput ("DESCONECTADO");
Neste exemplo , wsUri é definido como o servidor de eco WebSocket.org, que ecoa
mensagens enviadas a ele. A funçã o Ready chama a funçã o checkSupported para ver se
WebSocket é compatível. Isso é feito verificando se o objeto de janela tem um objeto
WebSocket . Se WebSocket for compatível, a funçã o de conexã o será chamada.
Verificação rápida
A propriedade readyState será definida como um dos valores numéricos, mas você pode
usar as constantes conforme mostrado na funçã o doSend que testa webSocket.OPEN. Se o
WebSocket nã o estiver aberto, uma mensagem é exibida e a funçã o retorna sem enviar. Se o
WebSocket estiver aberto, uma mensagem será exibida e a mensagem será enviada usando
o método de envio.
Um erro pode vir do servidor ou ser gerado quando o cliente nã o consegue se conectar ao
servidor ou o tempo limite da conexã o se esgota. Dependendo do erro, o objeto de evento
pode passar a causa na propriedade de dados. Você também pode descobrir que a
propriedade de dados é indefinida, especialmente em um cená rio de tempo limite.
Se uma mensagem for inserida e o botã o Enviar for clicado, a mensagem é enviada ao
servidor e a resposta é exibida, conforme mostrado na Figura 10-1.
Um dos problemas que você pode encontrar é que o servidor pode atingir o tempo limite de
sua conexã o apó s um período de inatividade. Você também pode ter firewal s entre seu
navegador e o servidor que pode expirar sua conexã o. Em muitos casos, um erro é
disparado sem uma mensagem associada. Você pode identificar erros de tempo limite nã o
acionando nenhuma atividade por até 20 minutos.
Uma maneira de lidar com tempos limite é enviar uma mensagem vazia ao servidor
periodicamente.
var wsUri = 'ws: //echo.websocket.org/';
var webSocket;
var timerId = 0;
if (checkSupported ()) {
conectar();
});
function checkSupported () {
if (window.WebSocket) {
return true;
outro {
function connect () {
function keepAlive () {
if (webSocket.readyState == webSocket. OPEN) {
webSocket.send ('');
function cancelKeepAlive () {
if (timerId) {
cancelTimeout (timerId);
}
function doSend () {
if (webSocket.readyState! = webSocket.OPEN)
Retorna;
writeOutput ("CONNECTED");
mantenha vivo();
cancelKeepAlive ();
writeOutput ("DESCONECTADO");
Neste exemplo, o có digo em negrito foi adicionado. No topo está a declaraçã o do timerId.
Foi adicionada uma funçã o keepAlive que envia uma mensagem vazia a cada 15
segundos. A funçã o keepAlive é chamada quando a funçã o onOpen é executada e é
recursiva; ele nã o para até que o cronô metro seja cancelado usando o timerId. Uma funçã o
cancelKeepAlive foi adicionada para cancelar o loop da funçã o keepAlive e é chamada
quando a funçã o onClose é chamada .
Além de fornecer o recurso keepAlive, você também pode precisar lidar com conexõ es que
fecham devido a erros de rede. Isso pode exigir que você chame a funçã o de conexã o de
dentro da funçã o onClos e. Dependendo do seu aplicativo, isso pode causar problemas no
servidor quando o servidor nã o reconhece que a nova conexã o pertence a um cliente
existente. Seu aplicativo pode precisar lidar com isso, forçando o cliente a enviar
uma mensagem de identificaçã o . Lembre-se de que as mensagens estã o no formato que
você ditar, portanto, você pode definir sua pró pria estratégia de mensagens para seu
aplicativo.
À s vezes, ao colocar seu aplicativo WebSocket em produçã o, você precisa que seu aplicativo
seja executado em um web farm , quando vá rios servidores lidam com solicitaçõ es de
entrada. Essas solicitaçõ es sã o tipicamente com balanceamento de carga para fornecer o
melhor desempenho. Como você pode ter um con-Key aberto
Verificação rápida
SignalR
SignalR também fornece eventos de conexã o aos quais você pode se inscrever para
gerenciamento de conexã o. SignalR é tã o fá cil de usar que você deve considerar isso se
estiver trabalhando em um site ASP.NET. SignalR também pode funcionar na nuvem do
Windows Azure. Você deve fornecer gerenciamento de estado para SignalR compartilhar
dados entre servidores, mas é possível.
Socket.IO
Socket.IO é uma biblioteca WebSocket criada por Guillermo Rauch, CTO e cofundador da
LearnBoost; desenvolvedor e inventor de Socket.IO, Engine.IO e codestre.am; JSConf.ar
cura-tor; entusiasta do có digo aberto; e blogger.
Socket.IO tem uma biblioteca do lado do cliente e do lado do servidor; o lado do cliente usa
JavaScript e o lado do servidor é JavaScript para uso com Node.js. Ele usa a detecçã o de
recursos para decidir se a conexã o será estabelecida com WebSocket, AJAX long polling ou
Flash polling, que é outra maneira de implementar o polling, mas requer Flash no
navegador.
Resumo da lição
■■ Você pode verificar a propriedade readyState no objeto WebSocket para obter o estado
da conexã o.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Ao trabalhar com o objeto WebSocket, qual evento pode ser usado para recuperar os
dados que foram recebidos do servidor?
A. onopen
B. onclose
C. onmessage
D. onerror
A. SignalR
B. Socket.IO
C. FarmSockets
D. AgnosticSocket
3. Você deseja garantir que a conexã o WebSocket nã o seja desconectada como resultado de
inatividade. Como você pode realizar isso?
A. Adicione o có digo ao evento onclose para reabrir a conexã o quando ela for fechada.
B. Adicione o có digo para enviar uma mensagem vazia periodicamente antes que a conexã o
seja fechada.
Pratica exercícios
Se você encontrar um problema ao concluir qualquer um desses exercícios, os projetos
concluídos podem ser instalados da pasta Exercícios de prá tica que é fornecida com o
conteú do complementar.
Neste exercício, você aplica seu conhecimento do WebSocket criando um aplicativo da Web
para servidor de bate-papo. Embora você nã o use o objeto WebSocket diretamente, você
usará a biblioteca Socket.IO, que fornece um wrapper WebSocket que simplifica as
comunicaçõ es entre cliente e servidor.
Neste exercício, você cria o servidor de bate-papo. Você nã o poderá testar este servidor
com eficá cia até concluir o Exercício 2, no qual você cria a pá gina HTML.
Você deve navegar até o local e, em seguida, criar a pasta. Por exemplo, os comandos a
seguir navegam até a pasta node_samples na raiz do C d rive, crie uma nova pasta
chat_service e navegue até a nova pasta.
C:
cd \ node_samples
md chat_service
cd chat_service
npm init
■■ Nome: chat_service
■■ Versã o: 0.0.0
Exercícios prá ticos CAPÍTULO 10 425
■■ Autor: seu nome
■■ Licença: BSD
"nome": "chat_service",
"main": "app.js",
"scripts": {
"test": "echo \" Erro: nenhum teste especificado \ "&& exit 1"
},
"licença ": "BSD",
“Privado”: verdadeiro,
“Dependências”: {
“Expresso”: “3.0.x”,
“Socket.io”: “0.9.x”
npm install
7. Abra o Visual Studio Express 2012 for Web. Clique em Arquivo e escolha Abrir
Site; selecione a pasta chat_service.
8. Na pasta do site chat_service, crie um arquivo app.js e adicione uma referência aos
pacotes express, http e socket.io. Chame o ouça-me thod como segue.
, app = express ()
Neste có digo, você está usando o objeto http para criar um servidor baseado no objeto
expresso. Depois disso, você está usando o objeto socket.io para chamar o método listen e
passando o objeto server para indicar o servidor que estará escutando.
9. Na janela do Solution Explorer, clique com o botã o direito do mouse no nó chat_service,
clique em Adicionar e escolha Nova pasta. Nomeie a pasta como pública .
10. No arquivo app.js, adicione uma instruçã o para mapear solicitaçõ es está ticas para a
pasta / public da seguinte maneira.
11. Adicione uma instruçã o para mapear um equest da raiz para o arquivo index.html (a
ser criado no Exercício 2) da seguinte maneira.
});
response.redirect ('default.html');
});
13. Adicione um sta tement para criar uma variá vel de nomes de usuário e inicialize-a como
um objeto vazio, como segue.
});
socket.username = username;
});
});
});
A primeira linha desse có digo se inscreve no evento de conexã o e executa uma funçã o
anô nima. O có digo de funçã o anô nima aceita um parâ metro de soquete, que é o objeto que
representa a conexã o do usuá rio recém-criada. Dentro da funçã o anô nima, as assinaturas
sã o criadas para os eventos sendchat, adduser e desconectar.
O evento adduser é disparado assim que o cliente faz uma conexã o. Ele adiciona o nome de
usuá rio à coleçã o de nomes de usuá rio e, em seguida, usa o objeto de soquete para chamar
o evento updatechat no cliente atual para indicar ao usuá rio que a conexã o foi bem-
sucedida. O objeto socket.broadcast s finaliza uma mensagem indicando que o cliente atual
está conectado. Esta mensagem é transmitida a todos os clientes, exceto o cliente atual.
Finalmente, o evento io.sockets.emit transmite uma lista de usuá rios atualizada para todos
os clientes.
O evento de desconexã o exclui o usuá rio da lista de nomes de usuá rio e os transmite a
todos os clientes. O objeto socket.broadcast transmite uma mensagem de desconexã o para
todos os clientes, exceto o cliente atual.
15. Adicione o có digo para ouvir na porta 8080 e registre uma mensagem no console
informando isso.
, app = express ()
app.use (express.static (__ dirname + '/ public'));
});
});
socket.username = username;
});
});
});
server.listen (porta);
16. Teste seu trabalho executando o site, usando o seguinte comando na janela do prompt
de comando.
node app.js
1. Abra o site do cliente, que é diferente do Exercício 1. Abra o Visual Studio Express 2012
for Web. Clique em Arquivo, escolha Abrir Site e selecione a pasta pú blica em chat_service.
2. Na janela Solution Explorer, clique com o botã o direito do mouse no nó pú blico, escolha
Adicionar e selecione Pá gina HTML. Nomeie o arquivo Index.html e clique em OK.
3. Na janela Solution Explorer, clique com o botã o direito do mouse no nó pú blico. Clique
em Adicionar, escolha Folha de estilo e nomeie o arquivo como default.css . Clique OK.
5. Na janela Solution Explorer, clique com o botã o direito na pasta Scripts, escolha Add,
selecione JavaScript File, nomeie o arquivo default.js e clique em OK.
8. Na janela Solution Explorer, clique com o botã o direito na pasta Scripts, escolha Add e
selecione Existing Item. Navegue até a pasta chat_service e depois para a pasta node_
modules \ socket.io \ node_modules \ socket.io-client \ dist.
9. Na lista suspensa de tipo de arquivo, selecione Todos os arquivos (*. *) E, em seguida,
selecione os quatro arquivos que agora estã o sendo exibidos na pasta, conforme mostrado
na Figura 10-4.
FIGURA 10-4 Os arquivos do cliente socket.io que precisam ser adicionados ao site 430
CAPÍTULO 10 Comunicaçõ es WebSocket
Agora que você tem todos os arquivos de que precisa, é hora de adicionar seu có digo.
10. No arquivo Index.html, adicione referências ao arquivo padrã o sty le sheet, jquery,
socket.io.js e default.js.
<head>
<title> </title>
</head>
</div>
</div>
.userContainer {
flutuar: esquerda;
largura: 200px;
altura: 300px;
preenchimento: 10px;
estouro: automá tico;
.conversationContainer {
flutuar: esquerda;
largura: 400px;
altura: 300px;
preenchimento: 10px;
#dados {
largura: 250px;
var socket;
});
Este có digo está se inscrevendo nos eventos, que executam funçõ es que ainda nã o foram
criadas.
17. Adicione a funçã o addUser, que chama o método emit no soquete para chamar
o método addUser no servidor de bate-papo.
O resultado do prompt pop-up para o nome de usuá rio também é passado. A funçã o
addUser deve ser semelhante à seguinte.
function addUser () {
Esta funçã o é chamada quando o serviço de chat envia uma mensagem. O nome de usuá rio
e os dados sã o passados para esta funçã o.
19. Use jQuery para criar um objeto jQuery com a resposta e insira a mensagem apó s
o elemento < div > conversaçã o .
Esta funçã o é chamada quando o serviço de chat envia uma lista de usuá rios atualizada.
21. Adicione o có digo para limpar a lista de usuá rios existente e preencher novamente a
lista.
});
Esta funçã o é chamada para enviar uma mensagem ao serviço de chat. A funçã o
sendMessage deve ser semelhante à seguinte.
function sendMessage () {
Esta funçã o é chamada quando o usuá rio pressiona a tecla Enter. A funçã o
processEnterPress deve ser semelhante à seguinte.
function processEnterPress (e) {
if (e.which == 13) {
e.preventDefault ();
24. Revise o có digo.
var socket;
});
function addUser () {
}
});
function sendMessage () {
if (e.which == 13) {
e.preventDefault ();
node app.js
26. Abra um navegador.
27. Navegue para http: // localhost: 8080 , onde você deve ver a pá gina de bate-papo.
Conforme você digita sua mensagem, você deve vê-la exibida em ambas as janelas,
conforme mostrado na Figura 10-5.
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Aprenda mais sobre WebSocket escrevendo mais có digo que implementa o
objeto WebSocket diretamente.
Respostas
Lição 1
1. Resposta correta: C
2. Resposta correta: B
B. Correto: A biblioteca Socket.IO funciona com N ode.js para fornecer uma biblioteca
independente do navegador para comunicaçõ es WebSocket.
C. Incorreto: FarmSockets nã o existe.
D. Incorreto: AgnosticSocket nã o existe.
3. Resposta correta: B
A. Incorreto: Se você esperar até que a conexã o seja fechada, você precisará criar um novo
objeto WebSocket.
D. Incorreto: se você criar um novo objeto WebSocket cada vez que enviar uma mensagem,
o servidor pensará que novos navegadores estã o se comunicando com ele.
436 CAPÍTULO 10 Comunicaçõ es WebSocket
CAPÍTULO 1 1
Um dos recursos mais populares do HTML5 é o suporte para multimídia. No passado, você
precisava carregar um plug-in para reproduzir vídeo ou á udio. Provavelmente, o plug-in de
multimídia mais popular é o Flash. Este capítulo examina o suporte HTML5 para
reproduçã o de á udio e vídeo.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
introduçã o do livro .
O World Wide Web Consortium (W3C) introduziu o elemento de vídeo com a finalidade de
reproduzir vídeos e filmes. A intençã o era oferecer uma maneira padrã o de reproduzir
vídeo na web sem a necessidade de plug-ins. Esse objetivo foi contornado pela falta de
acordo sobre quais formatos de vídeo deveriam ser suportados nos navegadores da web.
■
Implemente o elemento < video >.
437
Formatos de vídeo
O W3C está tentando criar um formato de vídeo que possa ser especificado para todos os
navegadores suportarem, no mínimo. Ter pelo menos um formato comum a todos os
navegadores simplificaria o trabalho do desenvolvedor, desde que o formato fornecesse
boa compactaçã o e qualidade e fosse isento de royalties. Existem muitos formatos; a lista a
seguir descreve os formatos mais populares.
Implementando o elemento < video >
elemento < video >.
</video>
Neste exemplo, o tamanho do elemento < video > é definido para 320 pixels por 240
pixels. O atributo de controles fornece controles para iniciar e parar o vídeo, para visualizar
e definir a localizaçã o do cursor do vídeo e para maximizar e restaurar o tamanho do vídeo
na tela. O elemento < video > contém um elemento < source > que descreve a fonte de vídeo
como .mp4. O elemento < video > também contém texto que é exibido em navegadores que
nã o suportam o elemento < video >.
Definir a fonte
O elemento < source > especifica uma fonte de vídeo. No mínimo, você precisa definir o src
a ttribute para a URL do vídeo. Você também deve incluir mais de um elemento < source >
para fornecer muitas fontes para que o navegador possa escolher o codec de vídeo mais
apropriado. No exemplo a seguir, o mesmo filme foi renderizado para cada um dos
três formatos mais populares.
</video>
Arquivo .webm porque é livre de royalties e de có digo aberto, e está se tornando mais
popular. Em seguida, use o arquivo .ogv porque ele também nã o tem royalties, mas a
qualidade nã o é tã o boa quanto o arquivo .webm.
Finalmente , use o formato .mp4 para navegadores que nã o suportam arquivos .webm
ou .ogv.
Para usar o site Firefogg, você deve estar executando o Firef ox e ter instalado o plug-in
Firefogg. Este site simples produz vídeos transcodificados de boa qualidade.
Se preferir usar um aplicativo que você pode baixar e instalar no seu computador, você
pode gostar do Miro Video Converter. Este é um utilitá rio autô nomo que permite converter
um tipo de arquivo em outro. O Miro Video Converter é mostrado na Figura 11-2.
Você pode descobrir que o Miro Video Converter produz vídeos de baixa qualidade. Parece
que os arquivos .ogv estã o muito instá veis e o site nã o oferece muitas opçõ es de conversã o.
A seguir está a lista de atributos que você pode usar para configurar o elemento < video >
para atender à s suas necessidades.
■■ pôster Especifica que o URL de uma imagem deve ser mostrado quando o vídeo nã o
está sendo reproduzido.
Verificação rápida
■■ Você deseja que uma imagem seja exibida quando o vídeo não estiver em
execução. Qual propriedade você deve definir para o URL de uma imagem a ser
exibida?
Acessando faixas
O W3C desenvolveu um novo padrã o, denominado WebVTT (Web Video Text Tracks), que
fornece a capacidade de exibir legendas no vídeo; todos os navegadores que implementam
o elemento < track > irã o suportá -lo. O formato de arquivo We bVTT é simples e facilmente
legível por navegadores e desenvolvedores. É baseado em um formato de legenda popular
denominado SubRip Text (SRT). Se você já tem seu conteú do no formato SRT, há
conversores disponíveis na web para converter para o formato WebVTT em.
Um padrã o menos usado denominado Timed Text Markup Language (TTML) é um formato
baseado em XML que é mais detalhado do que WebVTT. TTML está fora do escopo deste
livro.
O formato WebVTT é muito simples . O arquivo começa com uma declaraçã o do arquivo
WebVTT, uma linha é ignorada e uma sugestã o é definida. A sugestã o é composta por um
intervalo de tempo na primeira linha e a legenda segue na pró xima linha ou linhas. Depois
disso, um novo separador de linha é fornecido e a pró xima sugestã o é definida. O seguinte é
um arquivo WebVTT.
ARQUIVO WEBVTT
Lá vai ele!!!
Você pode incluir comentá rios usando a palavra NOTA seguida por um espaço ou uma nova
linha, conforme mostrado no exemplo a seguir.
ARQUIVO WEBVTT
NOTA Eu acho que o tempo deve ser ajustado para abranger até o final do vídeo 00:
00: 09.000 -> 00: 00: 12.000
Lá vai ele!!!
Se você tentar usar arquivos WebVTT em um site hospedado pelo IIS Express, poderá
descobrir que o IIS Express nã o exibirá um arquivo .vtt porque ele atende apenas a tipos de
arquivo conhecidos. Você pode adicionar suporte para arquivos .vtt executando os
seguintes comandos.
Resumo da lição
■■ Os formatos de vídeo mais comuns para a web sã o .ogg / Theora, WebM / VP8 e MPEG-4
/ H.264.
■■ É melhor fornecer vá rias fontes de vídeo para ser compatível com a maioria dos
navegadores.
■■ Use o atributo pô ster para especificar uma imagem a ser exibida quando o vídeo nã o for
reproduzido.
■■ Você pode fornecer legendas no formato WebVTT ou TTML.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que
cada escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste
capítulo.
1. Você deseja incluir um vídeo em sua pá gina da Web que tenha uma extensã o de
arquivo .avi. Se você fornecer as informaçõ es do codec, o que será exibido nos navegadores
que suportam o elemento < video >, mas nã o possuem o codec?
D. O navegador irá automaticamente baixar uma versã o do navegador que suporte o codec.
2. Você nã o deseja fornecer um vídeo .ogg porque acha que o formato .ogg é instá vel e de
baixa qualidade. Que outros formatos de vídeo você pode incluir para ser compatível com a
maioria dos navegadores? (Escolha todas as opçõ es aplicá veis)
A. .webm
B. .avi
C. .mpg
D. .mp4
E. .mjpg
A. .webm
B. .avi
C. .mpg
D. .mp4
■■ Implemente o elemento < audio >.
Formatos de áudio
O elemento < audio >
O elemento < audio > é usado para reproduzir á udio. A seguir está um exemplo de
implementaçã o do
elemento < áudio >.
</audio>
Definir a fonte
</audio>
Ao fornecer vá rios formatos, o navegador pode escolher o formato que exibe o á udio, o que
fornece a experiência mais compatível aos usuá rios. Conforme mencionado anteriormente,
a posiçã o dos elementos < source > é importante porque um navegador começa a olhar
para o topo e para quando encontra um arquivo que pode exibir. A ordem recomendada é
começar com o arquivo .oga porque ele é livre de royalties, de có digo aberto e está se
tornando mais popular na web. Em seguida, use o arquivo .wav, porque também é bastante
popular. Finalmente, use o .mp3 para navegadores que nã o suportam .oga e
arquivos .wav.
Configurando o elemento < audio >
A seguir está a lista de atributos que você pode usar para configurar o elemento < audio >
para atender à s suas necessidades.
Verificação rápida
Resumo da lição
■■ Os formatos de á udio mais comuns para a web sã o .ogg / Vorbis, .mp3 e .wav.
■■ É melhor fornecer vá rias fontes de á udio para ser compatível com a maioria dos
navegadores.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. .mp4
B. .wav
C. .mp3
D. .oga
2. Você nã o deseja fornecer um formato .mp3 porque está preocupado com o potencial de
pagar royalties. Que outros formatos de á udio você pode incluir para ser compatível com a
maioria dos navegadores? (Escolha todas as opçõ es aplicá veis)
A. .mp4
B. .wav
C. .h264
D. .oga
■■ Controle de mídia.
métodos do elemento < video >.
Além dos métodos que permitem controlar a reproduçã o, você pode usar muitas
propriedades para visualizar ou definir o estado do elemento < audio > ou < video >. A
seguir está uma lista de todas as propriedades.
Além dos métodos e propriedades de HTMLMediaElement, a seguir está uma lista dos
eventos que você pode assinar.
■■ onabort Trigg ers em abort
<head>
<title> </title>
</head>
<body>
</video>
<br />
</body>
</html>
$ ('# media'). on ('play', function () {$ ('# play'). html ('Pause');}); $ ('# media'). on ('pause',
function () {$ ('# play'). html ('Play');});
});
function pl ayStop () {
if (media.paused) {
media.play ();
outro {
media.pause ();
Resumo da lição
■■ Use o método play () para iniciar a reproduçã o da mídia e o método pause () para
pausar a mídia reproduzida.
■■ A propriedade paused pode ser usada para determinar se a mídia está sendo
reproduzida.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. HTMLMediaElement
B. MediaElement
C. MultiMediaElement
2. Se você quiser que sua mídia se repita continuamente, qual propriedade você definiria
como true?
A. pré-carga
B. readyState
C. procurá vel
D. loop
3. Você deseja acionar algum có digo quando a mídia for carregada. Em qual evento você
deve se inscrever?
A. instalado
B. onseeked
C. onplay
D. onloadeddata
Pratica exercícios
Na Contoso Ltd., você foi solicitado a criar um protó tipo de pá gina da Web que exibe vídeo
usando o elemento < video >. A pá gina da web precisa exibir vídeo para os navegadores
Firefox, Internet Explorer e Chrome, no mínimo, mas você deseja alcançar o maior nú mero
possível de navegadores.
Você sabe que precisa converter seu arquivo .mp4 em outros formatos, mas também deseja
identificar o tipo de arquivo que o navegador usou para determinar os tipos de arquivo que
fornecem a maior cobertura do navegador.
1. Inicie o Visual Studio Express 2012 for Web. Crie um projeto ASP.NET Empty Web
Application e denomine-o MultimediaPrototype .
3. Adicione os arquivos de vídeo Eagle. Clique com o botã o direito na pasta Mídia, escolha
Adicionar e selecione Item Existente. Localize a pasta Resource e selecione os três arquivos
de vídeo Eagle.
7. Clique com o botã o direito na pasta Scripts e adicione um novo arquivo JavaScript
default.js.
8. Adicione uma referência à biblioteca jQuery clicando com o botã o direito do mouse no nó
do projeto; escolha Gerenciar Pacotes NuGet. Clique em Online e digite jQuery nos critérios
de pesquisa. Quando a biblioteca jQuery for exibida, clique no botã o Instalar.
<head>
</head>
<body>
</body>
</html>
</video>
<br />
</div>
<source src = "media / eagle.webm" type = 'video / webm; codecs = "vorbis, vp8" '/>
<source src = "media / eagle.ogv" type = 'video / ogg; codecs = "theora, vorbis" '/>
/>
</video>
16. Adicione uma regra de estilo para o container. Este estilo deve definir a cor de fundo
para azul claro, definir a borda para ranhurar, definir a largura para 900 pixels e definir a
altura para 600
corpo {
#container {
largura: 900px;
altura: 600px;
preenchimento: 20px;
17. Para saber qual fonte foi selecionada pelo navegador ( embora isso fique aparente
quando você reproduzir o vídeo), adicione o có digo ao arquivo default.js para exibir a fonte
atual quando o vídeo for reproduzido.
});
});
18. No Solution Explorer, clique com o botã o direito do mouse no arquivo VideoPage.html e
escolha Definir como pá gina inicial .
■■ Exercício 2 Aprenda mais sobre vídeo e á udio escrevendo um aplicativo da web que
usa muitas das propriedades, métodos e eventos dos elementos < video > e < audio >.
Respostas
Lição 1
1. Resposta correta: A
A. Correto: O navegador deve oferecer suporte ao codec especificado, mas nã o tenta fazer
o download do codec especificado automaticamente .
2. Respostas corretas: A e D
A. Correto: o formato .webm está se tornando popular nos navegadores mais recentes.
3. Resposta correta: E
Lição 2
1. Resposta correta: C
2. Corrija uma resposta: A, B e D
A. Correto: o formato .mp4 está se tornando popular nos navegadores mais recentes.
Lição 3
1. Resposta correta: A
2. Resposta correta: D
D. Correto: A propriedade loop é usada para indicar que você deseja repetir a mídia
continuamente quando ela atinge o final do fluxo.
3. Resposta correta: D
B. Incorreto: O evento onseeked dispara quando a busca termina, apó s você realizar
uma operaçã o de busca .
Respostas CAPÍTULO 11 457
CAPÍTULO 1 2
No passado, o método mais comum de desenhar em uma pá gina da Web era usando Adobe
Flash. Como a busca para criar navegadores que nã o requerem plug-ins para exibir
multimídia continua, uma grande lacuna na funcionalidade foi preenchida com a
capacidade de desenhar em HTML5 usando o elemento < canvas > e para criar e exibir
Vetor Escalá vel Grá ficos (SVG) usando o elemento < svg >.
SVG é uma linguagem para definir grá ficos bidimensionais em XML, e o XML pode ser
renderizado pelo navegador usando o elemento < svg >. Embora você possa aprender SVG e
escrever grá ficos SVG, provavelmente usará um editor de imagens para criar imagens SVG e
depois usá -las em seu aplicativo da web. O benefício é que as imagens sã o escaloná veis.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro .
459
<canva s id = "myCanvas" width = "800" height = "600"> Você precisa de um navegador que
suporte HTML5!
</canvas>
tela de pintura {
■■ Descreva o elemento < canvas >.
O elemento < canvas > expõ e uma abundâ ncia de funcionalidade por meio de seu contexto
de tela, que pode ser acessado usando JavaScript. Este elemento fornece os seguintes
membros.
■■ toDataUrl () Método que cria um URL que pode ser usado com um elemento que requer
um URL de imagem n, como a referência do objeto de contexto
do elemento < img > CanvasRenderingContext2D
■■ clip () Método para limpar uma regiã o de qualquer forma e tamanho da tela original
fillStyle Propriedade que define ou obtém a cor, gradiente ou padrã o usado para preencher
o sorteio ing
■■ método lineTo () que adiciona um novo ponto e cria uma linha a partir desse ponto até
o ú ltimo ponto especificado na tela
■■ moveTo () Método que move o caminho para o ponto especificado na tela sem criar
uma linha
Ao trabalhar com o objeto da tela, você deve obter uma referência ao contexto da tela. Isso
pode ser feito usando o método getContext, que aceita um parâ metro. Atualmente, o ú nico
valor para o parâ metro é 2d ao usar o Internet Explorer, mas o Firefox e o Chrome
oferecem suporte a um parâ metro experimental-webgl, que oferece suporte a desenho
tridimensional.
Esta liçã o se concentra no parâ metro 2d mais maduro, que retorna um objeto
CanvasRenderingContext2D. Este objeto será referido como o objeto de contexto . O
exemplo a seguir demonstra a criaçã o do objeto de contexto.
Chave
Termos
desenhe algo();
});
function drawSomething () {
Verificação rápida
■■ 2d
Desenhar retângulos
Os métodos de criaçã o de retâ ngulos aceitam quatro parâ metros. Os primeiros dois
parâ metros sã o as localizaçõ es xey do canto superior esquerdo do retâ ngulo. Os dois
ú ltimos parâ metros representam a largura e a altura do retâ ngulo. Você pode criar
retâ ngulos usando um dos métodos a seguir.
■■ clearRect (x, y, w, h) Limpa a á rea retangular especificada.
O exemplo de có digo a seguir demonstra o uso desses métodos para criar retâ ngulos.
desenhe algo();
});
function drawSomething () {
, deslocamento = 15
, clearOffset = 30
, pushDownOffset = 10
, altura = 50
, largura = 100
, contagem = 4
Neste exemplo, o método fil Rect é usado para criar quatro retâ ngulos arquivados. Cada um
dos retâ ngulos é espaçado horizontalmente y pelo valor de deslocamento. Em seguida,
o método cle arRect é usado para limpar uma á rea retangular que está dentro da á rea de
preenchimento criada pelo método fil Rect. Finalmente, o método strokeRect é usado para
criar uma segunda linha de retâ ngulos, mas esses retâ ngulos nã o sã o preenchidos. O
resultado é mostrado na Figura 12-1.
Você pode ver que o desenho na tela realmente requer conhecimento de JavaScript e do
objeto de contexto da tela.
Use a propriedade fil Style para especificar como você deseja preencher as formas. Você
pode definir o estilo do arquivo para um dos seguintes valores.
■■ Cor CSS Cria um preenchimento de cor só lida com base em um valor de cor CSS vá lido ,
como preto, vermelho ou # 00FF00. A seguir está um exemplo de configuraçã o do Estilo do
arquivo usando um valor de cor CSS .
function drawUsingCssColor () {
, deslocamento = 10
, tamanho = 50;
ctx.fillStyle = "vermelho";
Neste exemplo, fil Style é definido como “r ed” e dois retâ ngulos sã o criados. Em seguida, fil
Style é definido como verde, usando “# 00FF00”, e dois retâ ngulos sã o criados. Finalmente,
fil Style é definido como azul com opacidade de 25 por cento, usando “rgba (0,0,255,0.25)”,
e dois retâ ngulos sã o criados. Os resultados sã o mostrados na Figura 12-2.
Depois que o objeto de gradiente é criado, chame seu método addColorStop para
especificar que uma cor é definida em um local no gradiente. A funçã o addColorStop
usa dois parâ metros; o primeiro parâ metro é o local, que é um valor entre 0 e 1, em que 0 é
o início do gradiente e 1 é o final do gradiente, e o segundo parâ metro é o valor da cor.
function drawGradient () {
, x0 = 0
, y0 = 0
, r0 = 0
, x1 = 200
, y1 = 0
, r1 = 100
, largura = 300
, altura = 50
, deslocamento = 10;
addColorStops (gradiente);
ctx.fillStyle = gradiente;
y1 = 300;
addColorStops (gradiente);
ctx.fillStyle = gradiente;
x0 = x1 = largura / 2;
addColorStops (gradiente);
ctx .fillStyle = gradiente;
y1 = y0 + 100;
addColorStops (gradiente);
ctx.fillStyle = gradiente;
}
sã o iguais.
O segundo par de retâ ngulos mostra o que acontece quando y1 é diferente de y0. Neste
exemplo, se você desenhar uma linha de x0, y0 a x1, y1, a linha será inclinada para baixo. O
gradiente é renderizado ao longo desta linha e exibido como um gradiente linear diagonal.
O terceiro par de retâ ngulos il ustra o gradiente radial quando x0 = x1 ey0 = y1, mas r0 é
definido como zero quando r1 é definido como 100. Como os dois pontos sã o iguais, o
gradiente radial é circular. Como r0 é zero, o gradiente começa no centro. O gradiente
termina em r1, que é definido como 100.
O ú ltimo par de retâ ngulos mostra o que acontece quando os dois pontos nã o sã o iguais.
A Figura 12-4 mostra uma pequena imagem com um retâ ngulo e um círculo. Esta imagem
tem um fundo transparente e nã o há borda ao redor da imagem.
Usando a imagem da Figura 12-4, o có digo a seguir cria um padrã o que é atribuído
à propriedade fil Style.
function drawPattern () {
img.onload = function () {
// criar padrã o
ctx.fillStyle = ptrn;
function drawLineWidth () {
, deslocamento = 40
, largura = 5
, altura = 5
, lineWidth = 1
,i=0
, centerX = canvas.width / 2
, centerY = canvas.height / 2;
ctx.lineWidth = i;
Neste exemplo, lineWidth é alterado em cada iteraçã o do loop for; o retâ ngulo desenhado
começa pequeno e fica maior a cada iteraçã o. O resultado é mostrado na Figura 12-6.
O có digo a seguir demonstra a criaçã o de três retâ ngulos com diferentes configuraçõ es de
lineJoin.
function drawLine Join () {
ctx.lineWidth = 20;
ctx.lineJoin = 'redondo';
ctx.lineJoin = 'bisel';
ctx.lineJoin = 'm iter';
function drawGradientStroke () {
, x0 = 0
, y0 = 0
, r0 = 0
, x1 = 200
, y1 = 0
, r1 = 100
, largura = 300
, altura = 40
, deslocamento = 25;
ctx.lineWidth = 15;
addColorStops (gradiente);
ctx.strokeStyle = gradiente;
y1 = 300;
addColorStops (gradiente);
ctx.strokeSty le = gradiente;
x0 = x1 = largura / 2;
addColorStops (gradiente);
ctx.strokeStyle = gradiente;
y1 = y0 + 100;
addColorStops (gradiente);
ctx.strokeStyle = gradiente;
É possível salvar todas as propriedades do objeto de contexto em uma pilha, que é uma
coleçã o ú ltimo a entrar, primeiro a sair (LIFO). Isso nã o salva a tela real; apenas as
configuraçõ es sã o salvas. O método de salvamento salva as configuraçõ es atuais e o método
de restauraçã o restaura as configuraçõ es. O exemplo a seguir mostra os métodos de salvar
e restaurar.
function saveRestore () {
ctx.lineWidth = 20;
ctx.strokeStyle = “verde";
ctx.lineJoin = 'redondo';
ctx.lineWidth = 10;
ctx.strokeStyle = “vermelho";
ctx.lineJoin = 'bisel';
ctx.restore ();
FIGURA 12-9 Mostrando como as configuraçõ es podem ser salvas e restauradas Você pode
salvar muitas vezes para criar como conjunto de configuraçõ es e, em seguida, restaurar
vá rias vezes para esvaziar a pilha.
<head>
<title> </title>
</head>
<body>
<canvas id = "myCanvas" width = "800" height = "600"> Você precisa de um navegador que
suporte HTML5!
</canvas>
</body>
</html>
tela de pintura {
Desenho de linhas
O caminho mais fá cil de criar é composto por linhas. Isso é feito usando o método line To,
que aceita os parâ metros xey. A seguir, um exemplo do uso de linhas para criar formas que
têm um contorno amarelo e um filamento verde.
desenhar linha();
});
function drawLine () {
ctx.fillStyle = 'verde';
ctx.strokeStyle = 'amarelo';
ctx.lineWidth = 10;
ctx.beginPath ();
ctx.closePath ();
ctx.fill ();
ctx.beginPath ();
ctx.fill ();
ctx.stroke ();
ctx.beginPath ();
ctx.fill ();
ctx.stroke ();
ctx.beginPath ();
ctx.moveTo (500, 250);
ctx.fill ();
ctx.stroke ();
Este exemplo desenha quatro formas. A saída renderizada é mostrada na Figura 12-10.
A segunda forma também é um triâ ngulo e é desenhada como o primeiro triâ ngulo, mas o
método de traçado é chamado depois que o método de preenchimento é chamado. O
método do traço cria o contorno amarelo.
A terceira forma também é um triâ ngulo, mas este có digo nã o chama o método
closePath. Neste exemplo, o método de preenchimento calcula implicitamente a á rea de
preenchimento, mas como o método closePath nã o é chamado , nã o há linha do fim ao
início; portanto, nenhum contorno é renderizado do final para o início.
A quarta forma é um sinal de mais. Isso demonstra o uso do método moveTo para criar
uma linha que nã o começa onde a linha anterior terminou. O método de traço cria as linhas,
mas o método de preenchimento nã o renderiza nada.
Desenhar retângulos
Você pode adicionar retâ ngulos ao seu caminho chamando o método rect. Lembre-se de
que, se tudo o que você precisa fazer é desenhar um retâ ngulo, pode usar os métodos fil
Rect e strokeRect, discutidos anteriormente nesta liçã o.
O método rect é ú til quando você está definindo uma forma complexa. Em vez de adicionar
muitos lineTo cal s para desenhar um retâ ngulo, você apenas chama o método rect. O que
se segue é um exemplo de criaçã o de uma forma que consiste em um triâ ngulo e um
retâ ngulo.
function drawRect () {
ctx.fillStyle = 'verde';
ctx.strokeStyle = 'amarelo';
ctx.lineWidth = 10;
ctx. beginPath ();
ctx.fill ();
ctx.stroke ();
Você pode estar se perguntando se há uma diferença entre chamar fill e, em seguida, stroke
versus chamar stroke e depois fil. Há uma diferença, mas antes que a diferença seja exibida,
você precisa entender como o traço é renderizado.
Quando o traço é calado, o contorno é criado usando a propriedade lineWidth atual. Metade
de lineWidth está fora da forma e a outra metade está dentro da forma. A parte do contorno
que está dentro da forma substitui o preenchimento se o método de traço for chamado
apó s o método de preenchimento.
ctx.fillStyle = 'verde';
ctx.strokeStyle = 'amarelo';
ctx.lineWidth = 10;
ctx.beginPath ();
ctx.fill ();
ctx.stroke ();
ctx.beginPath ();
ctx.lineTo (400, 300);
ctx.stroke ();
ctx.fill ();
Além de desenhar linhas retas, você pode desenhar linhas curvas usando os métodos arc e
arcTo no objeto de contexto.
O método arcTo aceita uma coordenada x1 e uma coordenada y1 que definem um ponto
através do qual as linhas do arco devem passar, seguidas por uma coordenada x2 e uma
coordenada y2 que definem o ponto final, seguida pelo raio do arco. Um mbora apenas dois
pontos sã o fornecidos como parâ metros, um terceiro ponto (x0, y0) é o ponto de partida do
arco. O terceiro ponto é o ponto final do subcaminho anterior.
Desenhar um arco usando o método arcTo pode ser confuso. Para entender como o
ArcTo funciona, execute as seguintes etapas.
1. Em um pedaço de papel, desenhe uma linha em (x0, y0) e (x1, y1).
4. Coloque o círculo no papel que tem as duas linhas e deslize o círculo para cima entre a
linha que contém (x0, y0) e a linha que contém (x2, y2) até que toque apenas nas duas
linhas. Os dois pontos onde o círculo toca as retas sã o chamados de pontos tangentes, onde
t1 está pró ximo de t (x0, y0) e t2 é o mais pró ximo de (x2, y2).
5. Desenhe uma linha do ponto (x0, y0) ao primeiro ponto tangente na linha de (x0, y0) a
(x1, y1).
6. Desenhe um arco desse ponto tangente ao outro ponto tangente na linha de (x1, y1) a
(x2, y2) ao longo da circunferência do círculo.
7. O ponto final de arcTo é o segundo ponto tangente na linha de (x1, y1) a (x2, y2).
No segundo exemplo, o raio é muito maior, entã o o círculo é deslizado para cima até tocar
as linhas, mas desta vez, t1 está fora de x0, y1 e t2 está fora de x2, y2. Ther e ainda uma
certa distâ ncia entre (x0, y0) e t1, de modo que uma linha recta é desenhada entre os dois
pontos. Em t1, a curva começa até atingir t2, onde termina o arco.
Considere o seguinte exemplo de có digo que desenha duas linhas e entã o cria um arco
usando o método arcTo.
function drawArcTo () {
ctx.strokeStyle = 'cinza';
ctx.lineWidth = 1;
ctx.beginPath ();
ctx.moveTo (300, 200);
ctx.stroke ();
ctx.strokeStyle = 'preto';
ctx.lineWidth = 5;
ctx.beginPath ();
ctx.stroke ();
Como o ponto inicial é sempre o ponto final do subcaminho anterior (ou, neste caso, o local
moveTo), o traçado continua a partir desse ponto até atingir a primeira tangente e, em
seguida, a curva começa até atingir o segunda tangente e, em seguida, o arco é concluído.
function drawArcTo () {
ctx.strokeStyle = 'cinza';
ctx.lineWidth = 1;
ctx.beginPat h ();
ctx.stroke ();
ctx.strokeStyle = 'preto';
ctx.lineWidth = 5;
ctx.beginPath ();
ctx.stroke ();
graus porque o círculo sempre tocará essas linhas para criar tangentes t1 e t2 antes que o
arco alcance 180 graus.
O método arc é muito mais simples de usar do que o método arcTo. O método do arco pode
ser usado para desenhar um círculo ou qualquer parte de um círculo. Isso é diferente do
comportamento do método arcTo, que nã o pode desenhar mais do que meio círculo e pode
produzir linhas com o arco em um esforço para continuar um caminho sem quebrar o
traçado.
O método do arco aceita as coordenadas xey como o centro do círculo usado para desenhar
o arco, seguidas pelo raio do círculo que o arco usará , seguido pelo â ngulo inicial e o â ngulo
final. Você pode adicionar um parâ metro de direçã o que indica a direçã o do arco. O có digo
de exemplo a seguir mostra como criar um círculo usando o método arc .
function drawArc () {
ctx.strokeStyle = 'blue';
ctx.fillStyle = 'amarelo';
ctx.lineWidth = 5;
ctx.beginPath ();
ctx.fill ();
ctx.stroke ();
}
Neste exemplo, o centro do círculo é 400, 300, que é o meio da tela. O raio é definido como
100. O local de início deve ser um valor entre 0 e 6,283185, que é 2 * PI. O local de término
também deve ser um valor entre 0 e 6,283185. Os valores 0 e 6,283185 podem ser usados
para representar o ponto do lado direito mais distante do círculo. O valor de 3,14159 (PI) é
o ponto mais à esquerda do círculo. O ponto mais alto do círculo é 1,5
* PI, enquanto o ponto mais baixo do círculo é 0,5 * PI. A tela renderizada é mostrada na
Figura 12-16. O círculo renderizado tem um contorno azul e um filamento amarelo.
Para desenhar um arco que representa parte do círculo, você precisa de localizaçõ es de
início e fim vá lidas e precisa considerar o parâ metro opcional de direçã o. Por padrã o, o
traço é renderizado no sentido horá rio, o que significa que a direçã o é definida como
falsa. Considere o exemplo a seguir, no qual você fornece uma localizaçã o inicial de 0 e uma
localizaçã o final de 1,5 * PI.
function drawArc () {
ctx.fillStyle = 'amarelo';
ctx.lineWidth = 5;
ctx.beginPath ();
ctx.fill ();
ctx.stroke ();
O arco renderizado é mostrado na Figura 12-17, que mostra que três quartos do círculo sã o
renderizados. É isso que você queria ou esperava? Se você deseja renderizar apenas o
quarto do círculo que está faltando, você tem duas soluçõ es possíveis.
FIGURA 12-17 O arco renderizado exibindo três quartos do círculo. Uma soluçã o é definir
a localizaçã o da estrela t em 1,5 * Math.PI e a localizaçã o final em 0. Como a renderizaçã o
renderiza o traço no sentido horá rio, o arco começará a renderizar em o ponto mais alto do
círculo e pare no ponto mais à direita do círculo.
A outra soluçã o é deixar o início em 0 e o final em 1.5 * Math.PI, mas adicionar o parâ metro
opcional de direçã o, passando um valor true . Isso faz com que a renderizaçã o do traço vá
no sentido anti-horá rio, o que renderiza o quarto de círculo.
Desenho de texto
Você também pode desenhar texto na tela usando o método fil Text ou strokeText. O
suporte para desenho de texto é um tanto bá sico. Ambos os métodos requerem que você
passe o texto a ser desenhado como o primeiro parâ metro, seguido pelas coordenadas xey
que especificam onde o texto é desenhado.
Além dos métodos, as propriedades a seguir podem ser definidas para controlar a
aparência do texto renderizado.
■■ fonte Define o estilo, tamanho e família da fonte, delimitado por espaços. O estilo pode
ser normal, itá lico ou negrito. O tamanho pode ser um tamanho CSS. A família representa a
família da fonte, que pode ser uma família de fontes genérica, como serif ou sans serif, ou
uma família de fontes específica, como Arial ou Courier.
O có digo de exemplo a seguir desenha uma linha na tela, passando por seu ponto central
(400, 300). Depois disso, "H el o" é desenhado usando a coordenada de 400, 300.
function drawText () {
var canvas = document.getElementById ('myCanvas')
ctx.strokeStyle = 'magenta';
ctx.fillStyle = 'amarelo';
ctx.lineWidth = 2;
ctx.beginPath ();
ctx.stroke ();
ctx.strokeStyle = 'blue';
FIGURA 12-18 A mensagem Hel o renderizada mostrando que a coordenada está na parte
inferior esquerda do te xt A coordenada fornecida de 400, 300 está na parte inferior
esquerda do texto processado, o que significa que o valor padrã o da propriedade textAlign
é start ou left, e o valor padrã o de textBaseline é bottom. Se você alterar a propriedade
textAlign para ce nter e alterar textBaseline para middle, o texto será centralizado
horizontalmente y verticalmente y dentro da tela, como mostrado na Figura 12-19.
Além de desenhar as muitas formas que esta liçã o abordou, você pode colocar imagens na
tela. Você pode fazer isso desenhando a imagem na tela, usando o método drawImage do
objeto de contexto.
img.onload = function () {
}
Os resultados sã o mostrados na Figura 12-20. A imagem é desenhada em sua largura e
altura naturais. Se a imagem for maior do que a tela, ela é cortada. Esta imagem tem 538
pixels de largura e 718 pixels de altura. Como a tela tem 800 pixels de largura e 600 pixels
de altura, a parte inferior desta imagem é cortada.
function drawImage () {
img.onload = function () {
O resultado é mostrado na Figura 12-21. Ao fornecer a altura e a largura, você deve tentar
manter as proporçõ es da imagem para evitar que ela fique enviesada e pareça muito
magra ou muito gorda.
FIGURA 12-21 A imagem desenhada com um tamanho reduzido para que se encaixe na
tela. Lembre-se de que você pode desenhar sua imagem e sobrepor outras formas
conforme necessá rio.
function drawI mage () {
img.onload = function () {
ctx.strokeStyle = 'preto';
ctx.lineWidth = 2;
ctx.beginPath ();
ctx.stroke ();
ctx.strokeStyle = 'branco';
ctx.lineWidth = 1;
ctx.textAlign = 'certo';
ctx.textBaseline = 'middle';
ctx.strokeStyle = 'preto';
ctx.lineWidth = 2;
ctx.beginPath ();
ctx.stroke ();
ctx. strokeStyle = 'branco';
ctx.lineWidth = 1;
ctx.textAlign = 'left';
ctx.textBaseline = 'middle';
ctx.strokeStyle = 'preto';
ctx.lineWidth = 2;
ctx.beginPath ();
ctx.stroke ();
ctx.strokeStyle = 'branco';
ctx.lineWidth = 1;
ctx.textAlign = 'left';
ctx.textBaseline = 'middle';
Liçã o 1: Desenho usando o elemento < canvas > CAPÍTULO 12 493
FIGURA 12-22 A imagem anotada mostrando que você pode misturar imagens e formas na
tela Resumo da lição
■■ Use caminhos para criar formas complexas usando linhas, retâ ngulos e arcos.
■■ Use os métodos fil Text e strokeText para desenhar texto na tela. Use o método
drawImage para desenhar imagens na tela.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. arcTo ()
B. arc ()
C. círculo ()
D. ponto ()
O que sã o grá ficos vetoriais escalá veis (SVG) e por que você gostaria de usá -los? Essas sã o
perguntas comuns, principalmente porque todos tomam conhecimento do SVG devido à
sua inclusã o no HTML5.
Reto ou arco, a renderizaçã o na tela é feita de maneira bitmap, o que significa que os pixels
sã o comandados para serem exibidos e, apó s a forma renderizada, o c anvas é deixado com
resultados em bitmap. Em outras palavras, a tela nã o armazena o fato de que você criou um
retâ ngulo. Se a superfície de desenho for dimensionada para um tamanho maior, a tela terá
apenas os pixels com os quais trabalhar, entã o o resultado é uma versã o em blocos ou
pixelizada do grá fico.
Embora a renderizaçã o do SVG seja muito melhor do que a tela, leva tempo para
dimensionar e reexecutar os comandos, portanto, o desempenho nã o é tã o bom. A tela é
preferível quando o desempenho é mais importante.
O SVG é baseado em XML e você pode incorporar o SVG em sua pá gina HTML usando
o elemento < svg >. O conteú do do elemento < svg > contém os comandos baseados em XML
que fazem o desenho. O elemento < svg >, mais seu conteú do, faz parte do modelo de objeto
de documento (DOM), portanto, todo o elemento < svg > e seus filhos sã o acessíveis a partir
do JavaScript. Os eventos também podem ser anexados a qualquer um dos elementos. No
entanto, você nã o deseja escrever todo o XML necessá rio para criar um desenho
complexo. Normalmente, é melhor usar um editor SVG para criar o desenho e, em seguida,
incorporar o desenho à sua pá gina da web.
Nesta liçã o, você aprende como usar o elemento < svg > para incorporar um desenho em
um HTML
pá gina para exibir grá ficos simples. Além disso, você aprenderá a usar o elemento < img >
para exibir arquivos .svg.
■■ Descreva o elemento < svg >.
■■ Implemente o elemento < svg >.
Usando o elemento < svg >
</svg>
Criando um caminho
■■ Os parâ metros A ou a sã o rx, ry, rotação do eixo x, arco grande, varredura, x e y . Este
comando desenha um arco elíptico do ponto atual até a coordenada especificada de x,
y com raio x rx e raio y ry. A elipse é girada em graus de rotação do eixo x . Se o arco for
menor que 180 graus, o arco grande será zero; caso contrá rio, é um. Se o arco for maior que
180
graus, o arco grande é definido como 1. Se o arco for desenhado na direçã o positiva,
a varredura é definida como 1; caso contrá rio, a varredura é definida como zero.
■■ Os parâ metros Q ou q sã o x1, y1, x e y . Este comando desenha uma curva Bézier
quadrá tica da localizaçã o atual para a coordenada especificada como x, y usando o ponto de
controle especificado como x1, y1.
■■ T ou t Desenhe uma curva Bézier quadrá tica do ponto atual à coordenada especificada,
usando o ponto de controle do comando Q anterior.
■■ Os parâ metros C ou c sã o x1, y1, x2, y2, x e y . Este comando desenha uma curva de
Bézier cú bica do ponto atual até a coordenada x, y especificada usando o ponto de controle
x1, y1 para o início da curva e o ponto de controle x2, y2 para o final da curva.
■■ Os parâ metros S ou s sã o x2, y2, x e y . Este comando desenha uma curva de Bézier
cú bica do ponto atual para a coordenada x, y especificada usando o ponto de controle do
comando C anterior para o início da curva e o ponto de controle x2, y2 para o final da curva.
-20 -10 -95 -15 z "fill =" blue "id =" carBody "/> Neste exemplo, a letra L minú scula nã o se
repetia para cada linha de comando, o que demonstra que você pode especificar o
comando imediatamente, fornecer parâ metros , forneça parâ metros novamente e assim
por diante. O caminho termina com o comando Z minú sculo, que fecha o caminho. A cor de
preenchimento é definida como azul e o atributo id é definido como carBody.
Aqui estã o mais dois caminhos, que criam as janelas dianteira e traseira do carro.
<path d = "m65 105 l40 -25 65 0 0 34 -112 0 z" fill = "branco" id = "rearWindow" />
<path d = "m300 105 l-40 -25 -78 0 0 34 122 0 z" fill = "white" id = "frontWindow" /> Liçã o
2: Usando grá ficos vetoriais escalá veis CAPÍTULO 12 497
Você pode adicionar círculos a um desenho SVG usando o elemento < circle > , que possui
os atributos r, cx, cy, fil e id. O atributo r define o raio do círculo. Os atributos cx e cy
definem a coordenada do centro do círculo. O atributo de preenchimento define a cor do
círculo. O exemplo a seguir adiciona duas rodas ao corpo do veículo criado no exemplo
anterior.
-13 -38 -20 -10 -95 -15 z "fill =" blue "id =" carBody "/>
<path d = "m65 105 l40 -25 65 0 0 34 -112 0 z " fill = "branco" id = "rearWindow" />
<path d = "m300 105 l-40 -25 -78 0 0 34 122 0 z" fill = "white" id = "frontWindow" />
</svg>
http://code.google.com/p/svg-edit/ .
Se você usa um editor SVG, normalmente deseja externalizar o SVG em seu pró prio arquivo
para facilitar o trabalho no desenho, em vez de incorporar o desenho em sua pá gina HTML
em um elemento < svg >. Você pode fazer isso usando o elemento < img > e definindo a
origem para o local do arquivo .svg. No exemplo a seguir, o elemento < svg > é cortado do
HTML
<head>
<title> </title>
</head>
<body>
</body>
</html>
O atributo viewBox descreve a parte da tela que você deseja que o visualizador veja. Mesmo
que o desenho cubra toda a tela do computador, a figura em seu desenho pode existir
apenas em uma pequena parte do desenho. O atributo viewBox permite que você diga ao
analisador para aumentar o zoom nessa parte para eliminar o espaço em branco
extra. Defina viewBox para obter os recursos de zoom adequados ao redimensionar sua
pá gina HTML.
-13 -38 -20 -10 -95 -15 z "fill =" blue "id =" carBody "/>
<path d = "m65 105 l40 -25 65 0 0 34 -112 0 z" fill = "branco" id = "rearWindow" />
<path d = "m300 105 l-40 -25 -78 0 0 34 122 0 z" fill = "white" id = "frontWindow" />
</svg>
img {
largura: 100%;
Exibe a pá gina HTML. Pode ser necessá rio atualizar a pá gina para ver a
mudança. O elemento < img > agora tem o tamanho da pá gina HTML e o
redimensionamento da pá gina redimensiona o elemento < img >, conforme mostrado na
Figura 12-25.
Verificação rápida
■■ O atributo viewBox descreve a parte do desenho que você deseja que o
usuário veja.
Resumo da lição
■■ O elemento < svg > é usado para criar e exibir grá ficos vetoriais escalá veis (SVG).
■■ Use o elemento < path > para criar formas complexas. O caminho contém uma lista de
comandos para criar uma forma. Cada comando é representado como uma letra maiú scula
ou minú scula. Maiú sculas indica que as coordenadas sã o absolutas; l owercase indica que
as coordenadas sã o relativos. O elemento < circle > é usado para desenhar um círculo. Para
incluir um arquivo .svg externo em uma pá gina HTML, use o elemento < img > e defina o
elemento src para o local do arquivo .svg.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. SGML
B. HTML
C. XHMTL
D. XML
2. No elemento < svg >, qual atributo fornece uma janela para o desenho e ativa os recursos
de zoom?
A. zoom
B. janela
C. viewBox
D. zoomWindow
Pratica exercícios
1. Inicie o Visual Studio Express 2012 for Web. Crie um projeto de aplicativo da Web vazio
ASP.NET chamado CanvasSnapshooter .
2. Depois que o projeto for criado, adicione uma nova pasta, chamada Media, ao projeto.
7. Clique com o botã o direito na pasta Scripts e adicione um novo arquivo JavaScript,
denominado default.js .
8. Adicione uma referência à biblioteca jQuery clicando com o botã o direito do mouse no nó
do projeto. Escolha Gerenciar Pacotes NuG . Clique em Online e digite jQuery nos critérios
de pesquisa. Quando a biblioteca jQuery for exibida, clique no botã o Instalar.
<head>
<body>
</body>
</html>
<head>
<title> </title>
</head>
<body>
</video>
<br />
<br />
<canvas id = "myCanvas" width = "360" height = "240"> Você precisa de um navegador que
suporte tela HTML5!
</canvas>
</body>
</html>
});
function drawVideoFrame () {
18. Teste seu trabalho pressionando F5 para executar o site. Você deve ver a pá gina
VideoPage.html conforme mostrado na Figura 12-26.
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Aprenda mais sobre o elemento < canvas > criando um jogo simples, como o
jogo da velha, que permite jogar.
Respostas
Lição 1
1. Resposta correta: C
B. Incorreto: para desenhar na tela, você precisa executar o método getContext para obter
uma referência a um objeto de contexto, e nã o há método de retâ ngulo no objeto de tela.
2. Resposta correta: B
Lição 2
1. Resposta correta: D
2. Resposta correta: C
C. Correto: O atributo viewBox fornece uma janela para o desenho e permite recursos de
zoom.
CAPÍTULO 1 3
Arrastar e soltar
Antes do HTML5, a capacidade de arrastar e soltar operaçõ es era possível com alguns
navegadores, mas nã o era compatível com navegadores diferentes. Você normalmente
implementa arrastar e soltar usando uma biblioteca de terceiros, como jQuery. Arrastar e
soltar é um cidadã o de primeira classe do HTML5, que é o primeiro passo para ter uma
implementaçã o compatível entre navegadores.
Você ainda pode usar jQuery para outras funcionalidades, mas nã o é necessá rio para
arrastar e soltar.
Este capítulo mostra como arrastar e soltar de um local para outro na pá gina da web e, em
seguida, como arrastar e soltar arquivos.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro.
507
Para ilustrar a técnica de arrastar e soltar, considere a seguinte pá gina HTML, que define
um grande quadrado com três quadrados dentro dele.
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> </title>
</head>
<body>
<div id = "container">
<d iv id = "hole1" class = "hole"> <div id = "item1" class = "item"> 1 </div> </div>
<div id = "hole2" class = "hole"> <div id = "item2" class = "item"> 2 </div> </div>
<div id = "hole3" class = "hole"> <div id = "item3" class = "item"> 3 </div> </div>
</body>
</html>
#container {
borda: só lida;
wid th: 332px;
altura: 332px;
.buraco {
borda: só lida;
largura: 160px;
altura: 160px;
flutuar: esquerda;
.item {
largura: 140p x;
altura: 140px;
cor: #FFFFFF;
-webkit-user-select: nenhum;
-khtml-user-select: nenhum;
-moz-user-select: nenhum;
-ms-user-select: nenhum;
A primeira regra de estilo é para o contêiner, que possui uma borda só lida e as
configuraçõ es de altura e largura formam um quadrado. A configuraçã o de margin-left e
margin-right para resultados automá ticos no contêiner sendo centralizado.
O pró ximo estilo de regra é para os orifícios. Cada buraco é um quadrado preto. A ú ltima
regra de estilo é para os itens. Um item é um quadrado cinza com um nú mero nele. O
nú mero é centralizado e exibido em uma fonte grande. Observe que a ú ltima parte da regra
de estilo define a propriedade selecionada pelo usuá rio como nenhuma e que existem
vá rias entradas, com base no fabricante do navegador. Essa propriedade é definida como
nenhum para evitar que o usuá rio deslize o item por engano e selecione o texto, que é o
nú mero. A Figura 13-1 mostra a pá gina da web renderizada.
Para especificar para o navegador que um elemento pode ser arrastado, use o atributo
draggable, que possui três valores vá lidos: true , false e auto . Para a maioria dos
navegadores, a configuraçã o automá tica é o padrã o, o que significa que o navegador decide
se o elemento deve ser arrastado. Por exemplo, o elemento < img > normalmente é
arrastá vel por padrã o, mas um elemento < div > nã o é arrastá vel por padrã o. Neste
documento HTML de amostra, o item é um elemento < div > e nã o pode ser arrastado por
padrã o. Depois de adicionar o atributo arrastá vel, o contêiner se parece com o seguinte.
<div id = "container">
</div>
</div>
</div>
</div>
Depois de adicionar o atributo arrastá vel aos itens, você pode arrastá -los, conforme
mostrado na Figura 13-2.
FIGURA 13-2 O atributo arrastá vel adicionado, permitindo que o item seja arrastado Você
pode arrastar um item, mas o item contém o símbolo de não entrada para indicar que o
item nã o pode ser solto.
var $ draggedItem;
});
$ draggedItem = $ (e.target);
Este exemplo usa a funçã o de documento pronto em jQuery para assinar os eventos
dragstart e dragend em todos os elementos que têm o item de classe CSS atribuído. A
funçã o de arrastar adiciona a classe CSS de arrastar quando o arrastar começa e on define o
$ draggedItem com o valor do item que está sendo arrastado. A funçã o draggingEnded
remove a classe CSS de arrastamento.
.dragging {
Neste exemplo , o fundo do item arrastado muda para amarelo até que o arrasto pare.
Caindo
var $ draggedItem ;
});
functi on dragging (e) {
$ draggedItem = $ (e.target);
}
e.preventDefault ();
$ draggedItem.detach ();
$ draggedItem.appendTo ($ (e.target));
O evento drop chama a funçã o dropItem. Em dropItem, um objeto jQuery é criado a partir
de et arget, que é o destino de soltar, e é atribuído a uma variá vel de furo . A instruçã o if
verifica se o destino de soltar tem a classe CSS de furo. Isso é necessá rio porque você pode
deixar algo cair em cima de um item em vez de em um buraco. Quando o item está em
um buraco, o evento de soltar borbulha e executa o evento de soltar no buraco. Se o alvo de
soltar for um buraco, o có digo verifica se há filhos; se tem criança, esse buraco já tem um
item e você nã o deve poder cair. Se o alvo de soltar for um buraco sem filhos, o jQuery
desanexa o item arrastado do DOM e entã o anexa draggedItem ao alvo de soltar. Figura 13-
3
Verificação rápida
■■ Quais duas operações padrão de eventos devem ser evitadas para permitir que o
evento de descarte opere?
FIGURA 13-3 O item sendo arrastado e o item apó s ser solto Usando o objeto
DataTransfer
jQuery.event.props.push ('dataTransfer');
O jQuery cria um objeto wrapper que se assemelha ao evento original e copia apenas
os dados do objeto original de que o jQuery precisa. Esta instrução diz ao jQuery para
procurar a propriedade dataTransfer no objeto original e, se existir, copiá-la para o
wrapp er jQuery .
Você pode passar dados para o evento drop usando a propriedade dataTransfer. O objeto
DataTransfer tem os seguintes membros.
■■ files Propriedade que obtém uma lista dos arquivos que estã o sendo arrastados.
■■ types Propriedade que obtém uma lista de strings dos tipos que estã o
sendo configurados.
No exemplo a seguir, o documento HTML possui uma lista nã o ordenada de carros, da qual
você pode arrastar e soltar qualquer um dos carros em uma lista nã o ordenada diferente de
carros favoritos, conforme a seguir.
<cabeça >
<title> </title>
</head>
<body>
<ul id = "carList">
</ul>
</ul>
</body>
</html>
Nã o há nenhum arquivo CSS para fazer a pá gina ou a operaçã o de arrastar e soltar parecer
organizada, mas um estilo embutido é aplicado a favoriteCars para que o usuá rio possa ver
uma á rea para soltar. Cada um dos carros pode ser arrastado e usa atributos de dados para
fornecer dados que serã o coletados quando o arrastamento começar e depois passados
para o evento de soltar. O arquivo JavaScript é semelhante ao exemplo anterior, que foi
usado para mover nú meros, mas, desta vez, os dados sã o passados para o evento drop
usando o objeto DataTransfer conforme a seguir.
jQuery.event.props.push ('dataTransfer');
});
e.dataTransf er.effectAllowed = 'copiar';
e.preventDefault ();
e.target.appendChild (li);
A funçã o dropItem é chamada a partir do evento drop. O objeto DataTransfer também está
disponível no evento drop por meio da propriedade dataTransfer. Os dados sã o
recuperados, divididos em uma matriz e atribuídos à variá vel de dados. Em seguida, o
primeiro elemento é testado para ver se é um carro. Nesse caso, um novo item da lista é
criado e a marca do carro, que está nos dados [1], é atribuída à propriedade textContent do
item da lista. Finalmente, o item da lista é anexado ao elemento soltar.
A Figura 13-4 mostra a tela finalizada depois que um carro foi arrastado e solto na lista de
carros favoritos.
Resumo da lição
■■ O atributo arrastá vel deve ser definido como verdadeiro e adicionado a cada elemento
que precisa ser arrastado.
■■ Os eventos dragstart e dragend podem ser usados para alterar o estilo do elemento que
está sendo arrastado.
■■ Os eventos dragenter e dragover devem ser codificados para evitar a operaçã o padrã o e
permitir a queda.
■■ O evento de soltar é acionado quando o item é solto em um alvo de soltar.
■■ O objeto DataTransfer é usado para passar dados entre o evento dragstart e o evento
drop.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
opçã o de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Qual dos eventos a seguir dispara continuamente durante uma operaçã o de arrastar e
soltar?
A. dragstart
B. arrastar
C. dragend
D . Dragenter
E. dragover
F. dragleave
G. drop
2. Quais dos eventos a seguir estã o associados ao item que está sendo arrastado? (Escolha
todas as opçõ es aplicá veis)
A. dragstart
B. arrastar
C. dragend
D. dragenter
E. dragover
F. dragleave
G. drop
3. Usando o objeto DataTransfer, que tipo de dados você pode passar para o evento drop?
A. Qualquer string vá lida, nú mero, data / hora ou valor booleano B. Qualquer URL que
esteja no mesmo domínio da pá gina da web C. Qualquer objeto JSON
Você pode arrastar e soltar arquivos usando a interface de programaçã o de aplicativo (API)
de arquivo, que também faz parte do HTML5. A API de arquivo fornece acesso indireto a
arquivos de maneira estritamente controlada.
<head>
<title> </title>
<link href = "FileDragAndDrop.css" rel = "stylesheet" />
</head>
<body>
<div id = "target">
</div>
</body>
</html>
#alvo {
borda: só lida;
altura: 150px;
largura: 500px;
t ext-alinhar: centro;
#informaçõ es do arquivo {
largura: 500px;
}
tabela, th, td {
th, td {
preenchimento: 5px;
A Figura 13-5 mostra a pá gina da web. Ainda nã o há JavaScript, entã o você pode pensar que
nã o pode arrastar e soltar nenhum arquivo aqui, mas há um comportamento padrã o para
arquivos que sã o arrastados e soltos. Se você soltar um arquivo em qualquer lugar da
pá gina da web, o arquivo será aberto em outra janela.
Por exemplo, se você arrastar e soltar um filme na pá gina da web, o filme começará a
ser reproduzido em uma nova janela.
jQuery.event.props.push ('dataTransfer');
});
e.preventDefault ();
Em seguida, o evento drop é su bscrito, que chama a funçã o dropItem. A funçã o dropItem
recupera a coleçã o de arquivos do objeto DataTransfer. O conteú do da tabela de
informaçõ es do arquivo é sobrescrito pelo cabeçalho, que também apaga todas as
informaçõ es existentes na tabela. Finalmente, um loop for é usado para percorrer os
arquivos e adicionar uma linha de informaçõ es à tabela de informaçõ es de cada arquivo. A
seguir está o arquivo JavaScript completo.
jQuery.event.props.push ('dataTransfer');
});
e.preventDefault ();
, i = 0;
$ table.html (
'<thead> <tr> <th> Nome </th> <th> Tipo </th> <th> Tamanho </th> </tr>
</thead>'); para (i = 0; i <files.length; i ++) {
$ ('<tr> <td>'
preventDefau lt (e);
A Figura 13-6 mostra a pá gina da web depois que vá rios arquivos foram arrastados e
soltos. A tabela de informaçõ es do arquivo é preenchida e exibida. A primeira coluna
contém os nomes dos arquivos (sem um caminho) dos arquivos eliminados. A segunda
coluna contém o tipo MIME do arquivo , se o tipo puder ser derivado. A ú ltima coluna
contém o tamanho do arquivo em bytes.
520 CAPÍTULO 13 Arrastar e soltar
ARQUIVO 13-6 A pá gina da web concluída depois que os arquivos foram arrastados e
soltos Verificação rápida
Resumo da lição
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Para quais eventos você precisa se inscrever para arrastar e soltar arquivos de
programa? (Escolha todas as opçõ es aplicá veis)
A. dragstart
B. arrastar
C. dragend
D. dragenter
E. dragover
F. dragleave
G. drop
A. nome
B. caminho
Tipo C.
D. tamanho
Pratica exercícios
Neste exercício, você aplica seu conhecimento de arrastar e soltar criando um jogo de
embaralhamento numérico. O jogo consiste em um tabuleiro de jogo que possui quatro
linhas e quatro colunas, proporcionando assim dezesseis quadrados nos quais pode existir
um ladrilho deslizante que possui um nú mero. Quinze dos quadrados sã o ocupados por
ladrilhos numerados. Isso deixa um quadrado vazio que pode ser usado para mover as
peças.
1. Inicie o Visual Studio Express 2012 for Web. Crie um projeto ASP.NET Empty Web
Applicati on denominado NumberScramble .
5. Clique com o botã o direito na pasta Scripts e adicione um novo arquivo JavaScript
denominado default.js .
6. Adicione uma referência à biblioteca jQuery clicando com o botã o direito do mouse no nó
do projeto e escolhendo Gerenciar pacotes NuGet. Clique em Online e digite jQuery nos
critérios de pesquisa. Quando a biblioteca jQuery for exibida, clique no botã o Instalar.
<head>
</head>
<body>
</body>
</ htm l>
<head>
</head>
<body>
<div id = "message">
</div>
<div id = "gameBoard">
</div>
</body>
</html>
11. No arquivo default.css, adicione as seguintes regras de estilo para o tabuleiro do jogo, a
mensagem e os quadrados e ladrilhos que devem ser criados de forma programá tica.
corpo {
#gameBoard {
largura: 345px;
altura: 345px;
#mensagem {
cor: limã o;
altura: 80px;
.tile {
largura: 80px;
altura: 80px;
cor branca;
.quadrado {
borda: só lida;
largura: 80px;
altura: 80px;
flutuar: esquerda;
.arrastados {
var squareCount = 16
var emptySquare;
var squareCount = 16
var emptySquare;
jQuery.event.props.push ('dataTransfer');
createBoard ();
addTiles ();
});
function createBoard () {
15. Na funçã o createBoard, adicione uma funçã o addTiles. Nesta funçã o, adicione uma
instruçã o para atribuir o valor da variá vel squareCount menos um
à variá vel emptySquare . Adicione um loop for que efetua loops
enquanto a variá vel do loop é menor que o valor emptySquare . No loop for, use jQuery para
obter uma referência ao quadrado que corresponde à variá vel do loop . Use jQuery para
criar um elemento < div > cujo id é tile mais o valor da variá vel de loop . Adicione
um atributo de empena de arraste e defina seu valor como true . Adicione o atributo de
classe e atribua a classe de bloco. No conteú do deste elemento < div >, coloque o valor
da variá vel de loop mais um. Acrescente o ladrilho recém-criado ao quadrado
correspondente.
function addTiles () {
emptySquare = squareCount - 1;
}
16. No Solution Explorer, clique com o botã o direito do mouse no arquivo default.html e
escolha Definir como pá gina inicial.
17. Teste seu trabalho pressionando F5 para executar o site. Você deve ver a pá gina
default.html conforme mostrado na Figura 13-7.
Neste ponto, você tem a mensagem padrã o e o tabuleiro de jogo renderizado com as peças.
Neste exercício, você aplica seu conhecimento de arrastar e soltar adicionando có digo ao
jogo de embaralhamento de nú mero criado no Exercício 1, “Criar um jogo de
embaralhamento de nú mero”, para oferecer suporte à funcionalidade de arrastar e soltar.
2. No arquivo default.js , adicione o có digo a seguir à funçã o de documento pronto para
assinar os eventos dragstart, dragend, dragenter, dragover e drop.
createBoard ();
addTiles ();
});
$ tile.addClass ('arrastado');
e.dataTransfer.effectAllowed = 'mover';
5. Apó s a funçã o dragStarted, adicione uma funçã o dragEnded. Nesta funçã o, use jQuery
para remover a classe CSS arrastada do bloco.
Seu có digo deve ser semelhante ao seguinte.
6. Na funçã o dragEnded, adicione uma funçã o preventDefault que usa um parâ metro de
evento e. Nesta funçã o, adicione uma instruçã o para chamar o método preventDefault on e.
e.preventDefault ();
7. Na funçã o preventDefault, adicione uma funçã o drop que leva um parâ metro de evento
e. Nesta funçã o, adicione uma instruçã o para criar um wrapper jQuery para e.target e
atribua-o a uma variá vel $ square . Adicione uma instruçã o if para verificar se o alvo da
queda é um quadrado, verificando se $ square tem a classe CSS chamada de
quadrado. Nesse caso, use jQuery para adicionar có digo que lê o atributo data-square $
sq uare e coloque o valor em uma variá vel destinationLocation . Compare o valor
de emptySquare com o valor do local de destino e, se eles nã o forem iguais, saia da funçã o
de soltar usando uma instruçã o de retorno.
if ($ square.hasClass ('square')) {
moveTile (sourceLocation);
9. Na funçã o de soltar, adicione uma funçã o moveTile que usa o parâ metro
sourceLocation. Em esta funçã o, adicionar uma declaraçã o para criar
uma distância variá vel que está definido para o parâ metro SourceLocation menos
o emptySquare valor.
10. Adicione uma declaraçã o para tornar a distâ ncia um valor positivo, se for
negativa. Compare a distâ ncia com 1 ou 4, em que o valor de 1 indica uma queda de um
quadrado adjacente y horizontal e um valor de 4 indica uma queda de um quadrado
adjacente vertical y. Se a distâ ncia for igual a 1 ou 4, chame a funçã o
swapTileAndEmptySquare com o parâ metro sourceLocation.
swapTileAndEmptySquare (sourceLocation);
var squareCount = 16
var emptySquare;
jQuery.event.props.push ('dataTransfer');
createBoard ();
addTiles ();
});
function createBoard () {
function addTiles () {
emptySquare = squareCount - 1;
$ tile.addClass ('arrastado');
e.dataTransfer.effectAllowed = 'mover';
e.preventDefault ();
if ($ square.hasClass ('square')) {
moveTile (sourceLocation);
swapTileAndEmptySquare (sourceLocation);
$ draggedItem.appendTo ($ target);
emptySquare = sourceLocation;
Você deve ser capaz de mover os ladrilhos arrastando e soltando um ladrilho no espaço
vazio. A pá gina default.html apó s mover alguns blocos é mostrada na Figura 13-8.
Neste exercício, você aplica seu conhecimento de arrastar e soltar adicionando có digo ao
jogo de embaralhamento de nú meros criado no Exercício 2 para embaralhar os ladrilhos
quando a pá gina é renderizada e verificar um vencedor apó s cada arrastar e soltar.
1. Inicie o Visual Studio Express 2012 for Web. Abra o projeto NumberScramble.
2. No arquivo default.js, adicione o có digo a seguir à funçã o de documento pronto para
chamar uma funçã o de embaralhamento que você criará a seguir.
jQuery.event.props.push ('dataTransfer');
createBoard ();
addTiles ();
passeio();
});
function scramble () {
var sourceLocation;
sourceLocation = emptySquare + 1;
}
outro {
sourceLocation = emptySquare - 1;
outro {
sourceLocation = emptySquare + 4;
outro {
sourceLocation = emptySquare - 4;
swapTileAndEmptySquare (sourceLocation);
4. Na funçã o de soltar, adicione o có digo para chamar a funçã o checkForWinner que você
criará a seguir.
if ($ square.hasClass ('square')) {
moveTile (sourceLocation);
checkForWinner ();
function checkForWinner () {
var squareCount = 16
var emptySquare;
jQuery.event.props.push ('dataTransfer');
createBoard ();
addTiles ();
passeio();
});
function createBoard () {
function addTiles () {
emptySquare = squareCount - 1;
$ tile.addClass ('arrastado');
e.dataTransfer.effectAllowed = 'mover';
e.preventDefault ();
if ($ square.hasClass ('square')) {
var destinationLocation = $ square.data ('square');
moveTile (sourceLocation);
checkForWinner ();
swapTileAndEmptySquare (sourceLocation);
$ draggedItem.detach ();
$ draggedItem.appendTo ($ target);
emptySquare = sourceLocation;
function scramble () {
para (var i = 0; i <128; i ++) {
var sourceLocation;
sourceLocation = emptySquare + 1;
outro {
sourceLocation = emptySquare - 1;
outro {
var row = Math.floor (emptySquare / 4)
sourceLocation = emptySquare + 4;
outro {
sourceLocation = emptySquare - 4;
swapTileAndEmptySquare (sourceLocation);
function checkForWinner () {
Quando a pá gina é exibida, os ladrilhos devem ser embaralhados. Você deve ser capaz de
mover os ladrilhos arrastando e soltando um ladrilho no espaço vazio. Quando terminar de
classificar os ladrilhos, você deverá ver a mensagem vencedora, conforme mostrado na
Figura 13-9.
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Aprenda mais sobre arrastar e soltar criando um aplicativo que permite ao
usuá rio fazer seleçõ es arrastando e soltando opçõ es.
Respostas
Lição 1
1. Respostas corretas: B e E
A. Incorreto: O evento dragstart dispara apenas quando você inicia uma operaçã o de
arrastar.
C. Incorreto: O evento dragend dispara apenas quando você termina uma operaçã o de
arrastar.
D. Incorreto: O evento dragenter dispara apenas quando você insere um destino de soltar.
F. Incorreto: O evento dragleave dispara apenas quando você deixa um alvo de soltar.
G. Incorreto: O evento de soltar é acionado apenas quando você solta o item que está
sendo arrastado.
2. Respostas corretas: A, B e C
3. Resposta correta: D
A. Incorreto: Embora esses tipos de dados possam ser passados, você pode passar
qualquer objeto que possa ser representado como uma string ou URL.
B. Incorreto: embora URLs possam ser passados, você pode passar qualquer objeto que
possa ser representado por uma string ou URL.
C. Incorreto: Embora esses tipos de dados possam ser passados, você pode passar
qualquer objeto que possa ser representado como uma string ou URL.
D. Correto: Você pode passar qualquer objeto que pode ser representado como uma string
ou URL.
L i ç ã o 2
1. Respostas corretas: D, E e G
G. Correto: O evento de soltar é acionado apenas quando você solta o item em um destino
de soltar e é necessá rio para processar os arquivos soltos.
2. Resposta correta: B
Respostas CHAPT ER 13 537
CAPÍTULO 1 4
ciente de localização
A API é genérica o suficiente para fazer interface com muitas fontes de informaçõ es de
localizaçã o subjacentes, como o Sistema de Posicionamento Global (GPS) e locais inferidos
de sinais de rede , como endereço IP, identificaçã o por radiofrequência (RFID), Wi-Fi e
Bluetooth MAC
endereços e IDs cel ular e de entrada do usuá rio. Nã o há garantia de que a API retorne a
localizaçã o real do dispositivo, e a precisã o pode variar amplamente. Cada vez mais,
os dispositivos mó veis sã o fornecidos com GPS, além de acelerô metro e bú ssola. Esses
sensores podem fornecer grande precisã o para a API de geolocalizaçã o.
A API foi projetada para permitir solicitaçõ es de posiçã o instantâ neas e atualizaçõ es de
posiçã o repetidas. A Liçã o 1, “ Posicionamento bá sico”, cobre consultas ú nicas; A Liçã o 2,
“Posicionamento monitorado”, aborda atualizaçõ es de posiçã o repetidas.
539
Para completar este bo ok, você deve ter algum conhecimento de desenvolvimento
web. Este capítulo requer o hardware e o software listados na seçã o “Requisitos do
sistema” na Introduçã o do livro.
function supportedGeolocation () {
<head>
<title> </title>
</head>
<body>
<div id = "message">
</div>
</body>
</html>
A pá gina da web tem uma referência à folha de estilo Geolocation.css que está vazia no
momento, à biblioteca jQuery e ao arquivo JavaScript Geolocation.js, que está vazio no
momento. O elemento < body > contém apenas um elemento < div > cujo id é mensagem.
getLocation ();
});
function supportedGeolocation () {
function getLocation () {
if (supportedGeolocation ()) {
navigator.geolocation.getCurrentPosition (showPosition);
outro {
}
}
+ "Timestamp:" + datetime);
Quando a funçã o showPosition é chamada, é passado um objeto Position que contém uma
propriedade coords e times tamp. A Figura 14-1 mostra o resultado renderizado.
Manipulação de erros
Você deve lidar com erros ao chamar métodos no objeto Geolocation. Você lida com erros
adicionando outro parâ metro de retorno de chamada à chamada, de modo que o primeiro
parâ metro seja o retorno de chamada com sucesso e o segundo parâ metro seja o retorno
de chamada de erro.
getLocation ();
});
function supportedGeolocation () {
function getLocation () {
if (supportedGeolocation ()) {
outro {
+ "Timestamp:" + datetime);
}
switch (error.code) {
erro de caso.PERMISSION_DENIED:
erro de caso.POSITION_UNAVAILABLE:
erro de caso.UNKNOWN_ERROR:
Abordando privacidade
Se uma pá gina da web pode obter sua posiçã o atual, isso é uma invasã o à sua
privacidade? Sim, e você receberá um aviso que diz: “ DomainName deseja rastrear sua
localizaçã o física.” Nesse ponto, você pode decidir se deseja que seu local seja recuperado
uma vez, o tempo todo ou nunca. A Figura 14-2 mostra o prompt.
Especificando opções
O terceiro parâ metro que você pode passar para o método getCurrentPosition sã o as
opçõ es, que é um objeto Pos itionOptions que fornece as seguintes propriedades opcionais.
function getLocation () {
if (supportedGeolocation ()) {
var options = {
enableHighAccuracy: true ,
maximumAge: 20000
};
outro {
Verificação rápida
■■ O que você deve fazer para evitar que os sites recuperem sua localização sem o
seu conhecimento?
■■ Quando você visita um site que solicita sua localização, um pop-up é exibido e
você deve conceder permissão explicitamente ao site antes que sua localização possa
ser recuperada.
Tenha cuidado ao selecionar Permitir sempre porque é fácil esquecer que
você selecionou.
Resumo da lição
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Qual método obtém sua localizaçã o atual uma vez do objeto Geolocation?
A. watchPosition ()
B. watchLocation ()
C. getCurrentPosition ()
D. getCurrentLocation ()
Se você estivesse escrevendo um aplicativo que plotasse sua localizaçã o atual em um mapa,
seria mais eficiente permitir que a API de Geolocalizaçã o avisasse quando a localizaçã o
muda do que escrever um có digo que continua a pesquisar a localizaçã o atual. Esse é o foco
desta liçã o.
Você pode usar o método watchPosition do objeto Geolocation para recuperar atualizaçõ es
de posiçã o contínuas. Este método usa os mesmos parâ metros do método
getCurrentPosition. A diferença é que, quando você chama watchPosition uma vez, ele
continua chamando a funçã o de sucesso até que você chame o método clearWatch para
parar de monitorar sua posiçã o.
O método watchPosition retorna um id, que é passado ao método clearWatch para encerrar
o monitoramento. Neste exemplo, a pá gina da web é modificada com a adiçã o de um botã o
para iniciar o monitoramento de localizaçã o e outro botã o para encerrar o monitoramento
de localizaçã o, como a seguir.
<head>
<title> </title>
</head>
<body>
<div id = "message">
</div>
</body>
</html>
var watchId = 0;
});
function supportedGeolocation () {
}
function getLocation () {
if (supportedGeolocation ()) {
var options = {
enableHighAccuracy: true
};
outro {
function endWatch () {
if (watchId! = 0) {
navigator.geolocation.clearWatch (watchId);
watchId = 0;
+ "Timestamp:" + datetime);
switch (error.code) {
erro de caso.PERMISSION_DENIED:
erro de caso.POSITION_UNAVAILABLE:
intervalo;
intervalo;
erro de caso.UNKNOWN_ERROR:
intervalo;
Calcular a distâ ncia percorrida é relativamente fá cil se você estiver viajando em um aviã o
plano.
Como as pessoas estã o viajando pela Terra, você precisa usar a geometria esférica para
calcular a distâ ncia percorrida. Os re vá rias fó rmulas para este cá lculo, com base
principalmente na precisã o. Além disso, todos os cá lculos baseiam-se no fato de a Terra ser
perfeitamente redonda, sem colinas e vales.
Essa fó rmula é um pouco mais complexa do que outras fó rmulas, como a lei esférica dos
cossenos, mas fornece melhor precisã o. O seguinte é uma funçã o getDistance usando a
fó rmula haversine.
Verificação rápida
Resumo da lição
■■ O método watchPosition monitora sua localizaçã o e usa os mesmos parâ metros que
o método getCurrent Position.
Revisão da aula
A. watchPosition ()
B. watchLocation ()
C. getCurrentPosition ()
D. getCurrentLocation ()
2. Qual das seguintes fó rmulas você pode usar para calcular a distâ ncia entre
duas amostras?
A. haversine
D. hiperbó lico
Pratica exercícios
1. Inicie o Visual Studio Express 2012 for Web. Crie um projeto ASP.NET Empty Web
Application chamado PositionMapper .
5. Clique com o botã o direito na pasta Scripts e adicione um novo arquivo JavaScript
denominado default.js .
6. Adicione uma referência à biblioteca jQuery clicando com o botã o direito do mouse no nó
do projeto. Escolha Gerenciar Pacotes NuGet. Clique em Online e digite jQuery nos critérios
de pesquisa. Quando a biblioteca jQuery for exibida, clique no botã o Instalar.
<head>
</head>
<body>
</body>
</html>
<head>
<body>
</body>
</html>
#map {
largura: 800px;
altura: 600px;
borda: só lida;
#mensagem {
largura: 800px;
altura: 50px;
borda: só lida;
getLocation ();
});
function getLocation () {
if (supportedGeolocation ()) {
, showError);
outro {
function supportedGeolocation () {
switch (error.code) {
erro de caso.PERMISSION_DENIED:
ca se error.POSITION_UNAVAILABLE:
intervalo;
intervalo;
erro de caso.UNKNOWN_ERROR:
intervalo;
, position.coords.longitude);
var options = {
zoom: 13,
centro: coords,
mapTypeControl: false,
NavigationControlOptions: {
estilo: google.maps.NavigationControlStyle.SMALL
},
mapTypeId: g oogle.maps.MapTypeId.ROADMAP
};
posiçã o: coords,
mapa: mapa,
});
16. No Solution Explorer, clique com o botã o direito do mouse no arquivo default.html e
escolha Definir como pá gina inicial.
Os exercícios adicionais a seguir foram elaborados para lhe dar mais oportunidades de
praticar o que aprendeu e ajudá -lo a dominar com sucesso as liçõ es apresentadas neste
capítulo.
■■ Exercício 1 Saiba mais sobre posicionamento criando um aplicativo que recupera a
localizaçã o atual do usuá rio para ajudar a encontrar locais pró ximos, como postos de
gasolina ou restaurantes.
Respostas
Lição 1
1. Resposta correta: C
2. Resposta correta: D
Lição 2
1. Resposta correta: A
B. Incorreto: você usa o teorema de Pitá goras para calcular a hipotenusa de um triâ ngulo
retâ ngulo.
CAPÍTULO 1 5
Até agora, você aprendeu como tirar proveito de uma ampla gama de ferramentas para
produzir aplicativos que sã o esteticamente atraentes, responsivos e rá pidos. No entanto,
seu principal meio de armazenamento de dados se limita a enviar informaçõ es de volta ao
servidor, o que exige que o aplicativo espere até que ocorra uma viagem de ida e volta.
Este capítulo começa com uma visã o geral dos dois mecanismos de armazenamento
(localStorage e sessionStorage) e como eles podem fazer melhorias dramá ticas em como os
dados do usuá rio sã o retidos. O capítulo entã o examina como o uso de eventos de
armazenamento pode combater problemas complexos, como condiçõ es de corrida.
Para completar este livro, você deve ter algum conhecimento de desenvolvimento
web. Este capítulo requer o hardware e o software listados na seçã o “Requisitos do
sistema” na Introduçã o do livro. Especificamente, você precisa de um navegador (como o
Internet Explorer 8 ou uma versã o mais recente) que possa acomodar armazenamento na
web .
Lição 1: Apresentando o armazenamento na web
555
Entendendo os cookies
{
var cookies = document.cookie.split (";");
if (chave == cookieName)
return val;
// uso
O exemplo demonstra que trabalhar com cookies nã o é complicado, mas a interface para
fazer isso deixa muito a desejar. Para simplificar o trabalho com cookies, você pode usar o
jQuery.
Os cookies continuarã o a ser uma ferramenta eficaz no futuro pró ximo, mas têm algumas
desvantagens.
mensagens.
Como as limitaçõ es dos cookies eram muito altas, a demanda por recursos de
armazenamento mais poderosos era grande. Algumas alternativas criativas foram
desenvolvidas dentro de alguns dos plug-ins mais populares.
■■ Flash Player O plug-in Adobe Flash Player foi um dos primeiros a oferecer um
mecanismo de armazenamento confiá vel por meio de sua funçã o Objetos Compartilhados
Locais. Ele vem com a capacidade de armazenar muito mais dados do que cookies e dá ao
usuá rio a capacidade de aumentar ou limitar a quantidade de espaço permitido para cada
site. Outro recurso extremamente ú til dos Objetos Compartilhados Locais é sua capacidade
de serem escritos por um navegador e lidos por outros. Por exemplo, se um usuá rio criar
uma lista de tarefas pendentes em um site da Web usando o Internet Explorer, essa lista
poderá ser acessada posteriormente pelo Flash Player em execuçã o no Firefox.
■■ Google Gears Uma soluçã o que estava à frente de seu tempo foi o Google Gears, que
vá rios utilitá rios de alto volume da web usavam, como YouTube e Gmail. Em 2010, no
entanto, o Google anunciou que nã o está mais desenvolvendo novos recursos para o
Gears . Em vez disso, os esforços do Google estã o voltados para a construçã o dos padrõ es
da web HTML5.
■■ Applets Java Outra soluçã o popular de có digo-fonte aberto eram os Applets Java, outra
forma compatível com vá rios navegadores de armazenar informaçõ es. No entanto, como o
Flash Player e o Gears, seu uso está caindo drasticamente em favor de alternativas HTML5.
■■ Plug-in necessário O primeiro obstá culo é que o usuá rio nã o deve apenas ter o plug-in
instalado, mas também frequentemente ter a versã o correta do plug-in.
■■ Banco de dados Web SQL Para aplicativos mais complexos, pode ser uma boa
alternativa ao armazenamento na web. Ele fornece o poder de um banco de dados
relacional completo, incluindo suporte para comandos SQL, transaçõ es e ajuste de
desempenho. Infelizmente, seu suporte é extremamente limitado e pode ser deixado para
trá s em favor de outras opçõ es.
Considerando a segurança
Embora os quatro tipos de armazenamento tenham muitas diferenças, eles também têm
algumas semelhanças impressionantes, além de serem veículos para armazenar dados
na má quina do cliente .
Uma propriedade que todos eles têm em comum é que os dados armazenados estã o
vinculados ao URL
(ou, mais especificamente, a origem), o que garante que os dados nã o possam ser acessados
por outros sites.
Portanto, o mesmo host, porta e protocolo (por exemplo, HTTP versus HTTPS) devem ser
fornecidos antes que uma pá gina da Web possa acessar os dados gravados por outra
pá gina.
■■ http://www.example.com/area1/page2.html Sim
■■ http://www.example.com/area2/page1.html Sim
A associaçã o estrita à origem é uma consideraçã o importante ao desenvolver sites que
podem ser hospedados em um domínio compartilhado. Na maioria dos casos, seria uma
prá tica melhor evitar o uso total do armazenamento da web se o seu site residisse em um
domínio compartilhado no futuro, porque qualquer subsite dentro do domínio seria capaz
de acessar seus dados.
■■ armazenamento na web
■■ Web SQL
■■ Compatível com Chrome (v22.0 +), Safari (v5.1 +), Safari Mobile (v 3.2+), Blackberry
(v7.0 +), Android (v2.1 +), Opera (v12.0 +)
■■ IndexedDB
■■ Compatível com Internet Explorer (v10.0 e versõ es mais recentes), Firefox (v15.0 +),
Chrome (v23.0 +), Blackberry (v10.0 +)
■■ API FileSystem
■■ Não compatível com Internet Explorer, Firefox, Safari, Safari Mobile, Android, Opera,
Opera Mobile
Explorando localStorage
A seguir está uma lista de métodos e atributos disponíveis no objeto Storage no que diz
respeito a localStorage .
E como é tratado como muitos outros dicioná rios JavaScript, você também pode definir
valores usando outras sintaxes comuns.
ou
E, como setItem, você também pode usar outras sintaxes para recuperar valores do
dicioná rio.
ou
localStorage.removeItem ('firstName');
localStorage.clear ();
function isWebStorageSupported () {
if (isWebStorageSupported ()) {
A popular biblioteca JavaScript, Modernizr, vem com um método que pode fazer essa
verificaçã o para você.
if (Modernizr.localstorage) {
NOTA CAPACIDADE DE ARMAZENAMENTO
tentar{
pegar (e) {
// degradar graciosamente
O exemplo a seguir cria um objeto JSON e usa o método stringify () para converter o valor
em uma string que pode entã o ser colocada no armazenamento da web.
Você pode entã o usar o método parse () para desserializar uma nova instâ ncia do objeto da
representaçã o da string que foi armazenada no exemplo anterior.
Nã o se esqueça de que uma desvantagem potencial dos cookies é que eles estã o sempre
incluídos nas solicitaçõ es e respostas da web, mesmo que você nã o os use. A situaçã o ao
usar o armazenamento na web é oposta; seus valores nunca sã o passados automaticamente
para o servidor. Você mesmo pode fazer isso incluindo valores em uma chamada AJAX ou
usando JavaScript para copiar os valores em elementos de formulá rio postados.
Verificação rápida
■■ Procurando vírus
Embora a quantidade de tempo que normalmente leva para executar essas açõ es seja
geralmente muito pequena para notar, elas podem bloquear a renderizaçã o do navegador
enquanto ele está lendo e gravando valores no disco rígido. Com isso em mente, é uma boa
ideia usar armazenamento na web para quantidades muito pequenas de dados e métodos
alternativos para itens maiores.
NOTA POR QUE NÃO USAR OS WEB WORKERS PARA LER / ESCREVER ASSÍNCRONOS?
Verificação rápida
Resumo da lição
■■ O armazenamento na Web fornece um método fá cil para armazenar pares de chave /
valor de dados sem depender de um servidor.
Revisão da aula
/lesson1/page1.html ?
A. http://www2.example.com/lesson1/page1.html
B. http://www.example.com:8081/lesson1/page1.html
C. https://www.example.com/lesson1/page1.html
D. http://www.example.com/lesson2/page1.html
E. http://example.com/lesson1/page1.html
2. Qual é o limite de armazenamento da web atualmente recomendado pelo World Wide
Web Consortium (W3C)?
A. 4 KB
B. 5 MB
C. 500 MB
D. 10 MB
A. localStorage.clear ();
B. localStorage.removeAl ();
C. localStorage.abandon ();
D. localStorage.reset ();
4. Qual dos seguintes mecanismos de armazenamento tem o nível mais alto de suporte para
vá rios navegadores?
A. Armazenamento na web
B. Web SQL
C. IndexDB
D. API FileSystem
A. Indexaçã o
B. Transaçõ es
Um dos maiores desafios que você enfrentará ao trabalhar com armazenamento na web é
manter tudo sincronizado quando um usuá rio tem vá rias guias ou instâ ncias do navegador
abertas ao mesmo tempo. Por exemplo , a guia um do navegador pode ter exibido um valor
recuperado de localStorage apenas Liçã o 2: Manipulando eventos de
armazenamento CAPÍTULO 15 565
antes que essa entrada fosse atualizada na guia dois do navegador. Nesse cená rio, a guia
um nã o sabe que o valor exibido acabou de ficar desatualizado.
O W3C recomenda que os eventos nã o sejam recebidos na guia (ou janela) que fez a
alteraçã o ao trabalhar com eventos de armazenamento. Isso faz sentido porque a intençã o
é permitir que outras janelas respondam quando um valor de está gio muda. No entanto,
alguns navegadores (como as versõ es posteriores do Internet Explorer) implementaram
eventos de armazenamento de uma forma que permite que a janela de origem também
receba a notificaçã o. Só é seguro contar com essa implementaçã o se sua aplicaçã o for
direcionada especificamente a esses navegadores.
■
newValue Obtém o novo valor para entradas novas e atualizadas; será nulo ou vazio se o
evento foi disparado pelos métodos removeItem () ou clear ()
Ao contrá rio de alguns outros tipos de eventos, o evento de armazenamento nã o pode ser
cancelado em um retorno de chamada; é um meio de informar os assinantes quando ocorre
uma mudança. Também nã o borbulha como outros eventos.
Inscrever-se em eventos
alerta (e.newValue);
Para acionar este evento, execute uma operaçã o como a seguinte em uma nova guia no
mesmo site.
} outro {
alert (e.originalEvent.newValue);
Resumo da lição
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “ Respostas” no final deste capítulo.
A. oldValue
B. chave
C. changeType
D. storageArea
2. Se você modificar um valor armazenado em sessionStorage , qual dos seguintes poderia
receber notificaçõ es da mudança (se inscrito)?
A. event.returnValue = false;
B. event.preventDefault ();
C. event.stopPropagation ();
Pratica exercícios
Neste exercício, você pratica o trabalho com armazenamento na Web criando uma lista de
contatos simples que é mantida como uma matriz em localStorage . A pá gina exibirá a lista
de contatos completa em uma grade e usará um formulá rio para adicionar e editar
contatos. O pró prio site consistirá em uma ú nica pá gina; nenhuma ló gica do lado do
servidor é necessá ria. O có digo HTML e CSS já está completo, entã o seu foco está em
adicionar o JavaScript necessá rio para fazê-lo funcionar.
1. Abra o Visual Studio Express 2012 para Web. Clique em Arquivo e escolha Abrir
Projeto. Navegue até a pasta ContactBook na pasta Exercise1Start. Selecione
ContactBook.sln e clique em Abrir.
arquivo js. No elemento < bod y > há uma tabela de contatos e um formulá rio que inclui
campos para nome, sobrenome, e-mail e nú mero de telefone do contato, conforme a seguir.
<head>
</head>
<body>
<div id = "container">
<cabeçalho>
<hgroup id = "headerText">
</hgroup>
</ heade r>
<table id = "contatos">
<thead>
<tr>
<th> </th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div id = "editContact">
<div>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
*{
margem: 0;
preenchimento: 0;
display: bloco;
corpo {
cor: # 776E65;
preenchimento: 10px;
header {
altura: 20px;
#headerText {
posiçã o: absoluta;
topo: 0px;
largura: 100%;
h1 {
flutuar: esquerda;
largura: 60%;
#editar Contato {
largura: 400px;
#editContact h2 {
padding-left: 10px;
largura: 200px;
#editContact div {
largura: 350px;
preenchimento: 10px;
#editContact div.buttons {
#editContact label {
largura: 150px;
altura: 12px;
limpar: esquerda;
display: bloco;
flutuar: esquerda;
}
#editContact input {
largura: 150px;
preenchimento: 2px;
botã o {
largura: 200px;
#Contatos {
largura: 400px;
margem: 0px;
preenchimento: 0px;
#contacts thead {
cor: # 7C756D;
}
#contacts th {
margem: 0px;
Este arquivo tem uma referência à biblioteca jQuery. A seguir está uma funçã o de
documento pronto que chama a funçã o de inicializaçã o no contac tsNamespace. Na funçã o
de documento pronto está o contactsNamespace, que contém uma variá vel currentRecord e
a propriedade initialize, que é atribuída a uma funçã o vazia. O arquivo ContactsLibrary.js é
o seguinte.
contactNamespace.initialize ();
});
(funçã o () {
var ns = this.contactsNamespace;
var currentRecord;
ns .initialize = function () {
};
}) ();
A lista de contatos será armazenada como uma matriz de objetos de contato JSON, mas
lembre-se de que localStorage oferece suporte apenas ao armazenamento de valores de
string, portanto, você deve analisar o resultado como uma matriz. Você também deve lidar
com ocasiõ es em que os contatos ainda nã o existam no armazenamento.
(funçã o () {
var ns = this.contactsNamespace;
var currentRecord;
ns.initialize = function () {
};
function retrieveFromStorage () {
}) ();
6. Preencha a grade iterando a matriz de resultados e criando uma linha para cada
registro. Em cada linha, inclua três células: o endereço de e-mail, o nome completo e um
link de ediçã o que incluirá um atributo data -key para manter o índice do contato dentro da
matriz.
ns.display = function () {
bindToGrid (resultados);
};
html = html || '<tr> <td colspan = "3"> Nenhum registro disponível </td> </tr>'; $ ('#
contatos tbody'). html (html);
Você criou o link de ediçã o para cada linha; agora você cria os métodos necessá rios para
exibir os detalhes da linha selecionada.
Você chamará um método displayCurrentRecord, que criará na pró xima etapa. Seu có digo
deve ser semelhante ao seguinte.
ns.loadContact = function () {
displayCurrentRecord ();
};
10. No método bindToGrid que você criou anteriormente, adicione a seguinte linha ao final
do método.
ns.display = function () {
displayCurrentRecord ();
bindToGrid (resultados);
};
ns.save = function () {
};
13. Adicione ló gica ao final do método de salvamento que adiciona o contato à matriz se for
um novo contato ou atualiza o contato se ele já existir. Converta o objeto em um JSON
ns.save = function () {
if (currentRecord.key! = null) {
outro {
resultados.push (contato);
ns.display ();
};
14. Atualize o método de inicializaçã o para vincular o botã o Salvar e invocar o método
display ().
ns.initialize = function () {
ns.display ();
};
contactNamespace.initialize ();
});
(funçã o () {
var ns = this.contactsNamespace;
var currentRecord;
ns.initialize = function () {
ns.display ();
};
function retrieveFromStorage () {
var contatosJSON = localStorage.getItem ('contatos');
ns.display = function () {
displayCurrentRecord ();
bindToGrid (resultados);
};
html = html || '<tr> <td colspan = "3"> Nenhum registro disponível </td> </tr>'; $ ('#
contatos tbody'). html (html);
ns.loadContact = function () {
displayCurrentRecord ();
};
function displayCurrentRecord () {
if (currentRecord.key! = null) {
outro {
resultados.push (contato);
localStorage.setItem ('contatos', JSON.stringify (resultados));
ns.display ();
};
}) ();
15. Na janela Solution Explorer, clique com o botã o direito do mouse no arquivo
default.html e escolha Definir como pá gina inicial.
A Figura 15-1 mostra a pá gina da Web completa com um contato fictício adicionado.
Observe que sua lista é limpa depois que a janela do navegador é fechada.
Respostas
Lição 1
1. Resposta correta: D
A. Incorreto: o uso de um host diferente (www2 em vez de www) desabilita este URL
do acesso.
D. Correto: Como este exemplo usa a mesma origem, ele terá acesso ao mesmo espaço de
armazenamento de dados.
2. Resposta correta: B
3. Resposta correta: A
A. Correto: O método clear () remove todos os pares chave / valor existentes para a
origem.
4. Resposta correta: A
C. Incorreto: embora o IndexDB pareça estar ganhando suporte antes do Web SQL, ele
ainda nã o foi adotado pelo Safari ou por alguns dos principais navegadores mó veis.
D. Incorreto: com apenas o Chrome como seu maior defensor, a API FileSystem é a opçã o
de menor adoçã o.
Respostas CAPÍTULO 15 579
5. Resposta correta: D
Lição 2
1. Resposta correta: C
2. Resposta correta: C
3. Resposta correta: D
A. Incorreto: O event.returnValue = f alse; método é uma maneira bastante comum de
cancelar muitos eventos depois que eles começam, mas os eventos de armazenamento nã o
podem ser cancelados.
CAPÍTULO 1 6
No capítulo anterior, você aprendeu sobre a soluçã o off-line mais usada, o armazenamento
na web, mas nem sempre é a melhor ferramenta para o trabalho. À s vezes, você pode
precisar de recursos mais avançados, como suporte assíncrono verdadeiro, indexaçã o para
pesquisas mais rá pidas ou transaçõ es. Esses recursos estã o disponíveis em outros
mecanismos de armazenamento offline.
Este capítulo começa examinando uma opçã o que fornece todo o poder de um banco de
dados relacional, o Web SQL. Uma alternativa que é mais um banco de dados de objetos,
IndexedDB (Indexed Database), é abordada a seguir; ele oferece o poder de indexaçã o e
transaçõ es sem a necessidade de configurar uma estrutura relacional formal. Embora
ambas as soluçõ es sejam boas para questõ es típicas de dados, nenhuma foi projetada para
armazenamento de arquivos (como imagens, arquivos de texto, XML ou mesmo
filmes). Para essa necessidade, este capítulo discute a API FileSystem. Por ú ltimo, você verá
como tornar um site inteiro amigá vel off-line com muito pouco esforço usando o cache
HTTP do aplicativo off-line .
À medida que cada ferramenta é revisada, preste atençã o aos níveis de suporte nos
navegadores modernos de hoje, porque essa é uma consideraçã o importante ao decidir se
vai adotar a ferramenta em seu pró ximo aplicativo.
Para concluir este livro, você deve ter algum conhecimento de desenvolvimento web. Este
capítulo requer o hardware e o software listados na seçã o “Requisitos do sistema” na
Introduçã o do livro. Como nenhum navegador atual oferece suporte a todos os recursos off-
line, alguns dos exemplos requerem navegadores diferentes se você quiser seguir em frente
em seu pró prio equipamento.
581
O Web SQL é indiscutivelmente uma das opçõ es mais poderosas disponíveis para você. Ele
fornece um banco de dados relacional completo que inclui muitos dos recursos que você
passou a aproveitar com as ofertas de banco de dados do outro lado.
Antes de começar com o Web SQL, esteja ciente de que o World Wide Web Consortium
(W3C) declarou que o Web SQL nã o está mais em sua trilha de recomendaçã o. Em 2010, o
W3C Web Applications Working Group anunciou que nã o pretende manter a especificaçã o .
NOTA SUPORTE DESCONTINUADO
Para obter mais detalhes sobre a decisão do W3C de descontinuar o suporte do Web
SQL
(Consulte o Capítulo 15 para uma lista completa.) Portanto, Web SQL pode ser uma opçã o
viá vel se você estiver construindo especificamente para uma plataforma como iOS para
iPad ou iPhone. Outro uso comum é em extensõ es do Google Chrome. Se você estiver
construindo um aplicativo independente de navegador, considere uma das outras soluçõ es
de armazenamento offline.
Se você planeja desenvolver com Web SQL, pode ser uma boa ideia lembrar quais
alternativas estã o disponíveis (como IndexedDB) e qual nível de esforço pode ser
necessá rio se outros fornecedores de navegador decidirem abandoná - lo no futuro.
Nas seçõ es a seguir, examine a sintaxe usada para criar ou abrir um banco de dados, iniciar
uma transaçã o e executar um comando SQL. A maioria desses comandos deve parecer
muito familiar se você tiver usado outros bancos de dados relacionais.
■■ nome O nome do banco de dados, que diferencia maiú sculas de minú sculas. A maioria
dos personagens sã o permitidos; mesmo uma string vazia é considerada vá lida.
■■ versão Versão esperada do banco de dados. Se uma string vazia for passada, está
implícito que qualquer versã o que exista atualmente está bem.
■■ creationCallba ck Se o banco de dados ainda nã o existe e está sendo criado, este cal -
back será invocado. É opcional e nã o é necessá rio que o banco de dados seja criado e com
controle de versã o corretamente.
var db = openDatabase ('Biblioteca', '1.0', 'Minha biblioteca', 5 * 1024 * 1024); Se você está
familiarizado com conexõ es de banco de dados tradicionais, pode estar esperando a
necessidade de fechar uma conexã o. Com o Web SQL, no entanto, isso é feito
automaticamente, entã o você nã o precisa fechar a conexã o manualmente.
Conforme seu aplicativo cresce, seus requisitos de dados mudam. Pode ser necessá rio
adicionar novas tabelas, eliminar as existentes ou até mesmo alterar colunas específicas. O
objeto Banco de Dados fornece os seguintes ganchos para fazer essas alteraçõ es.
Você pode adicionar uma tabela de autores ao banco de dados da Biblioteca criado
anteriormente. Você precisa de um método de retorno que aceite um objeto de transaçã o,
que execute o script CREATE TABLE. O objeto de transaçã o permite vá rias açõ es dentro
dele e automaticamente reverte todas as alteraçõ es se alguma falhar. Por enquanto, este
exemplo mantém a ideia simples, adicionando apenas uma tabela.
"firstName TEXT," +
"lastName TEXT," +
function onSuccess () {
Agora que a migraçã o foi aplicada, você tem uma nova tabela em seu banco de dados com
as seguintes colunas.
Usando transações
Agora que você possui um esquema, pode usar transaçõ es para executar instruçõ es
SQL. Para fazer isso, o objeto Banco de Dados fornece os dois métodos a seguir.
O método cal back receberá um objeto de transaçã o que inclui um método executeSql para
realizar alteraçõ es de dados. Possui os seguintes parâ metros.
Na pró xima seçã o, você verá como pode usar transaçõ es para executar alguns dos
comandos SQL mais comumente usados.
});
No entanto, em geral, é uma boa ideia usar parâ metros SQL ao trabalhar com SQL
dinâ mico. A instruçã o anterior pode ser reescrita para aproveitar as vantagens de um
segundo parâ metro opcional no método executeSql, que aceita uma matriz de valores de
campo. Observe o uso de pontos de interrogaçã o para indicar que o valor será preenchido a
partir da matriz que está sendo passada.
});
Você pode dar um passo adiante adicionando um cal de volta ao método executeSql, que
permite capturar o Id da linha recém-criada.
, itemInserted);
});
, [lastName, authorId]);
});
Excluindo um registro
});
Conforme o método displayResults itera pelas linhas, ele formata o nome da pessoa em um
item da lista e o adiciona a uma lista nã o ordenada com um id de itens. Para acessar os
valores de colunas individuais dentro da linha, use a notaçã o de ponto, que lê cada um
como uma propriedade do objeto.
});
Como você está apenas recuperando dados, com a mesma facilidade poderia ter usado o
método readTransaction em vez do método de transaçã o.
Verificação rápida
Resultados de filtragem
Você raramente deseja ler todas as linhas de uma tabela de banco de dados; na maioria das
vezes, você precisa limitar esses resultados a critérios específicos. Como as
implementaçõ es atuais sã o baseadas em SQLite, você tem todo o poder de um mecanismo
de banco de dados maduro para ajudá -lo.
Por exemplo , você pode adicionar uma clá usula WHERE para retornar apenas registros
com um valor lastName específico, como segue.
});
Você pode querer encontrar todos os autores cujo sobrenome comece com a letra D. Para
fazer isso, use a palavra-chave LIKE junto com o curinga '%'.
displayResults)
});
Web SQL inclui suporte para instruçõ es JOIN tradicionais (como INNER JOIN e LEFT
JOIN), que pode ser usado para incluir colunas de vá rias tabelas em um ú nico SELECT
demonstraçã o.
Suponha que você adicionou uma tabela de livros ao banco de dados de sua biblioteca e
agora gostaria de modificar sua consulta anterior para incluir o título de cada livro nos
resultados.
, [sobrenome]
, displayResults)
});
Funções de agregação
Outro recurso ú til do Web SQL é a capacidade de agrupar resultados, o que permite o uso
de funçõ es mais avançadas, como COUNT (x), MIN (x), MAX (x) e SUM (x) em seu SELECT
declaraçõ es. Por exemplo, o seguinte é uma nova consulta que encontra o nú mero de livros
escritos por cada autor.
db.transaction (function (t) {
, []
, displayResults)
});
Resumo da lição
■■ O World Wide Web Consortium (W3C) declarou que a especificaçã o Web SQL nã o está
mais em sua trilha de recomendaçã o. Ele ainda pode ser usado para almejar plataformas
específicas que têm suporte contínuo, mas outras opçõ es, como IndexedDB e
armazenamento na web, devem ser consideradas quando possível.
■■ Web SQL oferece suporte a uma sintaxe SQL comum para operaçõ es de criaçã o,
recuperaçã o, atualizaçã o e exclusã o (CRUD) .
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es sobre por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Qual das opçõ es a seguir seria uma boa candidata para Web SQL?
A. t.executeSql (“INSERT INTO books (title) VALUES (?)”, [“A Tale of Two
Cities” ]); B. t.executeSql (“INSERT INTO books (title) VALUES ([0])”, [“A Tale of Two
Cities”]); C. t.executeSql (“INSERT INTO books (title) VALUES ([1])”, [“A Tale of Two
Cities”]); D. t.executeSql (“INSERT INTO books (title) VALUES ({0})”, [“A Tale of Two
Cities”]); Les son 2: Trabalhando com IndexedDB
Até agora, você viu dois extremos para o armazenamento de dados do lado do cliente. O
armazenamento na Web fornece um modelo de persistência de chave / valor simples, mas
carece de alguns dos recursos que sã o importantes ao trabalhar com um banco de dados. O
outro extremo, Web SQ L, fornece muitos dos recursos associados a um banco de dados
relacional totalmente funcional, mas traz consigo todo o trabalho manual necessá rio para
configurar e manter a estrutura de persistência.
lojas. Muito parecido com o Web SQL, a interface com o banco de dados é baseada em
transaçõ es e requer esforço mínimo.
Para trabalhar com IndexedDB, você precisa usar métodos que podem conter prefixos
específicos do navegador devido ao desenvolvimento contínuo da especificaçã o. Para
tornar seus exemplos compatíveis com diferentes navegadores, inclua a correçã o a seguir
no início de seus scripts para evitar a necessidade de colocar ló gica específica do navegador
em cada um de seus métodos. Todos os exemplos subsequentes serã o baseados neste
có digo.
|| window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction
|| window.webkitIDBTransaction; window.IDBCursor = window.IDBCursor
|| window.webkitIDBCursor;
A primeira etapa para trabalhar com IndexedDB é criar e abrir um banco de dados. Você
precisa acessar o objeto indexedDB do navegador, que, no exemplo anterior, foi atribuído a
uma variá vel consistente .
Esta variá vel indexedDB é um objeto IDBFactory que fornece acesso aos seus bancos de
dados por meio do método aberto, que possui os seguintes parâ metros.
evento onerror que pode notificar seu aplicativo se ocorrer um erro durante uma tentativa
de conexã o. O exemplo a seguir mostra o método aberto.
db = openRequest.result;
};
};
Antes de criar um novo armazenamento de objeto, você precisa entender como IndexedDB
lida com a versã o.
Nesta chamada para abrir uma conexã o de banco de dados, um nú mero de versã o é
passado como o segundo parâ metro. O objeto de solicitaçã o recebido contém um evento
onupgradeneeded que será acionado se a versã o solicitada nã o corresponder à versã o atual
do banco de dados existente. Ele também será acionado se o banco de dados ainda nã o
existir. O evento onupgradeneeded será disparado antes do evento onsuccess.
response.curren tTarget.result.createObjectStore ("autores",
};
Você poderia usar o seguinte exemplo de có digo se cada autor tivesse um e-mail que você
gostaria de usar como chave.
Embora a chave seja o índice primá rio para armazenamentos de objetos, você pode
especificar outros índices.
Isso pode fornecer um aumento de desempenho se outras propriedades além da chave
puderem ser comumente usadas na classificaçã o ou filtragem. Para fazer isso, use o método
createIndex no armazenamento de objeto, que possui os seguintes parâ metros.
};
Removendo índices
Se decidir que um índice nã o é mais necessá rio, você pode removê-lo criando uma
migraçã o de banco de dados que usa o método deleteIndex () do armazenamento de
objeto , conforme mostrado no có digo de exemplo a seguir.
};
response.currentTarget.result.deleteObjectStore ("autores");
};
Usando TRANSAC ções
Quando seus armazenamentos de objeto estã o no lugar, você deve usar o objeto
IDBTransaction para adicionar ou remover objetos. Um objeto IDBTransaction, que é uma
transaçã o, é criado usando o método de transaçã o do objeto de banco de dados e leva os
seguintes parâ metros .
Apó s a criaçã o de uma instâ ncia de transaçã o , você pode usá -la para adicionar um novo
registro. Para fazer isso, você deve primeiro encontrar o armazenamento de objeto ao qual
deseja adicionar o registro. Chame o método add do armazenamento de objeto, que irá
inserir o registro de forma assíncrona. O método add retorna uma instâ ncia reques t na
qual você pode se inscrever em um evento onsuccess que fornece uma notificaçã o quando a
operaçã o é concluída. Você pode entã o usar a propriedade request.result para obter o id
gerado automaticamente para o novo registro. Você também pode assinar o onerror e vent
se a operaçã o falhar, conforme mostrado no exemplo a seguir.
var db;
db = openRequest.result;
addAuthor ();
};
function addAuthor () {
};
var db;
db = openRequest.result;
updateAuthor ();
};
function updateAuthor () {
};
}
O exemplo anterior atualiza o nome e o sobrenome do registro do autor com uma chave de
1.
Excluindo um registro
Para remover um objeto armazenado, você só precisa saber seu valor de chave, que é
passado para o método delete do armazenamento de objeto.
function deleteAuthor () {
Recuperando um registro
var db;
db = openRequest.result;
getAuthor ();
};
function getAuthor () {
};
Compreendendo os cursores
A outra abordagem para localizar registros é usando cursores. Um cursor pode ser aberto
chamando o método openCursor do armazenamento de objetos, que retorna um objeto de
solicitaçã o e aceita os seguintes parâ metros.
■■ intervalo Este parâ metro permite que você forneça um intervalo de chaves para limitar
os registros incluídos nos resultados.
A seguir está um exemplo simples que itera por meio de todos os registros mantidos no
armazenamento de objeto de autores.
var db;
findAuthors ();
};
function findAuthors () {
if (! cursor) {
Retorna;
};
manipulador novamente, desta vez com o pró ximo registro nos resultados. Ao chegar ao
final da coleçã o, o evento de sucesso terá um cursor nulo.
Cursores de indexação
O seguinte é uma versã o modificada do método findAuthors, que cria um cursor contra o
índice lastName em vez de ir diretamente contra o armazenamento de objeto. A ordem de
classificaçã o é especificada como IDBCursor.PREV, portanto , o resultado do autor é
classificado pelo sobrenome em ordem decrescente.
function findAuthors () {
if (! cursor) {
Retorna;
alert ('Index value (lastName):' + cursor.key
+ 'Nome:' + cursor.value.firstName);
cursor.continue ();
};
A seguir está uma lista dos vá rios métodos de intervalo disponíveis por meio do objeto
IDBKeyRange.
■■ limite O tipo de intervalo mais flexível é o método de limite, pelo qual você especifica os
limites superior e inferior e especifica se os limites externos devem ser incluídos nos
resultados. O método de intervalo limitado aceita os parâ metros a seguir.
A seguir estã o alguns resultados em cená rios quando os intervalos sã o aplicados a esse
índice.
conteúdo dos autores: Daniel Defoe, Herman Melvil e, Mark Twain, Júlio
Verne index.openCursor (IDBKey Range.bound ('Defoe', 'Verne', falso, falso)); resultados:
Daniel Defoe, Herman Melvil e, Mark Twain, Júlio Verne index.openCursor
(IDBKeyRange.bound ('Defoe', 'Verne', falso, verdadeiro)); resultados: Daniel Defoe, Herman
Melvil e, Mark Twain
■■ upperBound O método upperBound permite que você limite apenas o lado superior do
intervalo. A seguir estã o os parâ metros do método upperBound.
conteú do dos autores: Daniel Defoe, Herman Melville, Mark Twain, Jú lio Verne
index.openCursor (IDBKeyRange.upperBound ('Verne', falso));
conteú do dos autores: Daniel Defoe, Herman Melville, Mark Twain, Jules Ve rne
index.openCursor (IDBKeyRange.lowerBound ('Defoe', false));
resultados: Daniel Defoe, Herman Melvil e, Mark Twain, Júlio Verne 598 CAPÍTULO
16 Aplicativos da web off-line
conteú do dos autores: Daniel Defoe, H erman Melville, Mark Twain, Jú lio Verne
index.openCursor (IDBKeyRange.only ('Twain'));
Resumo da lição
■■ Cada armazenamento de objeto tem um caminho de chave designado que identifica sua
chave.
■■ Em vez de uma propriedade no valor do objeto, uma chave pode ser criada por meio de
um gerador de chave, como autoIncrement, que cria um identificador numérico distinto
à medida que novos registros sã o adicionados.
■■ Índices podem ser criados para propriedades diferentes da chave que pode ser
comumente usada para classificaçã o ou filtragem.
■■ Todas as operaçõ es sã o realizadas por meio de transaçõ es, que podem ser somente
leitura ou leitura /
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
A. Transaçõ es
B. Cursores
C. Indexado
D. SQL
2. Qual é o método correto para criar uma transaçã o que adicionará um novo registro?
A. get (chave)
B. encontrar (chave)
D. primeiro (chave)
HTML5 tem uma soluçã o: a API FileSystem. Usando a API FileSystem, você pode criar
diretó rios e arquivos em um local em á rea restrita no sistema de arquivos do usuá rio, e isso
abre a porta para uma série de novos recursos que antes eram limitados a aplicativos de
desktop .
Nesta liçã o, você aprenderá a usar a API FileSystem para realizar tarefas comuns, como
criar e ler arquivos. Embora a liçã o nã o cubra todos os recursos disponíveis, você deve
obter uma compreensã o de alto nível do que essa tecnologia oferece .
No momento em que este livro foi escrito, o ú nico navegador importante que suporta a API
FileSystem é o Chrome, entã o você pode querer instalá -lo se quiser seguir os exemplos. Nã o
se sabe se outros navegadores estã o planejando adicionar suporte no futuro.
Devido ao seu suporte limitado ao navegador, os aplicativos mais comuns para aproveitar
as vantagens da API FileSystem sã o aqueles direcionados ao Chrome, como as extensõ es do
Chrome.
O objeto de janela JavaScript contém um método para fazer solicitaçõ es para abrir
a comunicaçã o com o sistema de arquivos. Dependendo da versã o do Chrome que você
instalou, pode ser window.requestFileSystem () ou window.webkitRequestFileSystem
(). Para tornar os exemplos a seguir tã o compatíveis quanto possível, o fragmento a
seguir está no topo dos scripts subsequentes.
window.requestFileSystem = window.requestFileSystem ||
window.webkitRequestFileSystem;
O método requestFileSystem opera de forma assíncrona e inclui calbacks de sucesso e erro
que fornecem notificaçã o de que o aplicativo pode começar a ler e gravar arquivos.
■■ tipo Este parâ metro especifica se o sistema de arquivos deve ser temporá rio ou
permanente. Se for temporá rio, você passa TEMPORARY como o argumento e o
navegador remove automaticamente os arquivos que precisam de espaço. Se passar em
PERSISTENT, os arquivos sã o retirados somente quando solicitado pelo aplicativo ou
usuá rio.
■■ tamanho Este parâ metro é uma estimativa do tamanho (em bytes) que o aplicativo
precisará .
Para criar um arquivo, você deve primeiro ter um objeto DirectoryEntry para que tenha
um local alocado para colocar o arquivo. O argumento FileSystem passado para successCal
de volta inclui um DirectoryEntry especial como uma propriedade chamada root, que
aponta para a raiz do sistema de arquivos reservado especificamente para o aplicativo
(origem). Posteriormente nesta liçã o , você aprenderá como criar um subdiretó rio sob o
root. Por enquanto, você cria um novo arquivo neste local.
Um objeto DirectoryEntry tem um método getFile que pode criar novos arquivos e ler
aqueles que já existem. A seguir estã o os parâ metros do método getFile.
■■ opções Permite dois sinalizadores, criar e exclusivo, que indicam como o arquivo deve
ser aberto. Se o arquivo nã o existir, create deve ser definido como true ou um erro será
gerado. Se ambos criar e exclusivo estiverem definidos como verdadeiros, será feita uma
tentativa de criar o arquivo, mas ocorrerá um erro se o arquivo já existir.
Gravando em um arquivo
Quando você tem acesso a um objeto FileEntry, pode criar um FileWriter, que mantém os
dados no arquivo aberto. Isso é feito usando seu método de gravaçã o, que aceita um
parâ metro de dados de objeto biná rio grande (BLOB).
}
Se você estivesse abrindo um arquivo existente e quisesse acrescentar novos dados ao final
do arquivo, usaria o método de busca para apontar o cursor para o final do arquivo,
conforme a seguir.
fileWriter.seek (fileWriter.length);
Lendo um arquivo
O objeto FileEntry também possui um método file, que o faz retornar um objeto File. Depois
de ter uma referência a um objeto File, você pode lê-la usando o objeto
FileReader. Semelhante ao FileWriter, você deve definir seus backs onloadend e onerror cal
antes de fazer uma tentativa de leitura.
O exemplo a seguir usa o método readAsText para ler o conteú do do arquivo e armazená -lo
em uma string que pode ser acessada no valor this.result no retorno de chamada
onloadend.
Excluindo um arquivo
A ú ltima operaçã o de arquivo abordada nesta seçã o é a exclusã o de um arquivo. Como as
outras operaçõ es, isso requer um objeto FileEntry. Como o objeto FileEntry é herdado do
objeto Entry, ele possui um método de remoçã o para remover a si mesmo do sistema de
arquivos. Ele aceita uma chamada de retorno successCal e uma chamada de
retorno onError, conforme demonstrado no exemplo a seguir.
function fileRemoved () {
alerta ('Sucesso');
Trabalhar com diretó rios na API FileSystem é muito semelhante a trabalhar com
arquivos. Por exemplo, para abrir ou criar um arquivo, use o método getFile. Para fazer o
mesmo com um diretó rio, use o método getDirectory.
O exemplo a seguir cria uma nova diretriz chamada “Capítulo 16”. Se for criado com
sucesso y, seu caminho completo será exibido.
Você aprendeu a adicionar um arquivo ao diretó rio raiz do sistema de arquivos do seu
aplicativo. O exemplo a seguir grava o arquivo em um novo subdiretó rio.
fileWriter.seek (fileWriter.length);
Excluindo um diretório
function directoryRemoved () {
alerta ('Sucesso');
Para excluir um diretó rio forçosamente, junto com qualquer conteú do sob ele em
subdiretó rios e arquivos, use o método removeRecursively como a seguir.
L resumo Lição
■■ Você pode usar a API do sistema de arquivos para armazenar arquivos biná rios no
sistema de arquivos do cliente.
■■ Chrome é atualmente o ú nico navegador importante com suporte para API de sistema
de arquivos.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Qual dos métodos a seguir você deve usar ao armazenar arquivos que sã o relativamente
sem importâ ncia e podem ser removidos se o navegador estiver com pouco espaço
disponível?
2. Qual das opçõ es a seguir permite que o FileWriter anexe dados ao final do arquivo?
A. fileWriter.seek (fileWriter.length);
B. fileWriter.seek (fileWriter.end);
C. fileWriter.moveLast ()
D. fileWriter.moveToEnd ();
3. Qual das seguintes opçõ es remove um diretó rio que contém arquivos existentes?
A. directoryEntry.remove (directoryRemoved,
handleError); B. directoryEntry.removeRecursively (directoryRemoved,
handleError); C. directoryEntry.removeAl (directoryRemoved,
handleError); D. directoryEntry.remove (directoryRemoved, ALL, handleError) Lição 4:
Trabalhando com o aplicativo HTTP offline
esconderijo
Você aprendeu sobre vá rios recursos que fornecem a oportunidade de armazenar pares de
chave / valor, elementos de dados estruturados, objetos e arquivos. No entanto, nenhum
deles sozinho permite que seu aplicativo opere offline facilmente. Suponha que você tenha
um aplicativo da web dinâ mico que obtém todos os seus dados de uma instâ ncia
IndexedDB local, mas ainda precisa recuperar itens como arquivos CSS, arquivos
JavaScript, imagens e a pró pria pá gina da web. Até certo ponto, você já tem esse recurso
por meio do cache do navegador, mas ele sempre foi pouco confiá vel e nã o poderia
funcionar verdadeiramente sem uma conexã o de rede.
O aplicativo pode funcionar nos bastidores para manter o cache local atualizado conforme
o arquivo de manifesto é atualizado. Se você perder a conexã o com a Internet e o navegador
for colocado off-line, ele mudará automaticamente para servir arquivos locais.
Suporte de navegador
O cache do aplicativo agora é compatível com a versã o mais recente de todos os principais
navegadores. O Internet Explorer é o mais recente a adicionar suporte com o lançamento
do Internet Explorer 10. Também é compatível com a maioria dos navegadores mó veis, o
que pode torná -lo muito ú til quando os serviços de dados cel ular nã o estã o disponíveis.
resposta. O pró prio arquivo pode residir em qualquer lugar em seu servidor web, como /
home / manifest ”ou
“/Manifest.appcache. Se você escolher usar uma referência de arquivo está tico, pode ser
necessá rio configurar o tipo MIME no Internet Information Server (IIS) primeiro ou
adicionar um el emento mimeMap ao arquivo web.config do seu aplicativo da seguinte
forma.
<system.webServer>
<staticContent>
</staticContent>
</system.webServer>
Para incluir o arquivo de manifesto em seu aplicativo, ele deve ser referenciado usando o
atributo de manifesto no elemento < html > da pá gina, conforme a seguir.
Este exemplo faz referência ao arquivo de manifesto usando uma URL ar elativa, mas você
pode usar uma URL absoluta, desde que seja parte da mesma origem, como a seguir.
Você aprendeu como fazer referência a um arquivo de manifesto e que deve ser
servido com o texto /
MANIFESTO DE CACHE
# versã o 1.0
CACHE:
/Content/Styles/Site.css
http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js
REDE:
/Conecte-se/
/ API /
# Arquivos alternativos
■■ CACHE Esta seçã o contém todos os itens que você deseja armazenar em cache
explicitamente. Os URLs dentro dele podem ser totalmente qualificados ou relativos à
localizaçã o do arquivo de manifesto. Você também pode listar esses arquivos diretamente
no cabeçalho CACHE MANIFEST.
■■ REDE Esta seçã o contém URLs listados e que requerem uma conexã o. Esses arquivos
nã o serã o incluídos no cache, portanto, nã o estarã o disponíveis off-line. No exemplo, a
seçã o / API / do site é especificada porque essa á rea contém serviços que só podem
funcionar quando uma conexã o de rede está disponível.
■■ FALLBACK A ú ltima seçã o permite que você especifique arquivos substitutos que você
nã o deseja armazenar em cache por qualquer motivo, mas gostaria que algo fosse usado em
seu lugar.
Atualizando o cache
Quando uma alteraçã o é feita no arquivo de manifesto, o navegador é acionado para baixar
todos os arquivos listados nele. Ele faz isso de forma assíncrona nos bastidores, portanto ,
nã o bloqueará a renderizaçã o da pá gina exibida.
Depois que o navegador armazena em cache os recursos listados no arquivo de manifesto,
esses arquivos sã o mantidos até que ocorra uma das seguintes situaçõ es.
Uma mudança em um recurso em si nã o faz com que ele seja atualizado automaticamente
dentro do cache, entã o pode ser muito fá cil para o cache se tornar
obsoleto. Uma prá tica comum é incluir um nú mero de versã o ou carimbo de data / hora
como uma linha de comentá rio que é atualizada com cada implementaçã o do aplicativo da
web conforme a seguir.
MANIFESTO DE CACHE
# versã o 1.0
Verificação rápida
Resposta rápida
Entendendo eventos
Conforme o navegador executa cada etapa do processo de cache, ele dispara uma série de
eventos no objeto applicationCache. A seguir, um resumo dessas vésperas .
■■ updateReady Se um cache existente foi atualizado, este evento será disparado para
informar que todos os arquivos foram baixados.
■■ erro A construçã o do cache pode falhar por vá rios motivos, como um URL de recurso
invá lido listado no manifesto. Se o processo falhar, o evento de erro será disparado.
O objeto applicationCache inclui um método update () que pode ser usado para iniciar o
processo de cache de forma programá tica, conforme a seguir.
window.applicationCache.update ();
Apó s o download do novo cache e o disparo do evento updateReady, você pode chamar o
método swapCache para substituir o cache antigo pelo novo, como a seguir.
window.applicationCache.addEventListener ('updateready',
Resumo da lição
■■ Os itens que podem operar apenas quando uma conexã o de rede está presente devem
ser listados na seçã o REDE do arquivo de manifesto.
■■ A seçã o FALLBACK do arquivo de manifesto fornece um local para designar
substituiçõ es de arquivo quando no modo offline.
Revisão da aula
Responda à s seguintes perguntas para testar seu conhecimento das informaçõ es desta
liçã o. Você pode encontrar as respostas a essas perguntas e explicaçõ es de por que cada
escolha de resposta está correta ou incorreta na seçã o “Respostas” no final deste capítulo.
1. Qual das seguintes é uma declaraçã o vá lida para a primeira linha de um arquivo de
manifesto?
A. CACHE
B. MANIFESTO DE CACHE
C. CACHE-MANIFEST
D. CACHE-SEWAYS
2. Qual evento é disparado depois que um cache existente foi atualizado com novos
recursos?
A. baixando
B. em cache
C. updateReady
D. completado
Pratica exercícios
1. Abra o Visual Studio Express 2012 para Web. Clique em Arquivo e escolha Abrir
Projeto. Selecione a pasta ContactBook na pasta Exercise1Start e, em seguida, selecione
ContactBook.
2. Os nomes das variá veis IndexedD B com as quais você precisará trabalhar variam em
diferentes navegadores. Lide com essas diferenças adicionando o seguinte ao início do
arquivo ContactsLibrary.js.
window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction
|| window.webkitIDBTransaction; window.IDBCursor = window.IDBCursor
|| window.webkitIDBCursor;
3. Prepare-se para adicionar uma instâ ncia de banco de dados que seja acessível a todos os
métodos no namespace por meio de uma variá vel db no início da funçã o de expressã o de
funçã o imediatamente chamada (IIFE).
var ns = this.contactsNamespace;
var db;
var currentRecord;
ns.initialize = function () {
};
db = solicitaçã o.resultado;
ns.display ();
};
};
ns.save = function () {
: contatos.add (contato);
ns.display ();
};
};
Carregar a lista de contatos requer o uso de um cursor para iterar e construir uma matriz
de resultados. No capítulo anterior, a variá vel de resultados era uma matriz simples de
registros de contato. Em contraste, esse có digo cria uma matriz de objetos que contém a
chave do objeto e a instâ ncia do contato. Depois que curs ou passar do final do conjunto de
dados, seu objeto de resultado será nulo.
6. No ponto nulo do objeto de resultado, chame o método bindToGrid conforme a seguir.
ns.display = function () {
displayCurrentRecord ();
if (! cursor) {
bindToGrid (resultados);
Retorna;
};
};
7. O método loadContact agora pode ser alterado para usar o método get do
armazenamento de objeto para encontrar o registro selecionado por sua chave, como a
seguir.
ns.loadContact = function () {
displayCurrentRecord ();
};
};
html = html || '<tr> <td colspan = "3"> Nenhum registro disponível </td> </tr>'; $ ('#
contatos tbody'). html (html);
webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction
|| window.webkitIDBTransaction; window.IDBCursor = window.IDBCursor
|| window.webkitIDBCursor;
contactNamespace.initialize ();
});
(funçã o () {
var ns = this.contactsNamespace;
var db;
var currentRecord;
ns.initialize = function () {
};
db = solicitaçã o.resultado;
ns.display ();
};
614 CAPÍTULO 16 Aplicativos da web off-line
};
function retrieveFromStorage () {
ns.display = function () {
displayCurrentRecord ();
if (! cursor) {
bindToGrid (resultados);
Retorna;
};
html = html || '<tr> <td colspan = "3"> Nenhum registro disponível </td> </tr>'; $ ('#
contatos tbody'). html (html);
ns.loadContact = function () {
displayCurrentRecord ();
};
};
function displayCurrentRecord () {
ns.save = function () {
: contatos.add (contato);
ns.display ();
};
};
}) ();
8. Na janela Solution Explorer, clique com o botã o direito do mouse no arquivo default.html
e escolha Definir como pá gina inicial.
■■ Exercício 2: Converta o aplicativo de catá logo de contatos para usar Web SQL em vez
de IndexedDB. Certifique-se de usar um navegador que suporte Web SQL, como Chrome ou
Safari.
Lição 1
1. Resposta correta: A
2. Resposta correta: D
B. Incorreto: um novo banco de dados nã o pode ser criado instanciando uma instâ ncia da
classe Database.
D. Correto: O comando openDatabase () é usado para bancos de dados novos e existentes.
3. Resposta correta: A
Lição 2
1. Resposta correta: D
A. Incorreto: as transaçõ es sã o suportadas por IndexedDB.
Respostas CAPÍTULO 16 617
2. Resposta correta: B
B. Correto: as transaçõ es devem estar no modo leitura e gravaçã o para adicionar um novo
registro.
Isso faria com que uma exceçã o fosse lançada se uma tentativa de adicionar um novo
registro fosse feita.
3. Resposta correta : A
Lição 3
1. Resposta correta: D
2. Resposta correta: A
A. Correto: o método seek () move o cursor para o local fornecido, que neste caso será o
final do arquivo porque você está passando o comprimento do arquivo inteiro.
3. Resposta correta: B
A. Incorreto: O método remove pode ser usado apenas para diretó rios que estã o vazios . Se
um arquivo ou subdiretó rio existir em um directorty, um erro será gerado.
Lição 4
1. Resposta correta: B
2. Resposta correta: C
A. Incorreto: o evento de download é disparado enquanto o navegador está baixando novo
conteú do.
Respostas CAPÍTULO 16 619
Índice
Símbolos
'(aspas simples), 69
UMA
© (copyright), 41
< Uma > elemento
descrito, 32
elemento < dfn > e, 218
/ (barra), 337
símbolo # (hash)
seletores de id e, 146
hiperlinks internos e, 46
elemento < acrônimo >, 214
! === operador, 84
operador ===, 84
() (parênteses), 68-69
® (marca registrada) , 41
621
operadores aritméticos, 68
mó dulos agregados, 348
Objeto Array
descrito, 368-369
atributo alt
elemento < area > , 49
elemento < img >, 47-48
método reverse (), 111
objeto applicationCache
matrizes
condensado, 109
criando, 108-109
idades (Node.js)
descrito, 108
serviços da web arbitrá rios, 364, 366
literal, 109
arcos
povoando, 108-109
prancheta (Mistura), 15
elemento < area >
elemento < aparte >
atributo alt, 49
atributo coords, 49
elemento < figura > e, 219
descrito, 32
atributo href, 49
ASP.NET
atributo de forma, 49
622
Mistura para Visual Studio 2012
operaçõ es assíncronas
atributo autoplay
descrito, 393
elemento < áudio >, 445
elemento < video >, 441
406, 413-414
< b > elemento
de navegadores, 30
atributos
do CSS3, 138
elemento < base >, 33, 38
costume, 39
elemento < bb >, 33
descrito, 35
elemento < bdo >, 33
expando, 39
global, 37
elemento < audio >
configurando, 445-446
descrito, 32, 443-445
prancheta, 15
elemento < source > e, 445
descrito, 13-16
descrito, 443-444
623
elemento <blockquote>
navegadores
elemento < blockquote >
elemento < body >
Consideraçõ es sobre JavaScript, 101-102
contexto aninhado, 34
descrito, 9, 33
tag < objeto > e, 51
Atributos booleanos
forma minimizada, 36
Objeto booleano, 67
descrito, 67, 70
propriedades de fronteira, 176-178
descrito, 175-176
< botão > elemento
desabilitando, 36
< Br > elemento
atributo de tipo, 317
pontos de interrupçã o
Instruçã o CACHE MANIFEST, 609
624
cascateando instruções if
funçõ es de chamada, 74
elemento < canvas >
implementaçã o, 462-463
479
Objeto CanvasRenderingContext2D
descrito, 460
625
Lençó is)
blocos de có digo, 74
loops de có digo
para tags, 32
descrito, 84
do loop, 85
bloco de captura, 87
declaraçõ es if encadeadas, 81
elemento < col >
descrito, 33
atributo booleano verificado , 36
Caracteres chineses , 220-221
seletor de cores, 4
elemento < círculo >
cores. Ver cores CSS
atributo colspan
descrito, 498
elemento < td >, 238-240
elemento < command >, 33, 38
atributo r, 498
comentá rios
adicionando, 39
adicionando condicional, 40
citar atributo
elemento < blockquote >, 215
TODO, 7
elemento < q >, 215
CommonJS, 394
comunicaçõ es
atributo global de classe, 37
assíncrono, 393-414
web, 312-316
Aulas
WebSocket, 415-436
criando, 266-271
descrito, 262
elemento < limpar >, 189-190
programaçã o condicional
626
Propriedades CSS
copyright (©), 41
construtos, 262
incorporaçã o de conteú do
descrito, 175-176
descrito, 44
sandboxing, 45
objeto de contexto. Veja CanvasRenderingContext2D
objeto
herança e, 162-163
atributo de controles
elemento < áudio >, 445
193–194, 202–204
biscoitos
trabalhando com estilos importantes, 159-160
Cores CSS
descrito, 556-557
descrito, 166
Objeto de coordenadas
descrito, 540-541
transparência , 172
Propriedades CSS
CSS3
descrito, 165
transparência, 172
dados
descrito, 67
CSS3
descrito, 583
descrito, 137-139
elemento < datagrid >, 33
herança e, 162-163
elemento < datalist >, 33
Objeto DataTransfer
cursores
Objeto de data, 67
descrito, 596-597
indexaçã o, 597
abertura, 596
atributos personalizados, 39
cerca de 103
628
elemento < div >
arquivo default.html
Configuraçã o QUnit, 91
arquivo default.js
elemento < figura > e, 219
Olá , exemplo mundial, 92
localizaçã o de, 7
posicionamento, 178-186
elemento < tabela > e, 230
deletando
do loop, 85
arquivos, 604
objeto de documento
cerca de 112
elemento < diálogo >, 33
diretó rios
criando, 604 -605
descrito, 112
exclusã o, 605-606
navegando, 112-114
abertura, 604-605
elementos < script > e, 103
Objeto DirectoryEntry
descrito, 112
629
notação de ponto
navegando, 112-114
elementos < script > e, 103
descrito, 459
descrito, 507
502, 506
536-537
460-494
desenhando arcos
Especificaçã o ECMA-262, 66
ECMAScript, 66
estado de desenho
elementos
configurando, 465-474
descrito, 32-35
atributos expando, 39
flutuante, 186-189
descrito, 475
630
idioma, 220-221
sequências de escape, 69
tags e, 32
ouvintes de eventos, 295
vazio, 38-39
Objeto de evento
descrito, 114
eventos
elemento < embed >
cancelando, 567
descrito, 33
descrito, 114
atributo de altura, 50
sessionStora ge e, 568
atributo src, 50
atributo de tipo, 50
510-513
encapsulamento
descrito, 262-263
implementaçã o, 268-269
atributos expando, 39
& entity_name ;, 41
& # entity_number ;, 41
descrito, 354
Manipulaçã o de erros
expressõ es
descrito, 67
funçã o, 75
631
descrito, 141
arquivos
criando, 602
excluindo, 604
abertura, 602
leitura, 603-604
API Filesystem
elemento < fieldset >, 33
elemento < figcaption >, 219
elemento < figura >
elemento < aparte > e, 219
elemento < div > e, 219
Objeto FileWriter
descrito, 603-604
Objeto de arquivo
descrito, 517-521
preencher atributo
elemento < círculo >, 498
Elemento < caminho >, 496
propriedade de tipo, 517
bloco y final, 87
Objeto FileEntry
Objeto FileReader
descrito, 603
632
API de geolocalização
331, 338-339
pai, 319
elemento < rodapé >
elemento < cite > e, 215
serializando, 321
elemento < form >
validando, 324-330
descrito, 33
expressõ es de funçã o, 75
Objeto de funçã o, 67
elemento < objeto >, 51
agregando, 588
embutido, 76-77
construtor, 266-271
descrito, 316-318
declarando, 74, 78
descrito, 67, 73
aninhamento, 78
formatando texto
valores de retorno, 73
formulá rios
API de geolocalizaçã o
descrito, 311-312
descrito, 539
eventos desencadeados por, 118
633
Objeto de geolocalização
Objeto de geolocalizaçã o
elemento < h1 >, 33
elemento < h2 >, 33
elemento < h3 >, 33
elemento < h4 >, 33
548-549
elemento < h5 >, 34
elemento < h6 >, 34
seletores de id e, 146
hiperlinks internos e, 46
suporte jQuery , 289
elemento < head >
descrito, 9, 34, 40
elemento < script > e, 102-103
elemento < style > e, 140
atributo de altura
elemento < canvas >, 460
atributos globais, 37
elemento < embed >, 50
objetos globais, 67
elemento < objeto >, 51
elemento < video > , 441
elemento < hgroup >, 210
elemento < hn >, 209-210, 213
634
Objeto HTMLMediaElement
elemento < hr >
descrito, 34
como elemento vazio, 38
atributo href
Documentos HTML5
elemento < area >, 49
elemento < link >, 141
Objeto HTMLMediaElement
descrito, 30-32
elemento < html >
descrito, 9, 34, 40
Documentos HTML
descrito , 447
normalizando, 217
HTML5
descrito, 30-31
atributos nomeados suportados, 37
635
Cache HTTP
hiperlinks
descrito, 46
elemento < iframe > e, 44
descrito, 30-32
Protocolo de Transferência)
eu
atributo id
elemento < círculo >, 498
propriedade de volume, 449
Cache HTTP
Elemento < caminho >, 496
elemento < video >, 450
descrito, 607
atualizaçã o, 609
Objeto IDBDatabase
descrito, 314-315
636
Ferramenta IndexedDB
descrito, 590
atributo src, 44
277-279
Objeto IDBFactory
Objeto IDBKeyRange
imagens
descrito, 597
elemento < img >
descrito, 30, 34
Objeto IDBObjectStore
atributo usemap, 49
277-279
importando
fontes, 144
método put (), 594
identificadores, 74
Ferramenta IndexedDB
se palavra-chave, 80-81, 83
elemento < iframe >
descrito, 589-590
tag < objeto > e, 51
atributo sandbox, 45
637
cursores de indexação
herança
descrito, 162-163
JavaScript. Veja também jQuery
AJAX e, 368
elemento < input >
descrito, 34
um elemento vazio, 38
120-121, 134-135
instalando
funçõ es de aninhamento, 78
nú meros inteiros, 67
elemento < script > e, 100–103
Recurso IntelliSense
como linguagem nã o digitada , 66
Suporte HTML5, 3
Suporte a JavaScript, 4
linguagens nã o digitadas e, 66
Console JavaScript, 67
Objetos JavaScript
criando, 263-264
638
descrito, 262-263
jQuery
junçã o, 352
295-296
elemento < keygen >, 38
eu
objeto jQuery
elemento < rótulo >
para atributo, 318
639
descrito, 221
descriçã o, 223-224
ordenado, 221-222
recipientes de layout
nã o ordenado, 222-223
ao vivo NodeList, 112-113
criando, 207-209
descrito, 208
elemento < legenda >, 34
elemento < li >, 34
atributo de loop
elemento < áudio >, 445-446
linhas
desenho, 476-478
junçã o, 471-472
protocolo mailto, 47
elemento < link >
descrito, 34
arquivo de manifesto
descrito, 608-609
elemento < map >
listas
descrito, 34
costume, 224-228
atributo de nome, 49
640
namespaces
mashups, 364
elemento < menu >, 34
multimídia
elemento < meta >
descrito, 34
métodos
matriz, 110-112
getter, 274-275
privilegiado, 269
setter, 274
2012
144
\ n sequência de escape , 69
atributo de nome
elemento < map >, 49
elemento < objeto >, 51
namespaces
jQuery, 288
641
variáveis de nomenclatura
operaçõ es aritméticas, 68
descrito, 67
aninhamento
funçõ es, 78
206–207
elemento < objeto >
Plataforma Node.js
atributo de dados, 51
descrito, 34, 51
descrito, 341
atributo de altura, 51
atributo de nome, 51
instalando, 342
tag <param> e, 52
atributo de tipo, 51
atributo usemap, 51
atributo de largura, 51
206–207
Objeto objeto
elemento < noscript >, 34
descrito, 67
nã o (!) operador ló gico, 70-71
Objeto de nú mero, 67
642
lojas de objetos
evento de mudança de ondulaçã o, 449
descrito, 591
evento onerror
removendo, 593
versionamento e, 591
descrito, 262
descrito, 581
evento onwai ting, 449
operandos
operandos
parametros
argumentos versus, 74
descrito, 67-68
descrito, 73-74
elemento < optgroup >, 34
elemento < opção >
elemento < caminho >
atributo d, 496
elemento < output >, 34
pacote p ath, 348
caminhos
criando, 496-498
elemento < p >, 34
pacotes (Node.js)
consideraçõ es de desempenho
descrito, 345-348
Método POST, 323
mecanismos de armazenamento, 563-564
publicaçã o, 350-351
desinstalando, 354
arquivo packages.config, 96
atributo placeholder
evento pa gehide, 117
elemento < textarea >, 316
elemento < param >
descrito, 34, 52
elemento < objeto > e, 52
plug-ins
como elemento vazio, 39
descrito, 31
644
QueryString
Tipo de arquivo PNG , 48
polimorfismo, 262
Objeto de posiçã o
Objeto PositionOptions
matriz, 109-110
ordem de precedência
Janela de propriedades, 7, 11
atributo de pré-carregamento
elemento < áudio >, 446
pseudo classes, 148-149 , 330
elemento < video >, 441
pseudoelementos, 149-150
valores primitivos, 67
dados privados
elemento < progresso >, 34
< Q > elemen t
descrito, 34
QueryString
criando, 395-397
645
descrito, 364-366
Nó . js e, 357
arquivo qunitmetro.js, 96
Serviços
criando, 366-368
descrito, 364-366
retâ ngulos
atributo de papel
elemento < aparte >, 212
elemento < div >, 212
atributo de rowspan
elemento < td >, 238-240
< th > elemento, 238-240
Objeto RegExp, 67
elemento < s >, 220
Serviços
criando, 366-368
646
avaliação de curto-circuito
sandboxing, 45, 51
seletores
adjacente, 151-152
usando o elemento < svg >, 496-499
atributo, 153-154
esquemas
tabelas e, 591
atualizaçã o, 583
criança, 148
elemento < script >
classe, 146-147
Suporte CSS3 , 138
definindo, 146
colocaçã o, 102-103
descendente, 147-148
descrito, 138-139
agrupamento, 150-151
id, 146
pseudoclasse, 148-149
pseudoelemento, 148-150
irmã o, 151-153
segurança
especificidade em, 161-162
subsequente, 151-153
universal, 147
30, 137
avaliaçã o de curto-circuito, 71
647
seletores de irmãos
declaraçõ es, 71
mecanismos de armazenamento
elemento < source >
descrito, 35
descrito, 555
elemento < span >
descrito, 35
569, 579-580
atributos expando e, 39
especificidade (seletores)
calculando, 161-162
Objeto de armazenamento
atributo src
elemento < áudio >, 446
elemento < embed >, 50
elemento < iframe >, 44
elemento < img >, 47-48
Objeto StorageEvent
descrito, 5 66
elemento < video >, 441
30, 137
648
mesas
Funçã o String () , 78, 80
Objeto de corda, 67
elemento < svg >
descrito, 67, 69
descrito, 496
folhas de estilo
descrito, 138
externo, 141
usando o elemento < svg >, 496-499
importado, 143-144
estilos
aplicando, 139
em cascata, 160-161
\ t sequência de escape , 69
criando, 138
definindo, 139
elemento < tabela >
descrito, 138
incorporado, 140-141
estendendo, 159
herdando, 162-163
inline, 140
cabeçalhos de tabela
nomeado, 146-147
criando, 231-232
estilo, 232
mesas
subcaminhos, 475
criando, 230-231
subclasses, 262
descrito, 229
elemento < resumo >, 219-220
uso indevido de, 230
esquemas e, 591
649
Tag
< th > elemento
Tag
descrito, 30-31
eleme nts e, 32-35
tó picos, 393
TCP
tempos limite
elemento < td >
elemento < title > , 35, 41
Atributo do Título
elemento < input >, 328
TODO comments, 7
descrito, 5-6
elemento < tr >
10-11
Windows 8, 6–7
elemento < tbody > e, 233
Método TRACE (HTTP), 315
elemento < track >, 441
marcas registradas, 41
texto
transaçõ es
desenho, 488-490
IndexedDB e, 558
elemento < textarea >
tente o bloco, 87
650
elemento <video>
atributo de tipo
elemento < botão >, 317
elemento < embed >, 50
elemento < input >, 317-318
elemento < link >, 141
elemento < objeto >, 51
elemento < script >, 100
valores
descrito, 67
você
retorno, 73
elemento < u >, 220
\ u sequência de escape, 69
arquivo ui-dark.css, 9
variá veis
arquivo ui-light.css, 9
contador, 86
global, 77-78
Suporte a JavaScript, 66
local, 77-78
nomeaçã o, 72-73
escopo, 77-78
atributo usemap
declaraçõ es e, 71-73
elemento < img >, 49
elemento < objeto >, 51
versõ es
elemento < video >
configurando, 441
descrito, 324-325
651
vídeo e filmes
2012, 2-3
elemento < source > e, 439-440
descrito, 437
WAI-ARIA, 212
Suporte CSS3, 4
descrito, 3, 9-11
descrito, 312
Nova tela do projeto, 10
criptografando, 366
descrito, 3, 5-7
652
objeto de janela
servidores web
descrito, 312-313
descrito, 364-366
implementaçã o, 417-420
RESTful, 366-368
Construtor WebSocket , 416
Protocolo WebSocket
descrito, 415-416
441-442
atributo de largura
Arquivo Web.config, 10
elemento < canvas >, 460
elemento < embed >, 50
elemento < objeto >, 51
API WebSocket
elemento < video >, 441
objeto de janela
descrito, 415-417
propriedade frameElement, 44
653
95-100
WinJS, 394
objeto trabalhador
descrito, 405
escrevendo
XHTML, 30-32
Objeto XMLHttpRequest
descrito, 369-371
tratamento de erros, 372-373
có digo de amostra, 394-395
654
Sobre o autor
Glenn possui as seguintes certificaçõ es da Microsoft: MCT, MCPD, MCTS, MCAD, MCSD,
MCDBA, MCP + Site Building, MCSE + Internet, MCP + Internet e MCSE. Você pode encontrar
o site de Glenn em http://GJTT.com .
Observaçã o: este livro nã o foi elaborado para cobrir todos os tó picos do exame; veja o
grá fico a seguir. Se você estiver se preparando para o exame, use materiais adicionais para
ajudar a aumentar sua prontidã o, em conjunto com a experiência do mundo real.
Capítulos 2 e 5
Capítulos 3, 7, 11, 12 e 13
Capítulo 4
Capítulos 3 e 6
Capítulo 6
Capítulo 3 e 6
Capítulo 3 e 6
Implemente o tratamento de exceçõ es.
Capítulo 3
Capítulo 3, 6, 8 e 9
Capítulo 9
Capítulo 7
Capítulo 7
Consumir dados.
Capítulo 8
Capítulo 7
Capítulo 4
Capítulo 4
Capítulo 4
Capítulo 4
Capítulo 4
Fazer o que
você pensa em
este livro?
Esperamos ouvir de você!
microsoft.com/learning/booksurvey
Conte-nos como este livro atende bem à s suas necessidades - o que funciona de maneira
eficaz e o que podemos fazer melhor. Seu feedback nos ajudará a melhorar continuamente
nossos livros e recursos de aprendizagem para você.
Esboço do Documento
Cobrir
Conteú do resumido
Tabela de conten ts
Introduçã o
o Requisitos de hardware
o Requisitos de software
o Pratica exercícios
o Agradecimentos
o Manter contato
Suporte CSS3
Suporte a JavaScript
Resumo da liçã o
Revisã o da aula
Explorando a mistura
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Compreendendo o JavaScript
Usando declaraçõ es
Programaçã o condicional
Manipulaçã o de erros
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
L i ç ã o 1
Liçã o 2
Liçã o 3
Resumo da liçã o
Revisã o da aula
Definindo seletores
Usando especificidade
Entendendo a herança
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Anotando conteú do
Resumo da liçã o
Revisã o da aula
Colunas de estilo
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Implementando namespaces
Implementando herança
Resumo da liçã o
Revisã o da aula
Apresentando jQuery
Introduçã o ao jQuery
Usando jQuery
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Usando o elemento <label>
Resumo da liçã o
Revisã o da aula
Estilizando as validaçõ es
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Instalando Node.js
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Falha de manuseio
Atualizando progresso
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Formatos de vídeo
Definir a fonte
Acessando faixas
Resumo da liçã o
Revisã o da aula
o Liçã o 2: reproduzindo á udio
Formatos de á udio
O elemento <audio>
Definir a fonte
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Implementando a tela
Desenho de texto
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Arrastando
Caindo
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Manipulaçã o de erros
Endereçando privac y
Especificando opçõ es
Resumo da liçã o
Revisã o da aula
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Entendendo os cookies
Explorando localStorage
Resumo da liçã o
Revisã o da aula
Inscrever-se em eventos
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Usando transaçõ es
Resumo da liçã o
Revisã o da aula
Usando transaçõ es
Excluindo um registro
Recuperando um registro
Compreendendo os cursores
Resumo da liçã o
Revisã o da aula
Gravando em um arquivo
Lendo um arquivo
Excluindo um arquivo
Resumo da liçã o
Revisã o da aula
Suporte de navegador
Atualizando o cache
Entendendo eventos
Resumo da liçã o
Revisã o da aula
o Pratica exercícios
o Respostas
Liçã o 1
Liçã o 2
Liçã o 3
Liçã o 4
Índice
Sobre o autor
Mapeamento de objetivos
Pá gina de pesquisa