Professional Documents
Culture Documents
Captulo 1 - Prefcio
Introduo ao JavaScript
Os principais browsers do
mercado, Firefox, Mozilla, Opera,Netscape, Safari, Internet Explorer e
outros mais, suportam a linguagem JavaScript. Ela utilizada para a validao de
formulrios, ler e inserir contedo em uma pgina, criar cookies, menus
dinmicos e diversos outros recursos.
Pgina 2 de 102
Pgina 3 de 102
Pgina 4 de 102
A tag <noscript>
A tag <noscript> nos permite disponibilizar um contedo alternativo ao disposto
via script. Isso significa dizer que, se o usurio no tiver suporte ao JavaScript
em seu browser, ele ver o contedo inserido dentro dela e, caso tenha suporte,
o seu contedo omitido.
Veja um exemplo:
<script type="text/javascript">
alert("Parabns, voc est aprendendo JavaScript.");
</script>
<noscript>
<p>Parabns, voc est aprendendo JavaScript.</p>
</noscript>
No exemplo acima ser exibida a mensagem, "Voc est aprendendo JavaScript",
atravs do alert() - uma funo do JavaScript que exibe uma mensagem
atravs de um popup box - para quem tem suporte ao JavaScript. Caso contrrio,
mesma mensagem aparecer para quem no tem suporte ao JavaScript, porm
atravs da tag <noscript> na forma de texto.
Veja as imagens:
Pgina 5 de 102
Comentrios em JavaScript
Os comentrios na linguagem JavaScript tem funo similar s demais
linguagens, ou seja, de explicar o que determinado comando faz, nota de algum
autor, lembretes, dentre outras.
Tudo que estiver englobado pelos comentrios ignorado pelo interpretador do
JavaScript.
H dois tipos de comentrios, so eles: // e /* */. O primeiro o comentrio
de uma linha somente, enquanto o segundo suporta vrias.
Observe os exemplos:
<script type="text/javascript">
// Isto um comentrio de uma linha.
</script>
</head>
...
Agora vamos compreender isso melhor. Os browsers que no suportam o
JavaScript iro exibi-lo como se fosse parte do contedo da pgina. Para prevenir
essa prtica, utilizamos o comentrio em HTML.
Porm, voc pode se perguntar: Para que serve as duas barras (//) antes do
fechamento do comentrio? Bom, elas previnem que o interpretador do
JavaScript as interpretem.
t
Variveis
Pgina 8 de 102
Deve-se iniciar o nome de uma varivel com uma letra ou com um sublinhado (_).
Atribuindo valor a uma varivel
Operadores
Operadores aritmticos
Pgina 9 de 102
Operado
r
Exempl
o
Resultad
o
Adio
x=2
y=8
x+y
10
Subtrao
x=10
y=3
x-y
Multiplicao
x=4
x*5
20
Diviso
15/5
5%2
10%8
10%2
1
2
0
++
Incrementos
x=5
x++
x=6
--
Decrementos
x=5
x--
x=4
Descrio
Operadores de comparao
Operad
or
==
Descrio
Exemplo
Resulta
do
igual a
5==8
falso
===
x=5 e
y="5"
x==5
x===5
verdadeir
o
falso
!=
no igual
5!=8
verdadeir
o
Pgina 10 de 102
Operad
or
Descrio
Resulta
do
Exemplo
>
maior que
5>8
falso
<
menor que
5<8
verdadeir
o
>=
5>=8
falso
<
5<=8
verdadeir
o
Operadores lgicos
Operador
&&
||
Descrio
Exemplo
Resultado
x=6
y=3
(x < 10 && y > 1)
verdadeiro
ou
x=6
y=3
(x==5 || y==5)
falso
no
x=6
y=3
!(x==y)
verdadeiro
Operadores de atribuio
Operador
Exemplo
o mesmo que
x=y
x=y
+=
x+=y
x=x+y
-=
x-=y
x=x-y
Pgina 11 de 102
Operador
Exemplo
o mesmo que
*=
x*=y
x=x*y
/=
x/=y
x=x/y
%=
x%=Y
x=x%y
Operador condicional
Operador condicional aquele que atribui um valor a uma determinada varivel
com base em uma condio, ou seja, se a condio for verdadeira, teremos um
valor x, caso contrrio um valor y.
Conhea a sintaxe desse tipo de condio:
nomeDaVarivel = (condio) ? valorSeVerdadeiro : valorSeFalso;
Agora observe um exemplo para uma melhor compreenso:
var fruta = "Ma";
var resposta = (fruta == "Ma") ? "A fruta a Ma." : "No sei
qual a fruta.";
No exemplo acima fizemos o seguinte processo: inicialmente temos uma varivel
denominada fruta com o valor Ma; em seguida, a varivel resposta com um
valor condicional, ou seja, se o valor da varivel fruta for igual a Ma, teremos o
valor A fruta a Ma, caso contrrio, teremos No sei qual a fruta.
Condies
Declaraes condicionais
Pgina 12 de 102
Declarao if
Sintaxe
if (condio) {
Pgina 13 de 102
if(pais == "Brasil") {
alert("Ol brazuca!");
}
No exemplo acima, a declarao if (se) verifica se a varivel pais igual a Brasil.
Como a condio verdadeira, ou seja, a varivel pais tem o valor Brasil, ser
exibido o texto Ol brazuca! via alert().
Declarao if...else
Sintaxe
if (condio) {
//cdigo a ser executado quando a condio for verdadeira.
} else {
//cdigo a ser executado quando a condio for falsa.
}
Exemplo
if(pais == "Brasil") {
alert("Ol brazuca!");
} else {
alert("Voc no um brazuca!");
}
No exemplo acima, a declarao if (se) verifica se a varivel pais igual a Brasil.
Como a condio falsa, ou seja, a varivel pais no tem o valor Brasil e sim
China, ser exibido o texto Voc no um brazuca!via alert().
Pgina 14 de 102
} else if (2 condio) {
//cdigo a ser executado quando a 2 condio for verdadeira.
} else {
//cdigo a ser executado quando a primeira e a segunda condio
forem falsas.
}
Exemplo
if(pais == "Brasil") {
alert("Ol brazuca!");
} else if(pais == "China") {
alert("Ol chins!");
} else {
alert("Voc no um brazuca e nem chins!");
}
No exemplo acima, realizamos duas verificaes: perguntamos se a
varivel pais tem o valor Brasil (a primeira). Caso verdadeiro, exibiremos o
texto Ol brazuca!; ou perguntamos se a mesma varivel tem o valor China (a
segunda). Neste caso, exibiremos o texto Ol chins!.
Caso a varivel no tenha nenhum dos dois valores - Brasil ou China - exibir o
texto Voc no um brazuca e nem chins!
Declarao switch
Pgina 15 de 102
Sintaxe
switch(expresso) {
case valor 1:
//cdigo a ser executado se a expresso = valor 1;
break
case valor 2:
//cdigo a ser executado se a expresso = valor 2;
break
default:
switch(estado) {
case "MG":
default:
alert("Onde moras?");
}
t
Popup Boxes
Alert box
Pgina 17 de 102
Sintaxe
Esse tipo de popup box tem o objetivo de alertar o usurio sobre algo que
ocorreu durante alguma ao por ele executada.
Um boto de OK exibido junto a ela. Para prosseguir com a navegao
necessrio que o usurio clique nesse boto.
Confirm box
Sintaxe
Prompt Box
Pgina 18 de 102
Sintaxe
Pgina 19 de 102
if(querMsg) {
var nome = prompt("Por favor, qual o seu nome?","");
if(nome != null && nome != "") {
alert("Ol " + nome + ", seja bem vindo.");
}
}
pt
Loops
Pgina 20 de 102
Loop For
Sintaxe
var numero = 1;
Pgina 21 de 102
Loop while
Sintaxe
}
Exemplo
var numero = 1;
Loop do...while
Pgina 22 de 102
Sintaxe
do {
//cdigo a ser executado.
} while (var <= valorFinal);
Exemplo
var numero = 1;
do {
alert("O nmero atual : " + numero);
numero = numero + 1;
} while (numero < 1).
No exemplo acima, temos a condio (numero < 1) indicando que a
varivel numero menor do que 1, ou seja, 0. Logo, o loop no deveria ser
executado.
Entretanto, como expliquei anteriormente, o loop do verifica a condio aps ser
executado e, devido a isso, ocorreu a execuo do loop.
Break e Continue
Exemplo - break
Pgina 23 de 102
pt
Funes
Sintaxes
Sintaxe - sem parmetros
function nomeDaFuncao() {
//cdigos referente funo.
}
Sintaxe - com parmetros
Exemplos
Veja alguns exemplos para uma melhor compreenso.
Exemplo - sem parmetros
function boasVindas() {
alert("Ol, seja bem vindo.\nEspero que goste do nosso site.");
}
function boasVindas(nome) {
alert("Ol " + nome + ", seja bem vindo.\nEspero que goste do
nosso site.");
window.location.href = "http://www.imasters.com.br";
}
A declarao return
Pgina 26 de 102
function calculo(valor1,valor2) {
total = valor1 * valor2;
return total;
}
pt
Eventos
Pgina 27 de 102
onclick
O evento onclick ocorre quando o usurio clica sobre algum elemento da pgina,
por exemplo: um link, uma imagem, um boto, dentre outros.
onclick na realidade quer dizer: pressionar o mouse (mousedown) e liber-lo
(mouseup) sobre um mesmo elemento.
Exemplo
onload e onunload
O evento onload executado quando uma pgina HTML carregada por
completa, incluindo as imagens. J o evento onunload ocorre quando o usurio
sai de uma pgina.
Eles so opostos entre si, enquanto um utilizado na entrada o outro trabalha na
sada.
Exemplo
onmouseover e onmouseout
Esses eventos trabalham de forma oposta, porm so utilizados em conjunto na
maioria das vezes.
Enquanto o evento onmouseover acionado quando o mouse se localiza na
rea de um elemento, o onmouseout executado quando ele (mouse) sai dessa
rea.
Pgina 28 de 102
Exemplo
onmouseover="funcaoParaMouseOver();"
onmouseout="funcaoParaMouseOut();"
onsubmit
Para realizarmos a validao de um formulrio utilizamos o eventoonsubmit, o
que significa dizer: ao enviar os dados do formulrio.
Esse evento trabalha em conjunto com uma funo da seguinte forma:
associamos ao formulrio a chamada de uma funo e esta tem por objetivo
validar os dados submetidos e retornar um valor verdadeiro (true) ou falso
(false).
Se o valor retornado for verdadeiro, o formulrio enviado, caso contrrio, o
envio bloqueado at que os dados sejam preenchidos como desejamos.
Exemplo
Pgina 29 de 102
Exemplos
pt
Array
Voc certamente j deve ter ouvido falar neste nome: Array.
Se formos traduzir esse nome ao p-da-letra, teramos: pr em ordem, fileira,
arranjo e por a vai.
Entretanto, o que ele realmente significa para ns a possibilidade de
armazenarmos diversos valores em uma nica varivel. Dessa forma, seria uma
varivel com vrios valores e esses valores so armazenados e acessados atravs
de uma ordem.
Como exemplo, imagine uma varivel com o nome diasDaSemana. Para ela,
precisaremos armazenar sete valores, uma vez que os dia da semana vo de
domingo a sbado. Ento, a soluo nesse caso utilizarmos o Array para
definirmos sete valores em uma nica varivel.
O objeto Array definido atravs da palavra-chave new.
Vejamos um exemplo:
Pgina 30 de 102
Descrio
Coloca todos os elementos de um Array em uma string e os
separam por um delimitador especificado.
Pgina 31 de 102
shift()
pop()
reverse(
Inverte a ordem dos elementos de um Array.
)
slice()
sort()
pt
Data
Para trabalharmos com datas e horrios em JavaScript fazemos uso do
objeto Date() e, para o instanciarmos (criarmos objetos), utilizamos a palavrachave new.
Vejamos um exemplo:
var dataAtual = new Date();
alert(dataAtual);
No exemplo acima teremos a data e o horrio atual, ou seja, o exato momento
em que o script foi executado. O resultado aparecer no formato abaixo:
Mon Jun 26 2006 15:29:13 GMT-0300 (Hora oficial do Brasil)
Observando o resultado acima voc deve se perguntar: "Hummm, legal! Mas
moro no Brasil e esse formato de data diferente do utilizado aqui. No sei
trabalhar com ele".
Para resolver esse problema, existem prticas eficientes que nos possibilitam a
manipulao desse formato para podermos exib-lo como desejarmos.
Veja um novo exemplo adaptado ao nosso formato dd/mm/aaaa.
var data = new Date();
mes[4] = "...";
Descrio
Date()
getDate()
getDay()
getMonth()
Retorna o ms (0-11)
getFullYear()
getHours()
getMinutes()
getSeconds()
getMilliseconds()
getTimezoneOffset()
// Outra forma
var data = new Date();
data.nomeDoMetodo();
pt
String
O objeto string utilizado para manipular um texto armazenado em uma varive
e, para essa manipulao, ele nos disponibiliza diversos mtodos.
importante ressaltar que, alm do objeto string, h a string literal. Quando
utilizamos alguns dos mtodos do objeto string na string literal, essa ltima
convertida automatica e temporariamente em um objeto string. Por exemplo, o
mtodo length retorna a quantidade de caracteres em uma string.
Veja a utilizao desse mtodo abaixo em ambos os casos:
var portal1 = "iMasters";
var portal2 = new String("iMasters");
Descrio
indexOf()
lastIndexOf()
match()
replace()
toLowerCase(
Exibe os caracteres da string em minsculos.
)
toUpperCase() Exibe os caracteres da string em maisculos.
substr()
substring()
pt
Math
Valores matemticos
Relao dos valores matemticos que podem ser acessados
pelo objeto Math.
Math
Nome
Valor
Math.E
2.718281828459045
Math.PI
PI
3.141592653589793
Math.SQRT2
square root of 2
1.4142135623730951
Math.SQRT1_2
0.7071067811865476
Pgina 35 de 102
Nome
Valor
Math.LN2
natural log of 2
0.6931471805599453
Math.LN10
natural log of 10
2.302585092994046
Math.LOG2E
base-2 log of E
1.4426950408889634
Math.LOG10E
base-10 log of E
0.4342944819032518
Arredonda o valor informado para cima at o nmero inteiro mais prximo. Veja
o exemplo:
var numero = 6.1;
alert(Math.ceil(numero));
// Exibir o valor 7.
floor()
Arredonda o valor informado para baixo at nmero inteiro mais prximo. Veja o
exemplo:
var numero = 6.1;
alert(Math.floor(numero));
// Exibir o valor 6.
max()
Pgina 36 de 102
alert(Math.random()*59);
// Exibir nmeros aleatrios entre 0 e 59 - Ex.: 58.92792655560298
round()
Arredonda o valor informado para o nmero inteiro mais prximo, seja positivo
ou negativo.
var numero1 = 6.7;
alert(Math.round(numero1));
// Exibir o valor 7
alert(Math.round(numero2));
// Exibir o valor -4
pt
Validao de formulrio
Certamente voc ter uma funo que verificar os dados submetidos pelo
formulrio e, essa, invocada mediante a um evento que pode ser por exemplo,
o evento onsubmit. E, juntamente com ela pode haver a declarao return.
Vejamos um exemplo:
<form ... onsubmit="return ValidaForm(this);" ...>
Sobre o return
Ela faz uma referncia genrica a um objeto, alm de ser uma forma prtica de
refereciar a um formulrio ou aos objetos deste.
Ela pode ser utilizada dentro da tag do form ou de seus objetos. Se precisarmos
utiliz-la dentro da tag de algum objeto mas para referenciar ao formulrio em
questo, a utilizamos juntamente com a palavra form, assim: this.form. O que
seria a mesma coisa quedocument.nomeForm.
Quando a utilizamos em um elemento de formulrio, estamos referenciando a
esse elemento da mesma forma como se estivssemos
utilizando document.nomeForm.nomeElemento.
Quando desejamos apenas extrair o valor contido no elemento, basta
acrescentarmos palavra value, assim: this.value. O que teria a mesma forma
que document.nomeForm.nomeElemento.value
Faa a anlise do script nesta pgina Validao de Formulrio e bons
estudos. ;)
Pgina 39 de 102
Pgina 40 de 102
pt
Captulo 2 - Prefcio
Pgina 41 de 102
Introduo ao DOM
DOM e JavaScript
Diferentemente do JavaScript, o DOM no uma linguagem. Ele concede a
estrutura de um documento e seus elementos, j o JavaScript no.
Pgina 42 de 102
pt
Introduo ao DHTML
Como dito no prefcio deste captulo, DHTML uma combinao de tecnologias XHTML, CSS, JavaScript - utilizadas em conjunto para criar web sites dinmicos.
O termo DHTML uma estratgia de marketing de duas empresas - Netscape e
Microsoft - que tinham o objetivo de descreverem a nova tecnologia suportada
pela quarta gerao (4.x) de seus browsers, Netscape Navigator e Internet
Explorer, respectivamente.
preciso ressaltar que essa tecnologia no um padro do W3C. Assim, como
no temos a inteno que nossos scripts funcionem apenas nos browsers acima
citados, precisamos desenvolver um DHTML crossbrowser, ou seja, um DHTML
que funcione em diversos browsers.
Dessa forma, utilizaremos o DOM do W3C que tem o suporte em todos os
navegadores atuais.
</script>
HTML
<div id="conteudo" class="destaque">
<h1>Ma quande lingues coalesce</h1>
<p>Lorem ipsum dolor sit amet, consectetuer ...</p>
<a href="../../noscript.htm" onclick="changeClass('nodestaque');
return false;">Altere minha aparncia</a>
</div>
CSS
#conteudo {
width: 500px;
padding: 15px;
line-height: 1.5em;
}
.destaque {
background-color: #ffc;
border: 1px solid #fc6;
}
.nodestaque {
background-color: #fff;
border: 1px solid #000;
}
Pgina 44 de 102
pt
Mtodo getElementById
Provavelmente o mtodo mais utilizado no DOM seja o getElementById. Sua
funo simplesmente retorna o elemento cujo atributo ID foi especificado. Caso o
elemento no exista ou o ID informado seja incorreto ele retornar null.
importante lembrarmos que somente um objeto pode conter um ID especfico,
ou seja, no podem existir dois objetos em uma pgina com o mesmo valor de
um atributo ID.
Considere o seguinte campo de um formulrio:
<input type="text" id="nomeContato" name="nomeContato" ...
Para acessarmos o valor digitado nesse campo de texto em JavaScript
procederemos assim:
document.nomeForm.nomeContato.value
Ou seja, precisamos declarar document mais o nome do formulrio em que o
campo se localizada e o seu nome espeficado no atributo name.
Se utilizarmos o mtodo getElementById, podemos acess-lo assim:
document.getElementById('nomeContato').value
Assim, ao invs de informarmos toda a localizao do objeto, dizemos apenas o
seu atributo ID ao mtodo getElementById.
Por exemplo: imagine uma pessoa solicitando seu endereo e, ao invs de voc
informar rua, bairro, cidade, estado, voc informar apenas o seu CEP e o seu
nmero.
Na pgina Mtodo: getElementById existem dois scripts de exemplos, um
em JavaScript e outro utilizando o mtodo getElementByIddo DOM.
Detalhe importante: getElementById diferente de getelementbyid ou
getElementbyId e por a vai. Caso voc escreva o nome errado ser retornado
um erro. Por exemplo: document.getelementByid no uma funo.
Pgina 45 de 102
ipt
Mtodo getElementsByTagName
Ao contrrio do mtodo que conhecemos anteriormente,
ogetElementsByTagName retorna diversos objetos com a tag especficada no
mtodo. Portanto, ao invs de informarmos um atributo e termos como retorno
um nico objeto, informarmos uma tag e temos todas aquelas que constam na
pgina em questo.
Considere a seguinte situao: temos uma pgina em que todos os links no
contm sublinhados para destac-los e precisamos alterar, via script, a forma
como esses links so apresentados, ou seja, precisamos que esses links tenham
o estilo sublinhado.
Para resolvermos essa questo devemos proceder assim: identificar todos os
links contidos na pgina e acrescentar-lhes um estilo comotextdecoration underline. Mas, como fazer isto?
Vamos com calma! Sabemos que o mtodo getElementsByTagNameseleciona
todas as tags de uma determinada pgina, ou seja, ele seria a soluo para
selecionarmos todos os links (tag a). Com eles (links) "em mos", basta
adicionarmos um estilo que lhes conceda o sublinhado desejado.
Vejamos o exemplo acima em ao na pgina Mtodo:
getElementsByTagName.
Agora vamos observar o script que solucionou nosso problema:
function changeStyleLink() {
var links = document.getElementsByTagName('a');
for(var x = 1; x < links.length; x++) {
var _link = links[x];
_link.style.textDecoration = 'underline';
}
}
Vamos entend-lo.
Primeiramente criamos uma funo chamada changeStyleLink(), a qual
invocada atravs do evento onclick no link Sublinhar os links contidos nesta
pgina. Vamos entend-la:
A varivel links armazena todos os links contidos na pgina atravs do
mtodo getElementsByTagName; a esse mtodo foi informada a tag a.
Aps, iniciamos um loop com o for e instanciamos a varivel X informando-lhe
o valor inicial como sendo 1. Essa varivel ser menor que o total de links
contidos na pgina (links.length) e utilizamos tambm um incremento (++) na
varivel.
Pgina 46 de 102
Criamos a varivel _link que ter como valor todos os links contidos na pgina,
ou melhor, com a exceo do primeiro link que o responsvel por chamar a
funo. Isto ocorre porque informamos varivel X o valor inicial de 1 no loop e
o link que invoca a funo representado pelo nmero 0 (zero), exatamente por
ser o primeiro a aparecer na pgina. Dessa forma, a varivel _link, durante o
loop, ter os seguintes valores: links[1], links[2], links[3], links[4], ...
Para finalizar, utlizamos o mtodo style (falaremos sobre ele adiante) para
adicionar aos links o sublinhado desejado. Por fim, dizemos que underline ser o
valor da propriedade textDecoration porque esse valor que adiciona o
sublinhado que desejvamos.
Observe que a propriedade text-decoration das CSS representado por
textDecoration. Portanto, segue uma dica: sempre que desejar utilizar uma
propriedade CSS e esta conter esta estrutura nome-outronome, basta retirar o
hfen e colocar em maisculo a primeira letra do segundo nome.
pt
Mtodo style
O mtodo style tem por objetivo alterar o estilo de um objeto. algo idntico ao
atributo style do HTML, a diferena que o estilo ao objeto ser acrescido ou
alterado via script e no na marcao HTML.
Por exemplo, vamos supor que queremos ocultar um objeto quando esse estiver
visvel e torn-lo visvel novamente quando estiver oculto. Para isso podemos
utilizar a propridade display das CSS com o valor none e block respectivamente,
em conjunto com o mtodo style.
Vejamos o referido exemplo na pgina Mtodo style.
Agora vamos observar o script utilizado:
function showHide(id) {
var obj = document.getElementById(id);
if(obj.style.display == "") {
obj.style.display =
"none";
} else {
obj.style.display = "";
}
}
Pgina 47 de 102
"block";
} else {
obj.style.display = "";
}
}
pt
Mtodo className
Semelhante ao mtodo style, o mtodo className tem a funo de alterar o
estilo de um objeto definido por uma classe CSS.
A vantagem do mtodo className que podemos alterar as propriedades do
estilo na folha de estilo vinculada pgina, ou seja, no precisamos alterar o
script quando desejarmos alterar o estilo e sim as propriedades da classe CSS.
Vejamos o mesmo exemplo de ocultar e exibir um objeto na pgina Mtodo:
className.
Observe o script:
function showHide(id) {
var obj = document.getElementById(id);
if(obj.className == "") {
obj.className = "ocultaObj";
Pgina 48 de 102
} else {
obj.className = "";
}
}
Como dito no incio desta unidade, o mtodo className mais vantajoso do que
o style porque nos possibilita alterar o estilo sem alterar o script, ou seja, basta
modificarmos as propriedades da classe utilizada.
Assim, suponhamos que ao invs de ocultar e exibir o objeto utilizando a
propriedade display, queremos utilizar a propriedade visibility. Para isso iremos
alterar o script? No, simplesmente alteramos a propriedade da classe ocultaObj
assim:
.ocultaObj {
visibility: hidden;
}
ipt
Mtodo innerHTML
Interno o equivalente de inner em ingls. Ento innerHTML quer dizer o HTML
interno de algo, sendo esse ltimo um objeto, ou seja, uma tag.
Assim, para alterarmos ou inserirmos contedo ou uma marcao HTML em um
objeto, utilizamos o mtodo innerHTML.
Imaginemos uma tag div (ou qualquer outra) em sua marcao HTML e que essa
tag esteja com o atributo ID definido como box. Ento, podemos utilizar o
mtodo getElementById para acess-la e usufruir do mtodo innerHTML para
manipular seu contedo ou marcao HTML.
Pgina 49 de 102
Vamos supor que queremos inserir um ttulo de primeiro nvel (h1) acima do
pargrafo existente na marcao acima. Para tal procedimento faremos assim:
var obj = document.getElementById("box");
var novaMarcacao = "<h1>Ttulo deste pargrafo.</h1>";
obj.innerHTML = novaMarcacao += obj.innerHTML;
pt
Mtodo appendChild
Ao traduzirmos os nomes que compe o elemento appendChild, teremos: append
= acrescentar/anexar e child = filho/criana. Baseando-se nisso, podemos
entender esse mtodo como o acrscimo de um novo filho.
Ele funciona exatamente dessa maneira, adiciona um n (node, 'filho') ao final da
lista de filhos (children) de um elemento pai (parent node).
Para ficar mais claro a compreenso, vamos observar este exemplo:
Pgina 50 de 102
// 1
var newElement = document.createElement("hr");
// 2
document.getElementById("box").appendChild(newElement);
Em primeiro lugar, definimos qual ser o novo elemento ou a nova tag a ser
criada, nesse caso, a tag hr. Entretanto, ela precisa ser filho (child) de algum pai
(parent).
Na segunda linha fizemos referncia ao atributo ID de uma tag e essa ser o pai
do novo elemento que ser adicionado. Em seguida utilizamos o
mtodo appendChild informando a ele a tag que criamos na varivel newElement.
Para concluir, a tag hr criada pelo mtodo createElement (veremos mais
detalhes a seguir) foi adicionada como filho do elemento cujo atributo ID igual
a box.
Vejamos este exemplo aqui Mtodo: appendChild.htm .
pt
Mtodo createElement
Mesmo aqueles que no dominam a lngua inglesa conseguem compreender a
funo deste mtodo, ou seja, criar um elemento, ou melhor dizendo, uma tag.
Imagine que voc necessita criar um novo elemento em sua marcao HTML mas
no h possibilidades de alterar a marcao j existente e o novo elemento deve
ser inserido mediante algum evento ocorrido na pgina ou ocasionado pelo
usurio.
O mtodo createElement a soluo para esse problema.
Vejamos como utiliz-lo:
// 1
var conteudo = document.getElementById("box");
// 2
var newElement = document.createElement(what);
// 3
newElement.appendChild(document.createTextNode("Curso iMasters Web Sites com Ajax"));
Pgina 51 de 102
// 4
conteudo.appendChild(newElement);
Vejamos o exemplo em ao: mtodo createElement.
Bom, no primeiro passo, referenciamos ao atributo ID de uma tag para que
possamos utiliz-la como referncia.
No segundo passo, definimos qual ser a nova tag a ser criada. Observe que essa
informao oriunda de um parmetro (what) da funo em questo.
Ao novo elemento criado decidimos lhe fornecer um contedo utlizando para tal
o appendChild e o createTextNode.
Finalizamos inserindo o novo elemento criado atravs do appenchild.
Assim, esse novo elemento foi criado como um novo filho do elemento
referenciado na varivel conteudo.
pt
Mtodo insertBefore
Em unidades anteriores, vimos os mtodos utilizados para criar
(createElement) e inserir (appendChild) um elemento no documento.
Voc deve ter notado que o mtodo appendChild insere o objeto sempre como o
ltimo filho (child) de um elemeto pai (parent).
Em certas ocasies isto pode ser inconveniente, pois, em determinados
momentos, precisamos inserir algum elemento em um local especfico e no
como o ltimo filho de um pai.
Portanto, pensando nessa necessidade, utilizamos o mtodoinsertBefore ao
invs do appendChild, pois assim inserimos a tag onde desejamos.
Vamos observar um exemplo utilizando o mtodo insertBefore:
// 1
var newElement = document.createElement(what);
// 2
newElement.appendChild(document.createTextNode("Ttulo do pargrafo"));
// 3
var referencia = document.getElementById("paragrafo");
// 4
var parentTag = referencia.parentNode;
// 5
parentTag.insertBefore(newElement, referencia);
Pgina 52 de 102
pt
"Mtodo" insertAfter
Para incio de conversa, preciso lhe informar que no existe o mtodo insertAfter.
Porm, se em certos momentos precisamos inserir algum elemento
anteriormente a um outro, em outros tambm precisaremos inserir algo
posteriormente a um elemento especfico.
Assim, para atingirmos ambos os objetivos (inserir um elemento anteriormente e
posteriormente) utilizamos o mtodo insertBefore, uma vez que somente ele
existe.
Para conseguirmos o recurso de inserir posteriormente procedemos assim:
Marcao HTML:
<div id="box">
<h1 id="tit">Lorem ipsum dolor sit amet</h1>
</div>
Script utilizado:
// 1
var newElement = document.createElement(what);
// 2
newElement.appendChild(document.createTextNode("Ma quande lingues coalesce, li
grammatica del resultant lingue es."));
Pgina 53 de 102
// 3
var referencia = document.getElementById("tit");
// 4
var parentTag = referencia.parentNode;
// 5
parentTag.insertBefore(newElement, referencia.nextSibling);
pt
Mtodo setAttribute
O mtodo setAttribute tem a finalidade de inserir ou modificar um atributo em
um determinado elemento existente.
Em certos momentos, quando criamos algum elemento, precisamos definir
alguns atributos para ele e o mtodo setAttribute tem esse propsito.
Consideremos o script abaixo:
// 1
var newElement = document.createElement(h1);
// 2
Pgina 54 de 102
Pgina 55 de 102
newElement.setAttribute('id','bla');
newElement.setAttribute('class','destaque');
conteudo.appendChild(newElement);
}
//-->
</script>
Mtodo getAttribute
Ao traduzirmos o termo get, obtemos: adquirir, pegar, receber, obter, dentre
outros. Portanto, logo entedemos que getAttribute "pega" o atributo de um
determinado elemento.
Assim como precisamos criar atributos, precisamos tambm obt-los afim de
manipularmos ou utiliz-los para certos objetivos.
A sintaxe dele simples, observe:
getAttribute('nomeDoAtributo');
Com o cdigo acima, obteremos o valor do atributo especificado no mtodo.
Vejamos um exemplo:
var elemento = document.getElementById("titulo");
var atributo = elemento.getAttribute('id');
alert(atributo);
Pgina 56 de 102
<script type="text/javascript">
<!-function showAttribute() {
var elemento = document.getElementById("titulo");
var atributo = elemento.getAttribute('id');
alert(atributo);
}
//-->
</script>
Pgina 57 de 102
pt
Captulo 3 - Prefcio
Gostaria de iniciar este captulo com a seguinte frase de Jeremy
Keith:"JavaScript doesn't kill websites... People with JavaScript kill websites".
Poderamos traduz-la assim: "JavaScript no destri websites Pessoas com
JavaScript destroem websites". Seria o mesmo que dizer: "Armas no matam
pessoas... Pessoas com armas que matam outras pessoas".
Tudo que est ao nosso alcance tem um propsito e um objetivo. A linguagem
JavaScript est ao nosso alcance e ela tem o seu propsito. Infelizmente alguns
desenvolvedores a utilizaram (e ainda a utilizam) de forma errnea, fazendo com
que o seu propsito se modifique.
Mas, afinal, qual o propsito do JavaScript? Por que essa linguagem tem sido
utilizada de forma errnea? So tantas respostas para duas simples perguntas,
que irei ser breve e objetivo.
Bom, primeiro vamos conhecer o propsito do JavaScript e, na medida em que
formos o conhecendo, voc ver como ela pouca utilizada de forma correta e
sensata.
A web possui trs camadas: contedo (XHTML), apresentao (CSS) e
comportamento (JavaScript). Uma complementa a outra e cada uma delas
desempenha sua funo, ou seja, o XHTML conter a marcao do contedo, as
CSS iro estilizar a camada de contedo vinculado a ela e o JavaScript ficar
responsvel por toda interatividade que tal contedo possa vir a ter com o
usurio.
Embora as camadas sejam interligadas entre si, se complementando, elas devem
ser desenvolvidas independentes uma das outras. Portanto, na camada de
contedo teremos somente XHTML, na de apresentao somente CSS e na de
comportamento o JavaScript.
Mas o que presenciamos em muitos sites algo como uma salada de camadas,
onde a camada de contedo ganhe funcionalidades que no devem ser
desenvolvidas por ela.
Vejamos alguns exemplos:
<p><font size="2" color="#ff9900">Texto</font></p><input
type="submit" onclick="algumaFuncao();" ...
O primeiro exemplo nos mostra a camada de contedo desenvolvendo a funo
de estilizar o documento, funo essa que deve ser desenvolvida pelas CSS.
O segundo exemplo ilustra a camada de contedo com funes de interao com
o usurio, papel da camada de comportamento.
Pgina 58 de 102
pt
Pgina 59 de 102
Pgina 60 de 102
ipt
Prefcio do captulo 4
Introduo ao Ajax
Pgina 62 de 102
Bom, vamos ver como acontece essa recuperao de dados de forma assncrona
e posteriormente aprenderemos como desenvolv-la baseado no Ajax.
O mtodo clssico de interao com uma interface ocorre da seguinte maneira:
ocasionamos uma ao atravs de algum evento (com o mouse, o teclado,
dentre outros) e tal ao enviada ao servidor que ir interpret-la e retornar
algum dado referente a tal ao.
Vamos compreender isto melhor baseando-se no exemplo do login que citamos
anteriormente.
O usurio efetua uma ao escolhe o login, preenche o restante dos dados e
envia o formulrio tal ao enviada ao servidor que retornar uma mensagem
ao usurio baseando-se nos dados por ele informados, ou seja, ser informado
se o cadastro foi realizado, ou se ocorreu algum erro que dever ser corrigido
para concluso do mesmo.
O mtodo de interao com uma interface baseado no Ajax ocorre da seguinte
maneira: alguma ao ocasionada atravs de algum evento (com o mouse, o
teclado, dentre outros) e uma funo associada a tal ao. Essa funo ir
comunicar-se com o servidor sem que o formulrio seja enviado e informar ao
usurio a mensagem que foi retornada referente ao que ele ocasionou.
Resumindo, voc no precisa submeter o formulrio para comunicar-se com o
servidor, basta utilizar o mtodo XMLHttpRequest (falaremos melhor sobre ele a
seguir) para se comunicar e interagir com o servidor atravs de algum evento
sem que a pgina seja recarregada.
A imagem abaixo ilustra os modelos apresentados nos pargrafos acima.
Pgina 63 de 102
pt
O objeto XMLHttpRequest
Pgina 64 de 102
status
0
1
2
3
4
no inicializado;
carregamento;
carregado;
interativo;
completo.
response
XML
open(mtodo, url,
sncrono, usurio,
senha)
true - assncrona;
usurio e senha - se o
servidor web necessitar de uma
autenticao.
send(dados)
abort()
pt
Ps no cho
pt
Captulo 5 - Prefcio
Este captulo sem dvida muito bacana e esperamos que seja ao mesmo tempo
muito produtivo.
Colocaremos em prtica, de forma simples, clara e objetiva, tudo que abordamos
no curso para que a compreenso seja privilegiada.
Neste captulo abordaremos:
pt
Introduo ao Projeto Final
Nosso projeto final ser uma agenda de contatos. Aplicativo que nos possibilitar
aprender tudo que relatamos na unidade anterior.
Pgina 67 de 102
pt
Tabela do banco de dados
Sendo assim, listamos abaixo os dados que iro compor o cadastro dos contatos
de nossa agenda de contatos.
Nome
Observaes
DDD
Telefone
Celular
E-mail
Blog / site
MSN
gTalk
Skype
Agora iremos criar nossa tabela e nela os campos que precisaremos (listados
acima).
Vejamos a estrutura final da tabela na imagem abaixo:
Algumas observaes:
O prefixo cont_ inserido em cada campo na tabela significa contato. Ele muito
til quando trabalhamos com ligaes entre tabelas (esse no ser o nosso
caso), evitando uma confuso entre um campo e outro das tabelas interligadas.
Essa dica uma prtica pessoal que utilizo quando crio minhas tabelas.
Como podemos observar, h dois campos a mais na tabela do que os listados
acima, so eles: cont_id e o cont_data_cad.
O primeiro a chave-primria da tabela, uma identificao nica de cada registro
(contato). O segundo, ser a data em que o cadastro foi realizado. Com esse dois
campos, totalizamos 11 campos na tabela.
Ento, iniciaremos criando a tabela como o nome agenda_contato.
Vejamos o exemplo:
Pgina 69 de 102
Referncia do MySQL.
Voc poder utilizar a seguinte instruo SQL para criar a tabela referenciada
acima.
--- Table structure for table `agenda_contatos`
Pgina 70 de 102
pt
cadastrados
Agenda com contatos
cadastrados
Formulrio de cadastro via
Ajax
Pgina 71 de 102
Ajax
Formulrio de edio dos dados com
Ajax
Formulrio de edio dos dados sem
Ajax
Confirmao de excluso de contato via Ajax
pt
Viso geral sobre as pginas
Pgina 72 de 102
Antes de lhe explicar a finalidade de cada pgina e o porqu de cada uma delas,
vamos observar a estrutura do nosso diretrio:
Pgina 73 de 102
pt
Compreendendo o esprito da "coisa"
Esta unidade a alma para o entendimento de todo o projeto. Ela explicar uma
metodologia para "pegar dois tipos de usurios com uma pgina s". Um que tem
o suporte ao JavaScript e poder beneficar-se do Ajax e outro que no possue o
mesmo recurso mas desempenhar as mesmas funes. Assim, todos sero
atendidos com o nosso projeto.
Para entender melhor o que estou falando, observe o seguinte cdigo presente
na pgina index.php:
Bom, o "truque" para "pegar dois tipos de usurios com uma pgina s" est
nessa marcao HTML.
Pgina 74 de 102
Mas, se esse no for esse caso, e sim outro usurio que tiver suporte ao
JavaScript, exibiremos a ele o formulrio sobre a pgina atravs do Ajax sem que
a pgina se carregue.
Vamos observar o exemplo:
ipt
Compreendendo a pgina index.php
Pgina 76 de 102
pt
Compreendendo a pgina actions.php
Pgina 77 de 102
Mas, por que isso? Pense comigo: a pgina index.php tambm realiza este
mesmo processo, ou seja, incluir as referidas pginas. Ok, mas se ela
(index.php) j inseriu por que iremos inserir novamente?
No iremos inserir novamente, simplesmente iremos utilizar a
pginaactions.php tambm atravs do Ajax e para isso, ela precisa que tais
pginas estejam inclusas.
Ento, verificamos atravs de uma condio se a pgina est sendo acessada via
Ajax, caso esteja, inclumos as pginas necessrias
-class.MySQL.php e functions.php.
Em seguinda temos outra condio, vejamos:
Sendo simplista, ela verifica se o formulrio foi submetido. Onde action igual ao
nome de um campo do formulrio.
Logo aps essa verificao, criaremos algumas variveis que contero os dados
informados no formulrio. Observemos:
Para voc perceber o quanto elas so importantes e essenciais, vou lhe mostrar
como os dados so inseridos no banco de dados, sem e com a utilizao dessas
linhas.
Pgina 78 de 102
pt
Compreendendo a pgina formulario.php
Pgina 80 de 102
Pgina 82 de 102
ipt
Pgina 83 de 102
echo
$row_rsContatos['cont_id']; ?>"
A marcao HTML do atributo href acima informa pgina trs parmetros, so
eles: exibirFormulario=true - exibe o formulrio na pgina; editar=true informa que ser um processo de edio e ID=<?php echo
$row_rsContatos['cont_id']; ?>" que informa o ID do usurio que ser
utilizado no processo de edio.
Bom, esses parmetros sero utilizados quando o aplicativo no for utilizado via
Ajax.
Agora observe o atributo rel do mesmo link (o de edio):
rel="btnEditar-<?php echo $row_rsContatos['cont_id']; ?>">
Os dados do atributo rel acima sero utilizados pelo Ajax e eles nos informam
duas coisas: que o link refere-se a edio - btnEditar - e que nos informam
tambm o ID do contato da nossa agenda.
Ento teramos um atributo assim na pgina exibida no navegador:
rel="btnEditar-10"
ipt
Compreendendo a pgina comportamentos.js
Pgina 84 de 102
openAjax()
loadFunctions()
gE()
gEs()
ativarBtnCadastro()
exibirBgBody()
boxCad()
loading()
btnOkBtnCancelar()
focusNome()
validarForm()
validaEmail()
atualizaRelatorio()
ativarBtnEditarBtnExcluir()
removerDivs()
getPageSize()
Pgina 85 de 102
Observe que nossa marcao HTML est limpa e separada do JavaScript de forma
que no temos atribuies de eventos em objetos como o exemplo seguinte:
... onclick="funcaoX('parametroY');" ...
Responsvel em chamar as funes JavaScript, precisamos chamar essas funes
de outra forma, e uma delas quando a pgina carregada.
Observemos:
Pgina 86 de 102
Pgina 87 de 102
Pgina 89 de 102
Pgina 90 de 102
Veremos agora como foi desenvolvido a funo loading(), cujo objetivo criar
um efeito de loading na tela.
Vejamos a funo abaixo:
Pgina 91 de 102
Vou aproveitar este momento para lhe falar sobre um detalhe importante:
Volte at a imagem acima que nos mostra a funoativarBtnCadatro() e repare
que a funo loading() - linha 53 - chamada aps a
funo exibirBgBody() - linha 46.
O que quero dizer com isto que a funo loading() necessita da tag div
cujo ID foi definido como bgBody e criada pela funoexibirBgBody(). Ento,
se a funo loading() for chamada anteriormente
funo exibirBgBody() teramos um erro porque no consequiramos localizar
na pgina o objeto que necessitamos -bgBody.
A linha 96 foi utilizada para sabermos o tamanho do objeto referenciado na
varivel refer. J a linha 97, para informamos que tal objeto centralizar o que
estiver dentro dele.
Em seguida, criamos uma tag img e definimos a ela os atributos src, ide width.
Na linha 102 dizemos que ela ter seu margin-top com a metade do tamanho
do objeto. Logo aps, verificamos se no h presente na pgina um objeto como
o atributo ID igual a loading e, posteriormente, inserimos a imagem como a
primeira filha - firstChild - do objeto referenciado - bgBody.
Pgina 92 de 102
A funo acima ser atribuda aos botes de submit - btnOk e reset- btnCancelar - do formulrio. Ao clicarmos no boto de submit
executamos uma funo, ao clicar no reset executamos outra.
Na linha 115, iniciamos uma funo que foi atribuda ao click no boto
cujo ID foi definido como btnOk. Criamos a varivel validacao e atravs dela
chamamos a funo validarForm() para validarmos o formulrio. Essa funo
- validarForm() - retornar true se os dados estiverem corretos ou
retornar false se os dados no estiverem corretos. Sendo assim, verificamos
na linha 117 se a funo retornoutrue, se este for caso, prosseguimos com a
funo.
Ao chegarmos na linha 118, percebemos que as coisas esto ficando mais
familiares para ns, no ? Isso porque j abordamos tais funcionalidades
atravs da funo ativarBtnCadastro().
Porm, se observarmos bem, veremos algo diferente e, essa diferena localiza-se
na linha 120. exatamente nessa linha onde utilizamos um outro mtodo do
objeto XMLHttpRequest chamadosetRequestHeader, o qual tem o
prposito de informar um cabealho para a requisio.
Pgina 93 de 102
O cabealho informado foi o Content-Type com o valor application/x-wwwform-urlencoded. Uma vez que utilizaremos o mtodo POST de requisio
HTTP, como pode ser observado na linha 119, tal cabealho se faz necessrio ao
se trabalhar com esse mtodo - POST.
Quando o cdigo nmerico do status HTTP retornado pelo servidor for igual
a 200, chamaremos a funo atualizaRelatorio(). Sua funo atualizar o
relatrio com as devidas modificaes/incluses realizadas.
Na linha 128, criamos a varivel tipoAcao, que nos dir se trabalharemos com
um processo de insero ou edio dos dados, para que assim, possamos iniciar
a constituio do valor da variveldataPost.
Iremos definir o valor do action (o equivalente ao campo action do formulario)
como cadastrar, se o valor da varivel tipoAcao for igual acadastrar. E,
tivermos editar como o valor da varivel tipoAcao, a definiremos como editar e
ao mesmo tempo o valor do ID do contato cadastrado.
preciso deixar claro que quando trabalhamos com o mtodo POST de
requisio HTTP, enviamos os dados em formato de uma "query string" da
seguinte forma:
nome=Leandro&obs=&ddd=33&tel=00000000&assim=pordiante
Ento, at a linha 143, estamos constituindo o valor da variveldataPost nesse
formato.
Observe as imagens seguintes e compreender perfeitamente como o valor da
varivel dataPost formado.
Pgina 94 de 102
Sendo assim, verificaremos se tal campo est vazio ou nulo como exemplificado
na imagem acima, linha 167.
Se tal verificao for verdadeira, ou seja, o campo est nulo ou vazio, exibiremos
uma mensagem ao usurio atravs de um "alert box". Assim, colocamos o foco
no campo que apresentou o erro e atribumos umreturn false, afinal h erro
com o campo em questo.
Para validarmos o campo de e-mail, realizamos uma validao mais apurada a
fim de garantirmos que o e-mail informado tenha um estrutura vlida.
Com essa inteno, criamos a varivel verificaEmail e informamos que ela ter
como valor a resposta que a funo validaEmail() retornar. A
funo validaEmail() retorna true se o e-mail tiver uma estrutura vlida
e false se no tiver.
Como podemos observar na linha 183, estamos verificando se o e-mail no tem
uma estrutura bsica, e se isto ocorrer, alertamos o usurio, colocamos o foco no
campo de e-mail e atribumos um return false.
Se tudo ocorrer bem, ou seja, os dados foram informados como desejvamos,
atribumos um return true.
Lembre-se que a funo btnOkBtnCancelar() verifica se a
funovalidarForm() retornou true para prosseguir com o cadastro ou a edio.
Ela retorna true se o e-mail informado pelo usurio tiver uma estrutura vlida
ou false se no tiver.
Pgina 96 de 102
Pgina 97 de 102
Observe a linha 216 e ver que iniciamos selecionando todos os links contidos
na pgina, ou melhor, todas as tags a, afinal elas foram utilizadas para
desempenharem o papel como boto de edio e excluso dos contatos da nossa
agenda. J na linha 217 realizamos um loop entre todos os links presentes na
pgina.
Na linha 219, atrbumos varivel atributoRel o valor do atributo relda tag a.
Repara que definimos tal valor como uma string - new String() - para que
pudssemos utilizar o mtodo substring()posteriormente.
As tags a que nos interessam, so aquelas que possuem no atributo relo
valor btnEditar ou btnExcluir, assim, verificaremos se tal valor consta no
referido atributo.
Pgina 98 de 102
Pgina 99 de 102
A partir da linha 250, estamos diante de cdigos conhecidos sabemos o que eles
fazem e o por que esto ali.
Mais uma vez a diferena encontra-se ao informamos o mtodo openURL que
ser requistada.
Como desta vez ser um processo de excluso, temos o seguinte nalinha 251.
actions.php?ajax=true&excluir=true&ID=' + ID
Assim, informamos que o processo ser de excluso - excluir=true - e
juntamente, o ID do registro na tabela a ser excludo.
Ela tem a funo de remover duas div que criamos: bgBody e boxCad. A
primeira que simula o fundo sobre o body e a segunda que utilizada para
colocarmos o formulrio dentro dela.
Na linha 271 removemos a div cujo ID foi definido como bgBody. Agora, para
removermos a div cujo ID foi definido como boxCad nalinha 273, precisamos
conferir se tal div realmente existe. Para isso, vamos observar a linha 272.
Mas, por qu isso? Simples, porque no processo de excluso no chamamos a
funo boxCad() para que tal div seja criada. Observe alinha 255 da
funo ativarBtnEditarBtnExcluir() e ver que somente a
funo exibirBgBody() foi chamada.
pt
Consideraes finais
Google
Fruns iMasters
ipt
Referncias bibliogrficas
BrainJar
Google Suggest
Mozilla Developer Center - MDC
MySQL
PHP
QuirksMode
W3C Schools