Você está na página 1de 33

APOSTILA DESENVOLVIMENTO WEB COM HTML, CSS E JAVASCRIPT

CAPTULO 5

JavaScript e interatividade na Web


"Design no s como uma coisa aparenta, como ela funciona."
Steve Jobs
JavaScript a linguagem de programao mais popular no desenvolvimento
Web. Suportada por todos os navegadores, a linguagem responsvel por
praticamente qualquer tipo de dinamismo que queiramos em nossas pginas.
Se usarmos todo o poder que ela tem para oferecer, podemos chegar a
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

resultados impressionantes. Excelentes exemplos disso so aplicaes Web


complexas como Gmail, Google Maps e Google Docs.

5.1 - INTRODUO AO JAVASCRIPT


Para rodar JavaScript em uma pgina Web, precisamos ter em mente que a
execuo do cdigo instantnea. Para inserirmos um cdigo JavaScript em
uma pgina, necessrio utilizar a tag <script>:
<script>
alert("Ol, Mundo!");
</script>

O exemplo acima um "hello world" em JavaScript utilizando uma funo


do navegador, a funo alert. possvel adicionar essa tag em qualquer local
do documento que a sua renderizao ficar suspensa at o trmino dessa
execuo.
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Experimente criando essa tag em um HTML e reposicionando-a, verifique


os elementos que j foram renderizados na pgina antes do aparecimento da
caixa de dilogo e o que acontece aps clicar em "OK".
Tambm possvel executar cdigo que est em um arquivo externo, por
exemplo:
No arquivo HTML
<script src="scripts/hello.js"></script>

Arquivo externo script/hello.js


alert("Ol, Mundo!");

Com a separao do script em arquivo externo possvel reaproveitar


alguma funcionalidade em mais de uma pgina.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5.2 - CONSOLE DO NAVEGADOR


Alguns navegadores do suporte a entrada de comandos pelo console. Por
exemplo, no Google Chrome o console pode ser acessado por meio do atalho
Control + Shift + C; no Firefox, pelo atalho Control + Shift + K.
Experimente executar um alert no console e veja o resultado:
alert("interagindo com o console!");

Seus livros de tecnologia parecem do sculo passado?


Conhea a Casa do Cdigo, uma nova editora, com autores
de destaque no mercado, foco em ebooks (PDF, epub, mobi),
preos imbatveis e assuntos atuais.
Com a curadoria da Caelum e excelentes autores, uma
abordagem diferente para livros de tecnologia no Brasil. Conhea os
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

ttulos e a nova proposta, voc vai gostar.


Casa do Cdigo, livros para o programador.

5.3 - SINTAXE BSICA


Operaes matemticas
Teste algumas contas digitando diretamente no console:
> 12
25
> 14
42
> 10
6
> 25
5
> 23
1

+ 13
* 3
- 4
/ 5
% 2

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Variveis
Para armazenarmos um valor para uso posterior, podemos criar uma
varivel:
var curso = "WD-43";
alert(curso);

No exemplo acima, guardamos o valor WD-43 na varivel curso. A partir


desse ponto, possvel utilizar a varivel para obter o valor que guardamos
nela. No JavaScript, tambm possvel alterar o valor da varivel a qualquer
momento, inclusive por valores de tipos diferentes (por exemplo, um
nmero) sem problemas, coisa que no possvel de se fazer em algumas
outras linguagens de programao.
Teste no console:
> var contador = 0;
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

>
>
>
>

undefined
contador++
0
contador
1
contador++
1
contador
2

Tipos
O JavaScript d suporte aos tipos String (letras e palavras), Number
(nmeros inteiros, decimais), Boolean (verdadeiro ou falso) entre outros.
var texto = "Uma String deve ser envolvida em aspas simples ou
duplas.";
var numero = 2012;
var verdade = true;

Outro tipo de informao que considerado um tipo no JavaScript o Array,


onde podemos armazenar uma srie de informaes de tipos diferentes:
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

var pessoas = ["Joo", "Jos", "Maria", "Sebastio", "Antnio"];

Quando utilizamos o JavaScript para interagir com os elementos da pgina


muito comum obtermos colees. Para fazer alguma coisa com cada elemento
de uma coleo necessrio efetuar uma iterao. A mais comum utilizando
o for:
var pessoas = ["Joo", "Jos", "Maria", "Sebastio", "Antnio"];
for (var i = 0; i < pessoas.length; i++) {
alert(pessoas[i]);
}

Essa sintaxe utilizando os colchetes em pessoas[i] uma maneira de


selecionarmos um elemento de um Array, no caso o valor de i um nmero
para cada um dos elementos da coleo. Para explorar o comportamento do
Array voc pode realizar alguns testes com essa seleo:
var pessoas = ["Joo", "Jos", "Maria", "Sebastio", "Antnio"];
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

alert(pessoas[0]);
alert(pessoas[1]);
alert(pessoas[4]);

5.4 - EXERCCIOS OPCIONAIS: FIXAO DE SINTAXE


Os prximos exerccios so opcionais e mostram mais aspectos de lgica de
programao com algoritmos usando JavaScript.
1. Escreva um cdigo que mostre os nmeros mpares entre 1 e 10.
2. Escreva um cdigo que calcule a soma de 1 at 100. (obs: a resposta 5050)
3. Crie um Array igual ao abaixo e mostre apenas os nomes das pessoas que
tenham 4 letras.
var pessoas = ["Joo", "Jos", "Maria", "Sebastio", "Antnio"];

Dica: use o atributo length das Strings.


open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5.5 - INTERATIVIDADE NA WEB


O uso do JavaScript como a principal linguagem de programao da Web s
possvel por conta da integrao que o navegador oferece para o
programador, a maneira com que conseguimos encontrar um elemento da
pgina e alterar alguma caracterstica dele pelo cdigo JavaScript:
var titulo = document.querySelector("#titulo");
titulo.textContent = "Agora o texto do elemento mudou!";

No exemplo anterior, ns selecionamos um elemento do documento e


alteramos sua propriedade textContent. Existem diversas maneiras de
selecionarmos elementos de um documento e de alterarmos suas
propriedades. Inclusive possvel selecionar elementos de maneira similar ao
CSS, atravs de seletores CSS:
var painelNovidades = document.querySelector("section#main
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

.painel#novidades");
painelNovidades.style.color = "red"

querySelector vs querySelectorAll
A funo querySelector sempre retorna um elemento, mesmo que o
seletor potencialmente traga mais de um elemento, neste caso, apenas
o primeiro elemento da seleo ser retornado.
A funo querySelectorAll retorna uma lista de elementos
compatveis com o seletor CSS passado como argumento. Sendo assim,
para acessarmos cada elemento retornado, precisaremos passar o seu
ndice conforme o exemplo abaixo:
var paragrafos = document.querySelectorAll("div p");
paragrafos[o].textContent = "Primeiro pargrafo da seleo";
paragrafos[1].textContent = "Segundo pargrafo da seleo";
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Apesar de ser interessante a possibilidade de alterar o documento todo por


meio do JavaScript, existe um problema com a caracterstica de execuo
imediata do cdigo. O mais comum que as alteraes sejam feitas quando o
usurio executa alguma ao, como por exemplo, clicar em um elemento.
Para suprir essa necessidade, necessrio utilizar de dois recursos do
JavaScript no navegador. O primeiro a a criao de funes:
function mostraAlerta() {
alert("Funciona!");
}

Ao criarmos uma funo, a execuo do cdigo simplesmente guarda o que


estiver dentro da funo, e esse cdigo guardado s ser executado quando
chamarmos a funo. Para exemplificar a necessidade citada acima, vamos
utilizar o segundo recurso, os eventos:
// obtendo um elemento atravs de um seletor de ID
var titulo = document.querySelector("#titulo");
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

titulo.onclick = mostraAlerta;

Note que primeiramente necessrio selecionar um elemento do


documento e depois definir o onclick desse elemento como sendo a funo.
De acordo com os dois cdigos acima, primeiramente guardamos um
comportamento em uma funo. Ao contrrio do cdigo fora de uma funo, o
comportamento no executado imediatamente, e sim guardado para quando
quisermos cham-lo. Depois informamos que um elemento deve executar
aquele comportamento em determinado momento, no caso em um evento
"click".
Tambm possvel chamar uma funo em um momento sem a
necessidade de um evento, s utilizar o nome da funo abrindo e fechando
parnteses, indicando que estamos executando a funo que foi definida
anteriormente:
function mostraAlerta() {
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

alert("Funciona!");
}
// Chamando a funo:
mostraAlerta();

Tambm possvel determinar, por meio de seus argumentos, que a funo


vai ter algum valor varivel que vamos definir quando quisermos execut-la:
function mostraAlerta(texto) {
// Dentro da funo "texto" conter o valor passado na execuo.
alert(texto);
}
// Ao chamar a funo necessrio definir o valor do "texto"
mostraAlerta("Funciona com argumento!");

Existem diversos eventos que podem ser utilizados para que a interao do
usurio com a pgina seja o ponto de disparo de funes que alteram os
elementos da prpria pgina:
onclick: clica com o mouse
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

ondblclick: clica duas vezes com o mouse


onmousemove: mexe o mouse
onmousedown: aperta o boto do mouse
onmouseup: solta o boto do mouse (til com os dois acima para gerenciar
drag'n'drop)
onkeypress: ao pressionar e soltar uma tecla
onkeydown: ao pressionar uma tecla.
onkeyup: ao soltar uma tecla. Mesmo acima.
onblur: quando um elemento perde foco
onfocus: quando um elemento ganha foco
onchange: quando um input, select ou textarea tem seu valor alterado
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

onload: quando a pgina carregada


onunload: quando a pgina fechada
onsubmit: disparado antes de submeter o formulrio. til para realizar
validaes
Existem tambm uma srie de outros eventos mais avanados que
permitem a criao de interaes para drag-and-drop, e at mesmo a criao
de eventos customizados.
No prximo exerccio, vamos usar funes JavaScript com eventos para
lidar com a validao do campo de busca da nossa home page. A ideia
verificar se o campo foi preenchido ou se est vazio, quando o usurio clicar
em buscar.

Agora a melhor hora de aprender algo novo


open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Se voc gosta de estudar essa apostila aberta da Caelum,


certamente vai gostar dos novos cursos online que
lanamos na plataforma Alura. Voc estuda a qualquer
momento com a qualidade Caelum.
Conhea a Alura.

5.6 - EXERCCIO: VALIDAO NA BUSCA COM JS


1. Para testarmos o nosso formulrio de busca, vamos usar o Google como
mecanismo de busca apenas como ilustrao. Para isso, basta fazer o
formulrio submeter a busca para a pgina do Google.
No <form>, acrescente um atributo action= apontando para a pgina do
Google:
<form action="http://www.google.com.br/search" id="form-busca">
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Repare que colocamos tambm um id. Ele ser til para depois manipularmos
esse elemento via JavaScript.
Alm disso, o <input> com o texto a ser buscado deve ter o nome de q para ser
compatvel com o Google. Basta fazer:
<input type="search" name="q" id="q">

Teste a pgina e submeta uma busca simples para o Google com o nosso
formulrio.
2. Queremos fazer uma validao: quando o usurio clicar em submeter,
verificar se o valor foi preenchido. Se estiver em branco, queremos mostrar
uma mensagem de erro em um alert.
A validao ser escrita em JavaScript. Portanto, comece criando um arquivo
home.js na pasta js/ do projeto. l que vamos escrever nossos scripts.
Referencie esse arquivo no index.html usando a tag <script> no final da
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

pgina, logo antes de fechar o </body>:


<script src="js/home.js"></script>

3. A validao em si ser feita por uma funo JavaScript a ser acionada no


momento que o usurio tentar submeter o formulrio.
A funo deve ser definida dentro do arquivo home.js criado antes. Seu papel
verificar se o elemento com id=q (o campo de busca) est vazio. Se estiver,
mostramos um alert e abortamos a submisso do formulrio com return
false:
function validaBusca() {
if (document.querySelector('#q').value == '') {
alert('No podia ter deixado em branco a busca!');
return false;
}
}

Uma funo um bloco de cdigo JavaScript que executa algum cdigo quando
algum chamar essa funo. Ns podemos chamar a funo explicitamente
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

ou, melhor ainda, deixar que o navegador chame pra gente quando acontecer
algum evento.
No nosso caso, queremos indicar que a funo anterior deve ser executada
quando o usurio disparar o evento de enviar o formulrio (onsubmit).
Coloque o final do arquivo JavaScript:
// fazendo a associao da funo com o evento
document.querySelector('#form-busca').onsubmit = validaBusca;

o cdigo anterior que faz a associao da funo validaBusca com o evento


onsubmit do formulrio.
4. Teste a pgina e observe seu comportamento. Tente submeter com o campo
vazio e com o campo preenchido.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5. (opcional) Mostrar uma janela de erro considerado por muitos uma ao


muito agressiva contra o usurio. Talvez um feedback mais sutil seja pintar o
fundo do formulrio de vermelho, indicando um erro.
Na funo de validao, remova a linha do alerta e em seu lugar pinte o fundo
do formulrio de vermelho em caso de erro. Cdigo da funo dever ficar
assim:
function validaBusca() {
if (document.querySelector('#q').value == '') {
document.querySelector('#form-busca').style.background = 'red';
return false;
}
}

6. (opcional avanado) No exerccio criamos uma funo JavaScript com nome


validaBusca e a referenciamos no onsubmit do formulrio. Mas repare que o
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

nico uso dessa funo nessa situao, nunca mais a chamamos.


Nesses casos, podemos usar um recurso do JavaScript chamado de funes
annimas que nos permite definir a funo diretamente na definio do
onsubmit. Troque nosso JavaScript para usar essa sintaxe.
document.querySelector('#form-busca').onsubmit = function() {
if (document.querySelector('#q').value == '') {
document.querySelector('#form-busca').style.background = 'red';
return false;
}
};

Validation API HTML5


Mais pra frente, veremos as novidades do HTML5 para validao de
formulrios de maneira mais simples, e at sem necessidade de
JavaScript.
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5.7 - FUNES TEMPORAIS


Em JavaScript, podemos criar um timer para executar um trecho de cdigo
aps um certo tempo, ou ainda executar algo de tempos em tempos.
A funo setTimeout permite que agendemos alguma funo para execuo
no futuro e recebe o nome da funo a ser executada e o nmero de
milissegundos a esperar:
// executa a minhaFuncao daqui um segundo
setTimeout(minhaFuncao, 1000);

Se for um cdigo recorrente, podemos usar o setInterval que recebe os


mesmos argumentos mas executa a funo indefinidamente de tempos em
tempos:
// executa a minhaFuncao de um em um segundo
setInterval(minhaFuncao, 1000);
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

uma funo til para, por exemplo, implementar um banner rotativo,


como faremos no exerccio a seguir.

clearInterval
As funes temporais devolvem um objeto que representa o
agendamento que foi feito. possvel us-lo para cancelar a execuo
no futuro. especialmente interessante para o caso do interval que
pode ser cancelado de sua execuo infinita:
// agenda uma execuo qualquer
var timer = setInterval(minhaFuncao, 1000);
// cancela execuo
clearInterval(timer);

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5.8 - EXERCCIO: BANNER ROTATIVO


1. Implemente um banner rotativo na home page da Mirror Fashion usando
JavaScript.
Temos duas imagens, a destaque-home.png e a destaque-home-2.png que
queremos trocar a cada 4 segundos; use o setInterval para isso.
H vrias formas de implementar essa troca de imagens. Uma sugesto
manter um array com os valores possveis para a imagem e um inteiro que
guarda qual o banner atual.
var banners = ["img/destaque-home.png", "img/destaque-home-2.png"];
var bannerAtual = 0;
function trocaBanner() {
bannerAtual = (bannerAtual + 1) % 2;
document.querySelector('.destaque img').src = banners[bannerAtual];
}
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

setInterval(trocaBanner, 4000);

2. (opcional, avanado) Faa um boto de pause que pare a troca do banner.


Dica: use o clearInterval para interromper a execuo.
3. (opcional, avanado) Faa um boto de play para reativar a troca dos
banners.

Voc pode tambm fazer o curso WD-43 dessa apostila na Caelum


Querendo aprender ainda mais sobre HTML, CSS e
JavaScript? Esclarecer dvidas dos exerccios? Ouvir
explicaes detalhadas com um instrutor?
A Caelum oferece o curso WD-43 presencial nas cidades de
So Paulo, Rio de Janeiro e Braslia, alm de turmas incompany.
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Consulte as vantagens do curso Desenvolvimento Web com HTML, CSS


e JavaScript.

5.9 - PARA SABER MAIS: SUGESTO PARA O DESAFIO


DE PAUSE/PLAY
Podemos criar no HTML um novo link para controlar a animao:
<a href="#" class="pause"></a>

O JavaScript deve chamar clearInterval para pausar ou novamente o


setInterval para continuar a animao.
Precisamos editar o cdigo anterior que chamava o setInterval para pegar
o seu retorno. Ser um objeto que controla aquele interval e nos permitir
deslig-lo depois:
var timer = setInterval(trocaBanner, 4000);
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Com isso, nosso cdigo que controla o pause e play ficaria assim:
var controle = document.querySelector('.pause');
controle.onclick = function() {
if (controle.className == 'pause') {
clearInterval(timer);
controle.className = 'play';
} else {
timer = setInterval(trocaBanner, 4000);
controle.className = 'pause';
}
return false;
};

Por fim, podemos estilizar o boto como pause ou play apenas trabalhando
com bordas no CSS:
.destaque {
position: relative;
}
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

.pause,
.play {
display: block;
position: absolute;
right: 15px;
top: 15px;
}
.pause {
border-left: 10px solid #900;
border-right: 10px solid #900;
height: 30px;
width: 5px;
}
.play {
border-left: 25px solid #900;
border-bottom: 15px solid transparent;
border-top: 15px solid transparent;
}

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

5.10 - PARA SABER MAIS: VRIOS CALLBACKS NO


MESMO ELEMENTO
Nos exerccios que trabalhamos com eventos, usamos o onclick e o
onsubmit diretamente no elemento que estvamos manipulando:
document.querySelector('#destaque').onclick = function() {
// tratamento do evento
};

uma forma fcil e portvel de se tratar eventos, mas no muito comum na


prtica. O maior problema do cdigo acima que s podemos atrelar uma
nica funo ao evento. Se tentarmos, em outra parte do cdigo, colocar uma
segunda funo para executar no mesmo evento, ela sobrescrever a anterior.
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

A maneira mais recomendada de se associar uma funo a eventos com o


uso de addEventListener:
document.querySelector('#destaque').addEventListener('click',
function() {
// tratamento do evento
});

Dessa maneira, conseguimos adicionar vrios listeners ao mesmo evento,


deixando o cdigo mais flexvel. S h um porm: embora seja o modo oficial
de se trabalhar com eventos, o addEventListener no suportado do IE8 pra
baixo.
Para atender os IEs velhos, usamos a funo attachEvent, semelhante:
document.querySelector('#destaque').attachEvent('onclick', function()
{
// tratamento do evento
});

O problema ter que fazer sempre as duas coisas para garantir a


open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

portabilidade da nossa pgina. Essa questo resolvida pelos famosos


frameworks JavaScript, como o jQuery, que veremos mais adiante no curso.

CAPTULO ANTERIOR:

PRXIMO CAPTULO:

Mais HTML e CSS

CSS Avanado

Voc encontra a Caelum tambm em:

open in browser PRO version

Blog Caelum

Cursos Online

Facebook

Newsletter

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Casa do Cdigo

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

Twitter

pdfcrowd.com

Você também pode gostar