Beruflich Dokumente
Kultur Dokumente
Websites Interativos
com
JavaScript
Helder da Rocha
Rev.: JS11-01-1999/01 A4 (AB05)
Janeiro de 1999
Netscape Navigator, Netscape Communicator, LiveWire, LiveConnect e JavaScript so marcas registradas da Netscape
Communications Inc. ActiveX, ASP, Active Server Pages, Microsoft Internet Explorer, FrontPage e JScript e VBScript
so marcas registradas da Microsoft Corp. Java marca registrada da Sun Microsystems. Quaisquer outras marcas
registradas citadas nesta obra pertencem aos seus respectivos proprietrios.
ii
Contedo
Prefcio
1. Introduo a JavaScript
O que JavaScript?.................................................................................................1-2
JavaScript no Java ...................................................................................................... 1-3
Quem suporta JavaScript? ............................................................................................. 1-3
O que se pode fazer com JavaScript? .......................................................................... 1-4
Como programar com JavaScript? ............................................................................... 1-4
Exerccios .............................................................................................................1-13
2. Sintaxe e estrutura
Variveis................................................................................................................2-2
Tipos de dados e literais...........................................................................................2-3
Caracteres especiais ........................................................................................................ 2-6
Exerccios .............................................................................................................2-12
iii
3. Funes e objetos
Funes nativas .......................................................................................................3-1
Funes definidas pelo usurio..................................................................................3-2
Exerccios......................................................................................................................... 3-4
Objetos ...................................................................................................................3-4
Construtores e o operador "new" ................................................................................ 3-5
Propriedades .................................................................................................................... 3-7
Mtodos ........................................................................................................................... 3-8
Exerccios .............................................................................................................3-20
Array ...................................................................................................................4-10
Exerccios....................................................................................................................... 4-12
Math ....................................................................................................................4-13
Exerccios....................................................................................................................... 4-15
Date .....................................................................................................................4-15
Exerccios....................................................................................................................... 4-17
iv
5. As janelas do browser
Objeto Window.......................................................................................................5-2
Janelas de dilogo............................................................................................................ 5-3
Mtodos para manipular janelas ................................................................................... 5-4
Janelas com aparncia personalizada............................................................................ 5-5
Propriedades da barra de status .................................................................................... 5-5
Eventos ............................................................................................................................ 5-6
Frames HTML....................................................................................................5-10
Usando frames em JavaScript ..................................................................................... 5-13
Exerccios .............................................................................................................5-15
6. O Browser
Objeto Navigator ....................................................................................................6-1
Identificao do nome do fabricante........................................................................... 6-2
Identificao da verso .................................................................................................. 6-3
Identificao da plataforma........................................................................................... 6-3
Exerccio Resolvido........................................................................................................ 6-4
Soluo ............................................................................................................................. 6-4
Mtodos ........................................................................................................................... 6-5
Data-tainting..........................................................................................................6-8
Exerccio ................................................................................................................6-9
7. Navegao
Objeto History ........................................................................................................7-1
Exerccios......................................................................................................................... 7-2
8. A pgina HTML
Objeto Document ....................................................................................................8-1
Mtodos ........................................................................................................................... 8-3
Exerccios ...............................................................................................................8-9
9. Imagens
Image......................................................................................................................9-1
Eventos ............................................................................................................................ 9-5
Exerccio Resolvido........................................................................................................ 9-6
Soluo ............................................................................................................................. 9-6
Exerccios ...............................................................................................................9-7
10. Formulrios
Objeto Form .........................................................................................................10-1
Elementos de um formulrio ...................................................................................... 10-3
Mtodos ......................................................................................................................... 10-4
Eventos .......................................................................................................................... 10-4
vi
11. Cookies
Cookies em HTTP ...............................................................................................11-1
Criao de cookies via cabealhos HTTP................................................................. 11-2
Criao de cookies via HTML .................................................................................... 11-4
Espao de nomes de um Cookie................................................................................ 11-5
Recuperao de cookies............................................................................................... 11-5
Cookies em JavaScript...........................................................................................11-6
Carrinho de compras .............................................................................................11-8
Exerccio Resolvido...................................................................................................... 11-8
Soluo .........................................................................................................................11-10
Apndice A Bibliografia
vii
viii
Prefcio
A INTERNET NUNCA MAIS FOI A MESMA DESDE QUE TIM BERNERS-LEE props em maro de 1989,
que a gerncia do CERN adotasse um sistema de informaes distribudo baseado em hipertexto,
como soluo para os problemas de comunicao da instituio. A CERN Laboratrio Europeu
para Fsica de Partculas uma das maiores instituies cientficas do mundo e seus laboratrios
esto distribudos por vrias cidades localizadas em 19 pases da Europa. Berners-Lee demonstrou
como a informao se perdia diariamente no CERN, um ambiente que ele classificou como um
modelo em miniatura do resto do mundo em alguns anos[1]. O sistema proposto, inicialmente
chamado de Mesh, acabou por convencer seus gerentes e foi implantado no CERN no ano
seguinte j com o nome de World Wide Web[2].
Berners-Lee estava certo. O CERN era uma miniatura do mundo. Hoje, 10 anos depois, a
Internet no mais a mesma. Hoje a Internet a World Wide Web. Todos os servios da Internet se
renderam ao poder da Web e linguagem HTML, que a sustenta. At o servio de correio eletrnico,
campeo de trfego na Internet por muitos anos, que por muito tempo exigia aplicaes especficas,
separadas do browser, hoje lido dentro de um browser, atravs de pginas HTML.
A Web evoluiu e ocupou todos os espaos fazendo jus ao nome World Wide. Pginas
interligadas por hipertexto no so mais novidade. Existem tantas hoje que difcil separar o joio do
trigo, e seria impossvel encontrar alguma coisa se a Web no tivesse evoludo e se tornado mais
interativa ainda. As pginas deixaram de ser meras pginas e passaram a se comportar como
aplicaes. O browser evoluiu junto e passou a ser tratado como uma interface universal, capaz de
oferecer ao usurio acesso interativo e uniforme a programas remotos em diversas plataformas.
Todas essas mudanas impulsionaram o surgimento de novas tecnologias, pois o HTML era
bastante limitado. HTML foi construdo apenas para estruturar pginas de hipertexto. Como poderia
realizar buscas na Web ou enviar e-mail? Esta necessidade impulsionou pesquisas por organizaes
abertas e fabricantes de produtos para a Web. Vrias propostas surgiram. Algumas propunham at a
substituio do HTML por outra linguagem. Poucas idias, porm, tiveram aceitao to ampla
como a tecnologia CGI que ainda hoje bastante popular. CGI tornou possvel o surgimento das
primeiras aplicaes Web verdadeiras, permitindo que o cliente manipulasse aplicaes remotas
usando o seu browser como interface. Isto provocou uma revoluo no desenvolvimento de
aplicaes distribudas, pois HTML com CGI tornou possvel a criao de interfaces baratas, fceis
de desenvolver e fceis de usar.
Mas as interfaces Web, por dependerem de uma pgina, esttica, no ofereciam a mesma
interatividade do lado do cliente. Para fazer uma animao, por exemplo, era preciso fazer sucessivas
requisies ao servidor, gerando trfego de rede desnecessrio. Qualquer tecnologia do cliente
depende da capacidade do browser suport-la. Muitos novos recursos foram introduzidos pela
ix
Netscape por ser na poca, lder absoluto do mercado de browsers. Inicialmente ofereceu suporte a
Java, linguagem da Sun. Depois lanou LiveScript, posteriormente rebatizado de JavaScript. Assim,
finalmente a programao de aplicaes deixou de ser uma exclusividade do servidor e pginas Web
deixaram de ser estticas. As novas pginas movidas a JavaScript passaram a se comportar como
componentes de aplicaes distribudas, e so hoje indispensveis no desenvolvimento de Web sites
interativos.
Objetivos
Este livro tem como objetivo apresentar e explorar a linguagem JavaScript uma das linguagens
mais populares do mundo e a mais utilizada na Internet para o desenvolvimento de Web sites
interativos. Em 12 captulos, apresentamos a estrutura e sintaxe da linguagem JavaScript e seus
recursos de manipulao da pgina, formulrios, janelas do browser, frames, imagens e applets; atravs
de exemplos e exerccios resolvidos, que refletem aplicaes prticas como comunicao entre
frames, gerao de documentos on-the-fly, validao de campos de formulrios e a criao de carrinhos
de compras virtuais.
Desde que foi criada em 1995 por Brendan Eich da Netscape[3], diversas implementaes
diferentes de JavaScript tem aparecido, na Web e fora dela, em browsers e servidores. Todas as
implementaes compartilham um ncleo comum (padronizado pela especificao ECMA-262[5]), e
acrescentam estruturas especficas ao ambiente onde operam (um browser, um servidor, um sistema
de arquivos). O objetivo deste livro explorar apenas o JavaScript que opera nos browsers, chamado
de client-side JavaScript.
O client-side JavaScript tambm no possui uma implementao padro. Na poca em que esta
edio foi concluda (janeiro de 1999) havia duas verses recentes de JavaScript: a da Netscape,
chamada de JavaScript 1.3, e a da Microsoft, chamada de JScript 5.0[4]. O ncleo das duas
semelhante e obedece ao ECMA-262. A implementao das caractersticas client-side realizada
atravs de um modelo de objetos que mapeia objetos JavaScript a propriedades do browser e da
pgina HTML. As duas implementaes obedecem ao W3C/DOM[6]. Porm, vrios aspectos da
sintaxe, implementao e extenses presentes nas duas implementaes as fazem incompatveis entre
si. Uma das novas tecnologias suportadas por scripts o Dynamic HTML (DHTML). Desenvolver
pginas que usam DHTML hoje duas vezes mais complexo do que deveria ser, j que preciso
levar em conta as diferenas do JavaScript de cada browser.
Este livro no abordar as verses mais recentes do JavaScript, nem o DHTML. Optamos por
usar como base o JavaScript 1.1, que a implementao mais estvel, suportada pelo maior nmero de
browsers. JavaScript 1.1 foi introduzida com a verso 3.0 do Netscape Navigator. uma verso
pequena, simples, til e totalmente compatvel com as novas verses da Netscape e da Microsoft. Foi
base para o padro ECMA-262. Neste livro, usamos JavaScript 1.1 como referncia, abordando
tambm alguns recursos que existem no Internet Explorer, mas deixando de fora recursos menos
usados que existem somente nos browsers de um nico fabricante, seja Netscape ou Microsoft.
Cobrimos, assim, os aspectos fundamentais de programao do cliente, de forma independente de
browser. Se no futuro voc decidir usar DHTML e os novos recursos dos browsers, descobrir que
j conhece os fundamentos da linguagem, que so os mesmos do JavaScript apresentado aqui.
x
Descrio do contedo
O livro est organizado em 12 captulos e pelo menos um apndice1 contendo as fontes de
informao consultadas e recursos na Web. O cdigo-fonte de quase todos os exemplos, exerccios
propostos, solues e exerccios resolvidos est em um disquete que o acompanha.
Ao final de cada captulo, ou de sees de um captulo, h uma lista de exerccios propostos,
que aplicam os assuntos apresentados. Ao todo so mais de 40 exerccios propostos, a maior parte
com soluo em disquete. Muitos fornecem um esqueleto que o programador pode usar como base,
para se concentrar apenas nos aspectos relevantes ao problema.
Alm dos exerccios propostos, vrios recursos do JavaScript so apresentados atravs de
exemplos detalhados, na forma de exerccios resolvidos. Nestes exerccios, um problema proposto
solucionado expondo as etapas da resoluo, decises tomadas e o cdigo utilizado, com
comentrios. So 11 exerccios resolvidos ao todo.
O primeiro captulo, Introduo a JavaScript, tem como objetivo apresentar uma breve
introduo e viso geral da linguagem e sua utilizao no browser. Depois de apresentados alguns
exemplos demonstrando pequenas aplicaes e manuseio de eventos, um exerccio completo
proposto, e resolvido em seguida, com o objetivo de familiarizar o programador com o cdigo
JavaScript e o modelo de objetos do browser.
Os captulos 2 a 4 tratam do ncleo comum da linguagem JavaScript, assim como definida na
especificao ECMA-262, JavaScript 1.1 e JScript 3.1. O captulo 2 apresenta a sintaxe e estruturas
elementares da linguagem, o captulo 3 introduz os conceitos de objetos, prottipos, funes,
mtodos e propriedades e o captulo 4 apresenta os objetos nativos do JavaScript.
Como este livro utilizado como apostila em treinamentos abertos e fechados, o seu formato pode mudar de acordo
com a carga horria e necessidades do contratante do treinamento. O formato de 12 captulos e 1 apndice refere-se
verso bsica (B).
1
xi
xiii
Agradecimentos
Este livro comeou aps um curso que eu ministrei na IBPINET em So Paulo sobre Web Sites
Interativos. Inicialmente, era apenas pouco mais que um guia de referncia que eu compilei para uso
prprio, com exemplos extrados da documentao da Netscape. Aps o curso, com o feedback dos
alunos, resolvi reorganizar o assunto em um formato mais didtico, com alguns exemplos novos,
resultantes de questes surgidas em sala de aula. Isto se repetiu vrias vezes at chegar forma atual.
Este livro, portanto, existe graas aos alunos dos cursos realizados na IBPINET e Itelcon, que
interagiram de vrias formas, revisando seu contedo, sugerindo mudanas na apresentao do
assunto, apontando erros e propondo exemplos prticos.
Pela oportunidade de poder ministrar os cursos que deram forma a este livro, gostaria de
agradecer tambm Fbio Marinho e Adriana Guerra, diretores do IBPINET, e a Joberto Martins e
William Giozza, diretores da Itelcon.
Crticas e sugestes
Este livro est sempre sendo revisado, atualizado e ampliado periodicamente e cada vez que
utilizado em um curso. Cuidados foram tomados para garantir a apresentao dos assuntos de forma
clara, didtica e precisa, mas eventualmente podem escapar erros, imprecises e trechos obscuros.
Sugestes, crticas e correes so sempre bem vindas e podem ser endereadas por e-mail a
hlsr@uol.com.br ou helder@ibpinetsp.com.br. Sua opinio muito importante e contribuir
para que futuras edies deste livro e outros livros e apostilas possam ser ainda melhores.
Helder L. S. da Rocha
Campina Grande, PB, 23 de fevereiro de 1999.
xiv
Introduo a JavaScript
A LINGUAGEM HTML HYPERTEXT MARKUP LANGUAGE, foi criada exclusivamente para
definir a estrutura de uma pgina. Esforos para usar HTML como linguagem de formatao
de pgina, visando uma melhor apresentao grfica resultaram ineficazes1. De forma
semelhante, HTML no linguagem de programao. No possui as estruturas essenciais para
realizar operaes e controle de fluxo. uma linguagem declarativa criada para estruturar
pginas de hipertexto atravs de marcadores que descrevem a funo de blocos de texto.
Com HTML, fcil criar interfaces do usurio sofisticadas, usando recursos de
formulrio como botes, caixas de seleo, etc. A coleo de componentes de formulrio
conta com dois tipos de botes que respondem a eventos do usurio. Um dos botes, ao ser
apertado, provoca um evento permite enviar os dados coletados no formulrio para um
programa no servidor (CGI2) para processamento remoto. No h processamento local.
Os componentes de formulrio existem desde HTML 1.1 (1994) e com eles surgiram as
primeiras aplicaes Web. Essas aplicaes sempre tinham que se comunicar com o servidor
para realizar qualquer operao. Para fazer uma simples conta era necessrio enviar os dados
para o servidor, rodar um programa na mquina remota e aguardar uma nova pgina retornada
com o resultado. Isso era necessrio porque no havia como fazer contas simples em HTML.
Plug-ins proprietrios foram os primeiros a introduzir aplicaes Web executando do
lado do cliente. Depois vieram os applets Java, que tiveram mais sucesso que os plug-ins por
no se limitarem a uma nica plataforma. Os plug-ins e os applets usam o HTML apenas como
base para aparecerem no browser. Utilizam uma interface prpria que ocupa uma subjanela,
toda a janela ou parte de uma janela do browser. No aproveitam os recursos do HTML.
preciso desenvolver sua interface usando uma outra linguagem, o que torna o
desenvolvimento bem mais complexo que a criao de formulrios HTML.
Vrias verses do HTML continham descritores de apresentao. Eles foram considerados obsoletos pela
ltima recomendao do W3C: HTML 4. A linguagem CSS (folhas de estilo em cascata) a atual recomendao
do W3C para a formatao de pginas HTML
2 Common Gateway Interface especificao que define o formato de programas cuja execuo iniciada por
um servidor Web.
1
1-1
O que JavaScript?
JAVASCRIPT UMA LINGUAGEM de programao interpretada criada em 1995 por Brendan
Eich da Netscape como uma extenso do HTML para o browser Navigator 2.0. Hoje existem
implementaes JavaScript nos browsers dos principais fabricantes. Mas o uso de JavaScript
no tem se limitado aos browsers. Tem sido usado, em menor escala, como linguagem de
suporte a tecnologias de gateway para servidores HTTP e at como linguagem de roteiro de
propsito geral. Embora ainda seja mantida e estendida pela Netscape, parte da linguagem
JavaScript j padro proposto pela ECMA organizao europia para padres em
comunicaes, que visa transform-la em padro Web3.
JavaScript do lado do browser (client-side JavaScript) tem evoludo e alcanado uma
estabilidade razovel como um padro da Web. hoje (1998), suportada pelas principais
verses de browser que povoam a Web e a linguagem de programao mais popular do
mundo, com presena em 35 milhes de pginas Web4.
JavaScript no servidor (server-side JavaScript) uma linguagem que possui o mesmo
ncleo que o JavaScript do lado do cliente, mas acrescenta estruturas exclusivas para interao
com entidades do servidor. No tem ainda a estabilidade necessria para ser considerada um
padro pois suas implementaes so praticamente restritas extenses Netscape, como a
tecnologia LiveWire. O ncleo da linguagem JavaScript tambm est presente na tecnologia
ASP (Active Server Pages) da Microsoft, mas LiveWire e ASP so incompatveis entre si.
Este curso trata exclusivamente do client-side JavaScript, que roda no browser. No
restante deste livro, chamaremos client-side JavaScript simplesmente de JavaScript.
JavaScript uma linguagem de programao baseada em objetos. Trata suas estruturas
bsicas, propriedades do browser e os elementos de uma pgina HTML como objetos
(entidades com propriedades e comportamentos) e permite que sejam manipulados atravs de
eventos do usurio programveis, operadores e expresses. JavaScript oferece recursos
interativos que faltam no HTML e permite a criao de pginas interativas e dinmicas, que
so interpretadas localmente pelo browser, sem precisar recorrer a execuo remota de
programas no servidor.
3
4
http://www.ecma.ch/stand/ecma-262.htm[5]
http://home.netscape.com/newsref/pr/newsrelease599.html
1-2
JavaScript no Java
JavaScript freqentemente confundida com a linguagem Java, provavelmente devido
semelhana do nome. H tambm algumas semelhanas na sintaxe. Tudo mais diferente. O
nome script, que quer dizer roteiro, j indica que se trata de uma linguagem interpretada.
Alm do nome, podemos apontar diversas outras diferenas:
1-3
Para garantir uma maior segurana, todos os scripts devem sempre ser testados nos os
browsers, verses e plataformas utilizadas pelo pblico-alvo de um site ou pgina.
1-4
A especificao da Netscape permite ainda incluir JavaScript dentro de qualquer atributo HTML para passar
valores ou expresses e alterar caractersticas da pgina. um recurso disponvel apenas nos browsers Netscape.
5
1-5
//
--> </script>
</BODY>
Tudo o que est em negrito, na listagem acima, JavaScript. O que no est em negrito
cdigo HTML.
O cdigo JavaScript foi colocado entre comentrios HTML <!-- e -->. Isto usado para
proteger contra browsers antigos, que no suportam JavaScript, e podem exibir o cdigo na
pgina em vez de execut-lo ou ignor-lo. Browsers que suportam JavaScript ignoram os
comentrios HTML dentro de blocos <SCRIPT> e tentam interpretar o cdigo. Browsers que
suportam uma verso inferior a JavaScript 1.1 iro ignorar todo o bloco.
No cdigo acima, autor uma varivel que recebe por atribuio o texto Cyrano de
Bergerac; document um objeto 6 JavaScript que representa a pgina da janela atual do
browser. lastModified uma propriedade 6 da pgina (texto contendo a data de ltima
modificao do arquivo) e write() um mtodo 6 que escreve o texto passado como parmetro
na pgina representada por document.
O ponto (.) usado para que se possa ter acesso a propriedades e mtodos de um
objeto. O sinal + usado para concatenar caracteres e strings. As duas barras (//)
representam um comentrio JavaScript.
Ao se carregar a pgina HTML contendo o cdigo acima em um browser, obtm-se
uma pgina com a informao:
ltima modificao: Quarta-feira, 2 de abril de 1998 13:11:47 0300
Autor: Cyrano de Bergerac
Arquivos importados
Muitas vezes necessrio realizar um mesmo tipo de tarefa mais de uma vez. Para esse tipo de
problema JavaScript permite que o programador crie funes que podem ser chamadas de
outras partes da pgina vrias vezes. As funes geralmente ficam em um bloco <SCRIPT>
separado, antes de todos os outros blocos, para que sejam carregadas antes que a pgina seja
exibida. Se vrias pginas usam as mesmas funes JavaScript definidas pelo autor da pgina,
uma boa opo coloc-las em um arquivo externo e import-lo nas pginas que precisarem
delas. Este arquivo deve ter a extenso .js e conter apenas cdigo JavaScript (no deve ter
descritores HTML, como <SCRIPT>). Por exemplo, suponha que o arquivo biblio.js possua
o seguinte cdigo JavaScript7:
1-6
function soma(a, b) {
return a + b;
}
Para carregar esta funo e permitir que seja usada em outra pgina, usa-se o atributo SRC do
descritor <SCRIPT>:
<script LANGUAGE=JavaScript SRC="biblio.js"></script>
(...)
<script>
resultado = soma(5, 6);
document.write("<P>A soma de 5 e 6 " + resultado);
</script>
preciso que o servidor Web esteja configurado para relacionar a extenso .js como o
tipo MIME application/x-javascript para que a carga, de um arquivo externo seja
possvel.
Tratamento de eventos
A linguagem JavaScript introduziu no HTML como extenso 13 novos atributos8, que
permitem a captura de eventos disparados pelo usurio, como o arrasto de um mouse, o clique
de um boto, etc. Quando ocorre um evento, um procedimento de manuseio do evento
chamado. O que cada procedimento ir fazer pode ser determinado pelo programador.
A linguagem HTML j possui trs eventos nativos no programveis, que so:
1-7
Tudo o que aparece entre as aspas duplas do atributo ONCLICK JavaScript. ONCLICK
um atributo HTML, criado como extenso para dar suporte ao evento de clicar o boto.
O cdigo JavaScript que est em negrito ser interpretado quando o usurio apertar o
boto com o mouse (onclick). A instruo alert() cria uma janela de alerta (acima) com a
mensagem passada como parmetro (entre parnteses e aspas no cdigo em negrito). Observe
que as aspas usadas dentro do mtodo alert() so aspas simples j que aspas duplas j esto
sendo usadas para representar o atributo HTML.
Cdigo JavaScript tambm pode ser acionado atravs de eventos nativos do HTML,
como links e botes de submisso de formulrios usando uma URL javascript::
<a href="javascript:alert('Tem Certeza?)"> link </a>
O cdigo acima far com que o evento HTML (clicar no link) provoque a execuo do
cdigo JavaScript aps o prompt javascript:. Este prompt tambm pode ser usado na barra
de Location do browser. Oferece acesso direto ao interpretador.
Nem todos os elementos HTML suportam atributos de eventos. Tambm nem todas as
operaes JavaScript que so possveis em blocos, como escrever na pgina, so possveis
aps a carga completa da pgina, se acionados por um evento.
Os treze procedimentos de manuseio de eventos introduzidos por JavaScript so:
Atributo
HTML
onclick
onselect
Quando o procedimento
executado
Quando um objeto clicado pelo mouse
Quando um objeto selecionado
1-8
Introduo prtica
O objetivo desta seo apresentar uma rpida introduo linguagem JavaScript. No so
explorados assuntos relacionados sintaxe da linguagem. O objetivo dar uma viso geral da
linguagem e facilitar a absoro das informaes apresentadas nos captulos posteriores.
A melhor forma de introduzir a linguagem atravs de um exemplo. No exemplo a
seguir, teremos contato com vrios tpicos que veremos em detalhes nos captulos a seguir,
como: sintaxe de expresses, variveis, objetos, mtodos e propriedades, funes e eventos.
Exerccio resolvido
Construa uma aplicao Web de
entrada de dados que oferea uma
interface semelhante da figura ao
lado. O objetivo construir uma lista
de usurios com seus e-mails para
posterior envio pela rede.
Requisitos:
a) Quando o usurio apertar no
boto Digitar Nome, deve
aparecer uma janela de dilogo
como mostrada na figura para
que ele possa digitar um nome.
Apertando no boto Digitar Email, uma janela semelhante
dever aparecer, para recuperar o
e-mail.
b) Apertando o boto Cadastrar, os dados digitados mais recentemente devem ser
armazenados no campo de texto no formato:
Usurio nmero <nmero>
Nome: <nome do usurio>
E-mail: <e-mail do usurio>
O nmero deve ser incrementado cada vez que um novo usurio for cadastrado. Cada
novo usurio cadastrado no deve apagar os anteriores, mas aumentar a lista.
1-9
Soluo
O arquivo sem JavaScript est listado abaixo. Os botes esto presentes mas no respondem a
eventos. No aparece a data de hoje.
<html>
<head>
<title>Inscrio</title>
</head>
<body bgcolor=white>
<form>
<h2 align=center>Cadastro</h2>
<div align=center>
<p><input type=button value="Digitar Nome">
<input type=button value="Digitar E-mail">
<input type=button value="Cadastrar">
<p><textarea rows=10 cols=40 name=Area></textarea>
</div>
</form>
</body>
</html>
A primeira alterao, para cumprir o requisito (a), consiste na programao dos eventos
ONCLICK dos dois primeiros botes. preciso coletar uma linha de texto do usurio e
armazen-la em uma varivel global. Para declarar uma varivel globalmente accessvel em
JavaScript, usamos a palavra-chave var antes do nome escolhido. As declaraes devem estar
em um bloco <SCRIPT> que seja interpretado antes que um boto seja interpretado, ento as
colocamos no <head>:
<head>
<title>Inscrio</title>
<script>
var nome
var email
</script>
</head>
1-10
um mtodo JavaScript que abre uma janela de dilogo contendo um campo de entrada de
dados (como o da figura). O usurio pode digitar texto no campo disponvel e este ser
devolvido como valor de retorno, caso o OK seja apertado. Para colocar o valor na varivel
nome, podemos fazer:
nome = prompt("Digite o Nome", "")
Fazemos isto dentro do atributo ONCLICK de cada boto, para os dois valores, para que
o comando s seja executado quando o usurio apertar o boto:
<input type=button value="Digitar Nome"
onclick="nome=prompt('Seu Nome', '')">
<input type=button value="Digitar E-mail"
onclick="email=prompt('Email', '')">
O segundo requisito requer instrues para o atributo ONCLICK do terceiro boto. Mas
necessrio realizar diversas operaes:
O ideal, neste caso, criar uma funo que realize as operaes acima e chamar esta
funo a partir do atributo ONCLICK do terceiro boto. Acrescentamos a funo no bloco
<SCRIPT> do incio da pgina e construmos o string concatenando as variveis:
<script>
var nome;
var email;
var num = 0;
function escrever() {
info = "Usurio nmero " + (++num) + "\n";
info += "Nome: " + nome + "\n";
info += "E-mail: " + email + "\n\n";
}
</script>
1-11
propriedade value uma varivel que pode receber ou conter texto. Dentro da funo,
concatenamos o texto (em info) com o texto j existente na caixa de texto (e visvel na tela)
em value:
function escrever(quadro) {
info = "Usurio nmero " + (++num) + "\n";
info += "Nome: " + nome + "\n";
info += "E-mail: " + email + "\n\n";
quadro.value += info;
}
Uma referncia para o campo de textos (<TEXTAREA>) pode ser obtido a partir do
formulrio no qual est contido, atravs de seu nome. Os nomes dos componentes de um
formulrio so propriedades do formulrio. Dentro de qualquer componente, pode-se obter
uma referncia ao formulrio em que est contido usando this.form. A expresso:
this.form.Area
Agora, ao se apertar o boto, a funo escrever ser chamada. Dentro dela, a varivel
quadro receber o valor em this.form.Area, como se tivesse ocorrido uma atribuio do tipo:
quadro = this.form.Area
O ltimo requisito pede para que a pgina exiba a data de hoje na pgina. A exibio no
depende de eventos do usurio. Deve ser uma transformao realizada somente na carga e
exibio da pgina, portanto, inclumos o cdigo em um segundo bloco <SCRIPT> no corpo
da pgina.
Utilizamos a instruo new Date() para obter a data de hoje e passamos para uma
varivel hoje, que criamos. No preciso usar a palavra var para definir variveis:
hoje = new Date(); // armazena a data de hoje
A instruo new um operador utilizado para criar novos objetos. Date() uma
funo especial, chamada de construtora. Ela constroi o novo objeto e define mtodos e
propriedades que podem ser invocados a partir do objeto. hoje, portanto, um objeto que
representa a data de hoje e tem mtodos, definidos pela funo construtora Date(). Uma data
um tipo de dados abstrato que possui vrias propriedades. S precisamos de trs: dia, ms e
ano. A nica forma de obt-las em JavaScript invocando mtodos sobre hoje. Os mtodos
1-12
Tivemos que somar 1 ao valor retornado pelo mtodo getMonth() porque ele retorna
os meses contados a partir de 0 e terminando em 11. Somamos 1900 ao valor retornado por
getYear() porque o mtodo retorna o nmero de anos desde 1900. A ltima instruo,
imprime os valores na pgina. Veja o cdigo completo no arquivo formcodsol.html.
Exerccios
1.1
1.2
1-13
Sintaxe e estrutura
NESTE CAPTULO, APRESENTAREMOS A SINTAXE E ESTRUTURA DA LINGUAGEM JAVASCRIPT.
O assunto apresentado aqui se aplica ao ncleo da linguagem JavaScript que independe de
onde usada: no browser, no servidor ou como linguagem independente. O ncleo da
linguagem especificado no padro ECMA-262 [5].
Como a maior parte das linguagens de programao, o cdigo JavaScript expresso em
formato texto. O texto do cdigo pode representar instrues, grupos de instrues,
organizadas em blocos e comentrios. Dentro das instrues, pode-se manipular valores de diversos
tipos, armazen-los em variveis e realizar diversas de operaes com eles.
Uma instruo JavaScript consiste de uma srie de smbolos, organizados de forma
significativa de acordo com as regras da linguagem, que ocupam uma nica linha ou terminam
em ponto-e-vrgula. Os caracteres de retorno de carro (<CR>) e nova-linha (<LF>) so
considerados terminadores de linha em JavaScript. O interpretador automaticamente
acrescenta um ponto-e-vrgula quando os encontra, terminando a instruo. Utilizar ponto-evrgula para terminar cada instruo, portanto, opcional em JavaScript, j que o interpretador
faz isto automaticamente, porm, trata-se de uma boa prtica de programao.
Com exceo dos caracteres que provocam novas linhas, nenhum outro tipo de
caractere que representa espao em branco (espao horizontal, nova-pgina ou tabulaes)
interferem no cdigo. Onde se usa um espao pode-se usar 200 espaos. O espao em branco
pode e deve ser utilizado para endentar blocos de cdigo e torn-lo mais legvel. Por exemplo,
os dois trechos de cdigo abaixo so equivalentes mas o primeiro bem mais legvel:
x = 5;
function xis() {
var x = 0;
while (x < 10) {
x = x + 1;
}
}
x=5;function xis()
{var x=0;while(x<10)
{x=x+1}} xis()
document.write("x " + x)
xis();
document.write("x " + x);
2-1
Variveis
Variveis so usadas para armazenar valores temporrios na maior parte das instrues em
JavaScript. Para definir uma varivel, basta escolher um nome que no seja uma palavra
reservada e lhe atribuir um valor:
preco = 12.6;
produto = "Livro";
Uma varivel tambm pode ser declarada sem que receba um valor. Para isto
necessrio usar a palavra-chave var:
var preco;
2-2
A varivel preco acima possui o valor undefined. Este valor usado sempre que uma
varivel no possuir um valor definido.
O escopo ou alcance de uma varivel depende do contexto onde definida ou declarada.
Uma varivel declarada ou definida pela primeira vez dentro de um bloco tem escopo local ao
bloco e no existe fora dele. Variveis declaradas ou definidas fora de qualquer bloco so
globais e so visveis em todo o programa ou pgina HTML:
<script>
global = 3; // escopo: toda a pagina
function func() {
local = 5;
// escopo: somente o bloco atual
global = 10;
}
// local nao existe aqui.
// global tem valor 10! (pode ser lida em qualquer lugar da pagina)
</script>
O uso de var opcional na definio de variveis globais. Variveis locais devem ser
definidas com var para garantir que so locais mesmo havendo uma varivel global com o
mesmo nome, por exemplo:
g = 3; // varivel global
function func() {
var g = 10;
// esta varivel g local!
}
// g (global) tem o valor 3!
2-3
Tipos e objetos
object
nat ivos
Tipo de dados
nativo que
ECM AScript
function
Tipo de objeto que
representa funes,
mtodos e
construtores
representa
colees de
propriedades
contendo valores de
tipos primitivos,
function ou object
boolean
representa valores
booleanos
Object
Boolean
Function
Array
Number
Date
String
Math
number
undefined
null
representa o valor
nulo
Global
undefined
representa valores
ainda no definidos
Objetos nativos
embutidos
null
representa nmeros
de ponto-flutuante
IEEE 754 com pr eciso
de 15 casas decimais
(64 bits)
st ring
true
false
representa cadeias
ordenadas (e
indexveis) de
caracteres Unicode.
NaN
Infinity
-Infinity
"\u0000 - \uFFFF"
'\u0000 - \uFFFF'
''
""
"abcde012+$_@..."
// s string
// y number
// s agora boolean
hexadecimal: 0123456789abcdef
decimal ponto-flutuante: .0123456789eoctal: 01234567
- 10;
// converso automtica
O tipo number tambm representa alguns valores especiais, que so infinito positivo
(Infinity), infinito negativo (-Infinity) e indeterminao (NaN - Not a Number).
Booleans representam os estados de ligado e desligado atravs dos literais true e false.
So obtidos geralmente como resultados de expresses condicionais.
Strings so identificados por literais contidos entre aspas duplas ("...") ou simples
('...'). O texto entre aspas pode ser qualquer caractere Unicode. Tanto faz usar aspas
simples como aspas duplas. Freqentemente usa-se aspas simples quando um trecho de
cdigo JavaScript que requer aspas embutido em um atributo HTML, que j utiliza aspas
duplas:
<INPUT TYPE="button" ONCLICK="alert('Oh no!')" VALUE="No aperte!">
Qualquer valor entre aspas uma string, mesmo que represente um nmero. Qualquer
valor lido a partir de um campo de formulrio em uma pgina HTML ou janela de entrada de
dados tambm string. Para converter um nmero ou valor booleano em string basta utiliz-lo
em uma operao de concatenao com uma string vazia:
a = 10;
b = "" + a; // b contm a string 10
2-5
Caracteres especiais
Se for necessrio imprimir aspas dentro de aspas preciso usar um caractere de escape. O
caractere usado para este fim dentro de strings a contra-barra (\). Use \' para produzir uma
aspa simples e \" para produzir aspas duplas. A prpria contra-barra pode ser impressa
usando \\. Outros caracteres so usados para finalidades especiais em JavaScript e no
podem ser impressos da forma convencional. A contra-barra tambm usada nesses casos. A
tabela a seguir mostra um resumo desses caracteres especiais em JavaScript.
Caractere especial Funo
\"
Aspas duplas ( " )
\'
Aspas simples( ' )
\\
Contra-barra ( \ )
\n
Nova linha (line feed)
\r
Retorno de carro (carriage return)
\f
Avana pgina (form feed)
\t
Tabulao horizontal (horizontal tab)
\b
Retrocesso (backspace)
Usando JavaScript em HTML importante lembrar que HTML ignora completamente
espaos em branco extras, novas-linhas, etc. que no sejam provocadas por descritores HTML
(como <BR>, <P>, etc.). Portanto os escapes acima que provocam espaos em branco no
aparecero na pgina a menos que o texto esteja dentro de um bloco <PRE>.
nmeros (0-9)
letras (A-Z e a-z)
caractere de sublinhado ( _ )
Mas os identificadores
2-6
do
double
enum
export
extends
final
finally
float
goto
import
instanceof
int
interface
long
native
package
private
protected
short
static
super
switch
synchronized
throw
throws
transient
try
2-7
default
implements
public
volatile
Operadores e expresses
JavaScript possui vrias classes de operadores. Operaes de atribuio, aritmticas, booleanas,
comparativas e binrias em JavaScript so realizadas da mesma forma que em outras
linguagens estruturadas como C++ ou em Java. As estruturas de controle de fluxo tambm
so as mesmas. Algumas outras operaes so mais especficas linguagem, como
concatenao, criao e eliminao de objetos. A tabela abaixo relaciona todos os operadores
de JavaScript:
Operadores aritmticos
Operadores lgicos
negao
++n, n++ incremento
--n, n-- decremento
multiplicao
*
diviso
/
resto
%
adio e conc.
+
subtrao
Operadores de atribuio
atribuio
=
atribuio com
op=
operao op
!=
- n
==
>
<
>=
<=
||
&&
!
?:
,
diferente de
igual a
maior que
menor que
maior ou igual a
menor ou igual a
or
and
not
condicional
vrgula
Operadores de bits
&
and
|
or
^
xor
~
not
<<
desloc. esquerda
>>
desloc. direita
>>>
desloc. dir. s/ sinal
Operadores de objetos
criao
new
delete remoo
typeof tipo do objeto
descarta o tipo
void
// atribuio simples
// atribuicao com soma. Equivale a
// atribuicao com divisao. Equivale a
y = y + 1 ou y++
z = z / 5
Tipo de Operador
separadores
Operador
operadores unrios e
de objetos
multiplicao/diviso
adio/sub./concat.
deslocamento
relacional
igualdade
AND
XOR
OR
E lgico
OU lgico
condicional
atribuio
[] . ()
+ - +
<< >> >>>
< > >= <=
== !=
&
^
|
&&
||
?:
= += -= *= /= %=
>>= <<= >>>= &= ^=
Os parnteses sempre podem ser usados para sobrepor a precedncia original. Eles so
necessrios em diversas ocasies como, por exemplo, para evitar a concatenao em
expresses que misturam strings com nmeros:
texto = (4 + 5) + ":" + (4 + 5);
2-9
Todas as expresses JavaScript possuem um valor, que pode ser undefined, null,
numero, booleano ou string. Expresses condicionais e comparativas sempre resultam em
valor booleano (true ou false).
O operador = utilizado somente para atribuio. A comparao de igualdade feita
exclusivamente com o operador ==.
if... else
A estrutura if... else utilizada para realizar controle de fluxo baseado em expresses
condicionais:
if (condio) {
// instrues caso condio == true
} else if (condio 2) {
// instrues caso condio 2 == true
} else {
// instrues caso ambas as condies sejam false
}
Exemplo:
if (ano < 0) {
alert("Digite
} else if ( ((ano % 4
alert(ano + "
} else {
alert(ano + "
}
um ano D.C.");
== 0) && (ano % 100 != 0)) || (ano % 400 == 0)) {
bissexto!");
no bissexto!");
A operao do if...else pode ser realizada tambm de uma forma mais compacta (e
geralmente menos legvel) atravs do operador condicional. A sua sintaxe
expresso ? instrues se expresso=true : instrues se expresso=false
Exemplo:
ano = 1994;
teste = ((ano % 4 == 0) && (ano % 100 != 0)) || (ano % 400 == 0));
alert ( teste ? ano + " no bissexto!" : ano + " bissexto!" );
2-10
for
As estruturas for e while so usadas para repeties baseadas em condies. O bloco for
contm de trs parmetros opcionais: uma inicializao, uma condio e um incremento. A
sintaxe a seguinte:
for(inicializao; condio; incremento) {
// instrues a serem realizadas enquanto condio for true
}
Por exemplo:
for (i = 0; i < 10; i = i + 1) {
document.write("<p>Linha " + i);
}
Neste exemplo, a varivel i local ao bloco for (ela no conhecida fora do bloco. Para
que ela seja visvel fora do bloco preciso que ela seja declarada fora dele.
A primeira coisa realizada no bloco for a inicializao. feita uma vez apenas. A
condio testada cada vez que o loop reiniciado. O incremento realizado no final de cada
loop. Os elementos do for so todos opcionais. A mesma expresso acima poderia ser
realizada da maneira abaixo:
i = 0;
for (; i < 10;) {
document.write("<p>Linha " + i);
i++;
}
A nica diferena entre esta forma e a anterior que a varivel i agora visvel fora do
bloco for (no mais uma varivel local ao bloco):
Uma instruo do tipo:
for (;;) {
document.write("<p>Linha");
}
while
O mesmo que foi realizado com for pode ser realizado com uma estrutura while, da forma:
inicializao;
while(condio) {
// instrues a serem realizadas enquanto condio for true
incremento;
}
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
2-11
break e continue
Para sair a fora de loops em cascata existem ainda as instrues break e continue. break
sai da estrutura de loops e prossegue com a instruo seguinte. continue deixa a execuo
atual do loop e reinicia com a passagem seguinte.
function leiaRevista() {
while (!terminado) {
passePagina();
if (alguemChamou) {
break;
// caia fora deste loop (pare de ler)
}
if (paginaDePropaganda) {
continue; // pule esta iterao (pule a pagina e nao leia)
}
leia();
}
...
Exerccios
Os exerccios1 abaixo tm a finalidade de explorar a sintaxe JavaScript apresentada neste
captulo. Devem ser executados em uma pgina HTML. O assunto visto at aqui, com o
auxlio do mtodo document.write(), (para imprimir HTML na pgina) o suficiente para
resolv-los.
2.1
Escreva um programa que imprima uma tabela de converso entre graus Celsius e
graus Fahrenheit ( fahr = (cels * 9/5) 32 ) entre -40 e 100 C, com incrementos de 10
As solues de alguns exerccios, deste e de outros captulos encontram-se nos subdiretrios correspondentes
(cap1/ a cap12/).
1
2-12
2.3
Repita o problema anterior usando tabelas HTML. Cada barra dever ter uma cor
diferente (use tabelas <TABLE> com clulas de cores diferentes <TD BGCOLOR="cor">
e repita os blocos <TD> para cada barra). Veja a figura abaixo ( esquerda). Para uma
soluo usando vetores (que sero apresentados no prximo captulo), veja o arquivo
exemplos2.html.
2.4
Escreva uma aplicao que imprima o desenho abaixo, direita, no browser (use
blocos for em cascata e varie o parametro SIZE de <FONT> ou use folhas de estilo2).
2.5
Repita o exerccio anterior fazendo com que cada letra seja de uma cor diferente (varie
o parametro COLOR de <FONT> ou use folhas de estilo3).
nomes de cores.
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
2-13
Funes e objetos
NO LTIMO CAPTULO APRESENTAMOS AS ESTRUTURAS FUNDAMENTAIS de JavaScript, que
esto presentes em qualquer linguagem estruturada. Neste captulo, apresentaremos o modelo
de objetos JavaScript, que a diferencia das outras linguagens, caracterizando-a como uma
linguagem baseada em objetos. Veremos o que so objetos e propriedades, como criar novas
propriedades, novas funes e novos objetos.
Antes de explorarmos o modelo de objetos, devemos conhecer algumas funes teis
fornecidas em todas as implementaes de client-side JavaScript. Tambm fazem parte da
linguagem e so usadas para realizar operaes teis como converso de dados e interpretao
interativa de cdigo.
Funes nativas
JavaScript possui 6 funes nativas1. Essas funes so procedimentos que permitem realizar
tarefas teis e podem ou no retornar algum valor. Todas recebem parmetros com os dados
sobre os quais devem operar. Podem ser chamadas de qualquer lugar. Por exemplo:
ano = parseInt("1997");
chama a funo parseInt() passando o string "1997" como argumento. A funo parseInt()
retorna um valor (tipo number) que atribumos acima varivel ano. Se o valor passado no for
conversvel em nmero, parseInt() retorna o valor NaN (no um nmero).
Os parmetros (ou argumentos) de uma funo so passados por valor entre parnteses
que seguem ao nome da funo. Algumas funes possuem mais de um argumento. Nesses
casos, eles so separados por vrgulas:
cor = parseInt("0xff00d9", 16);
A documentao JavaScript 1.1 da Netscape define 8 funes: parseInt, parseFloat, isNaN, eval, escape,
unescape, taint e untaint. As funes taint() e untaint() so usadas no modelo de segurana data-tainting do
browser Navigator 3.0 que foi tornado obsoleto em verses mais recentes. Outros browsers desconhecem essas
funes.
1
3- 1
isNaN(valor)
eval(string)
escape(string)
unescape(string)
O que faz
Converte uma representao String de um nmero na sua
representao Number. Ignora qualquer coisa depois do ponto
decimal ou depois de um caractere que no nmero. Se primeiro
caractere no for nmero, retorna NaN (Not a Number). A base a
representao do String (2, 8, 10, 16)
Converte uma representao String de um nmero na sua
representao Number, levando em considerao o ponto decimal.
Ignora qualquer coisa depois do segundo ponto decimal ou depois
de um caractere que no nmero. Se primeiro caractere no for
nmero ou ponto decimal, retorna NaN (Not a Number)
Retorna true se o valor passado no um nmero.
Interpreta o string passado como parmetro como cdigo
JavaScript e tenta interpret-lo. eval() uma funo que oferece
acesso direto ao interpretador JavaScript.
Exemplo: resultado = eval("5 + 6 / 19");
Converte caracteres de 8 bits em uma representao de 7 bits
compatvel com o formato url-encoding. til na criao de
cookies.
Exemplo: nome = escape("Joo"); // nome contm Jo%E3o
Faz a operao inverso de escape(string).
Exemplo: nome = unescape("Jo%E3o"); // nome contm Joo
3- 2
palavra-chave function. Uma vez criada uma funo, ela pode ser usada globalmente (dentro
da pgina onde foi definida), da mesma maneira que as funes globais do JavaScript.
O identificador da funo deve vir seguido de um par de parnteses e, entre eles,
opcionalmente, uma lista de parmetros, separados por vrgulas. A implementao (seqncia
de instrues) da funo deve vir dentro de um bloco entre chaves { e }.
function nomeDaFuno (param1, param2, ..., paramN) {
... implementao ...
}
Funes no precisam ter parmetros. Funes que operam sobre variveis globais ou
simplesmente executam procedimentos tm todos os dados que precisam para funcionar
disposio. No o caso da funo acima, que seria mais til se os tivesse:
function soma (a, b) {
return a + b;
}
A funo acima pode ser chamada de qualquer lugar na pgina HTML da forma:
resultado = soma(25, 40);
3- 3
copia a definio da funo soma() para a varivel sum, que agora uma funo. A nova
varivel pode ento ser usada como funo:
resultado = sum(25, 40);
Exerccios
3.1
3.2
Objetos
A maior parte da programao em JavaScript realizada atravs de objetos. Um objeto uma
estrutura mais elaborada que uma simples varivel que representa tipos primitivos. Variveis
podem conter apenas um valor de cada vez. Objetos podem conter vrios valores, de tipos
diferentes, ao mesmo tempo.
Um objeto , portanto, uma coleo de valores. Em vrias situaes necessitamos de tais
colees em vez de valores isolados. Considere uma data, que possui um dia, um ms e um
ano. Para represent-la em JavaScript, podemos definir trs variveis contendo valores
primitivos:
dia = 17;
mes = "Fevereiro";
ano = "1999";
Para manipular com uma nica data no haveria problemas. Suponha agora que temos
que realizar operaes com umas 10 datas. Para fazer isto, teramos que criar nomes
significativos para cada grupo de dia/mes/ano e evitar que seus valores se misturssem.
A soluo para este problema usar um objeto, que trate cada coleo de dia, mes e ano
como um grupo. Objetos so representados em JavaScript por variveis do tipo object. Esse
tipo capaz de armazenar colees de variveis de tipos diferentes como sendo suas
propriedades. Suponha ento que a varivel dataHoje do tipo object, podemos definir as
variveis dia, mes e ano como suas propriedades, da forma:
3- 4
dataHoje.dia = 17;
dataHoje.mes = "Fevereiro";
dataHoje.ano = "1999";
E como fazemos para criar um objeto? Existem vrias formas, mas nem sempre isto
necessrio. Vrios objetos j so fornecidos pela linguagem ou pela pgina HTML. O prprio
contexto global onde criamos variveis e definimos funes tratado em JavaScript como um
objeto, chamado de Global. As variveis que definimos ou declaramos fora de qualquer bloco
so as propriedades desse objeto. Os tipos primitivos em JavaScript tambm assumem um papel
duplo, se comportando ora como tipo primitivo com apenas um valor, ora como objeto
tendo o seu valor armazenado em uma propriedade. O programador no precisa se preocupar
com os detalhes dessa crise de identidade das variveis JavaScript. A converso objeto - tipo primitivo
e vice-versa totalmente transparente.
Uma simples atribuio, portanto, suficiente para criar variveis que podem se
comportar como objetos ou valores primitivos:
num = 5;
// num tipo primitivo number e objeto do tipo Number
boo = true; // boo tipo primitivo boolean e objeto do tipo Boolean
str = "Abc"; // str tipo primitivo string e objeto do tipo String
Objetos podem ser de vrios tipos (no confunda tipo de objeto com tipo de dados), de
acordo com as propriedades que possuem. Um objeto que representa uma data, por exemplo,
diferente de um objeto que representa uma pgina HTML, com imagens, formulrios, etc. A
linguagem JavaScript define nove tipos de objetos nativos embutidos. Quatro representam
tipos primitivos: Number, String, Boolean e Object (usamos a primeira letra maiscula para
distinguir o tipo de objeto do tipo de dados).
Utiliza as informaes
Varivel do tipo
retornadas por Date()
object que armazena
JS11-01-1999/01 A4 - 1999 Helder
L. S.criar
da Rocha
para
o objeto.
um objeto Date
Os tipos de objetos nativos Object, Number, String, Boolean, Function, Date e Array (veja
figura na pgina 2-4) todos possuem construtores definidos em JavaScript. Os construtores
so funes globais e devem ser chamadas atravs do operador new para que um objeto seja
retornado. A tabela abaixo relaciona os construtores nativos do JavaScript2:
Construtor
// valor primitivo
// objeto
A primeira cria uma varivel que contm o valor primitivo 13. A segunda forma, cria um
objeto explcitamente. A qualquer momento, porm, dentro de um programa JavaScript, as
representaes podem ser trocadas. Os construtores de objetos que representam tipos
2
3- 6
Propriedades
Cada objeto pode ter uma coleo de propriedades, organizadas atravs de ndices ou de nomes e
acessadas atravs de colchetes [ e ]. Para criar novas propriedades para um objeto, basta
defini-las atravs de uma atribuio:
zebra = "Zebra"; // varivel zebra do tipo primitivo string ...
zebra[0] = true; // ... agora assume o papel de objeto do tipo String
zebra[1] = "brancas";
// para que possa ter propriedades.
zebra[2] = 6;
Os nomes das propriedades tambm podem ser usadas como variveis associadas ao
objeto, como temos feito at agora. Para indicar as variveis que pertencem ao objeto, e no a
um contexto global ou local, preciso lig-la ao objeto atravs do operador ponto .:
zebra.domesticada = true;
zebra.listras = "brancas";
zebra.idade = 6;
Vrias propriedades esto documentadas e esto disponveis para todos os objetos dos
tipos nativos. Qualquer valor primitivo string, por exemplo, um objeto String, e possui uma
propriedade length que contm um nmero com a quantidade de caracteres que possui:
tamanho = zebra.length;
// propriedade length
Diferentemente das propriedades que definimos para zebra, length existe em qualquer
String pois est associada ao tipo do objeto. O tipo do objeto representado pelo seu construtor
e define as caractersticas de todos os objetos criados com o construtor. As propriedades que
ns criamos (domesticada, listras, idade) pertencem ao objeto zebra apenas. Para
acrescentar propriedades ao tipo String, precisamos usar uma propriedade especial dos objetos
chamada de prototype. Veremos como fazer isto no prximo captulo.
3- 7
Mtodos
As propriedades de um objeto podem conter tipos primitivos, objetos ou funes. As funes
so objetos do tipo Function. Funes que so associadas a objetos so chamadas de mtodos.
Todos os objetos nativos do JavaScript possuem mtodos. Pode-se ter acesso aos mtodos da
mesma maneira que se tem acesso s propriedades:
letra = zebra.charAt(0); // mtodo charAt(0) retorna "Z" (String)
Tambm possvel acrescentar mtodos aos objetos e ao tipo dos objetos. Para
acrescentar um mtodo ao objeto zebra, basta criar uma funo e atribuir o identificador da
funo a uma propriedade do objeto:
function falar() {
alert("Rinch, rinch!");
}
zebra.rinchar = falar;
Os mtodos, porm, so mais teis quando atuam sobre um objeto alterando ou usando
suas propriedades. Na seo seguinte veremos alguns exemplos de mtodos desse tipo alm de
como criar novos tipos de objetos.
A funo Conta, acima, nada mais que uma funo comum. O que a transforma em
construtor a forma como chamada, usando new. Tendo-se a funo, possvel criar
objetos com o novo tipo e atribuir-lhes propriedades:
cc1 = new Conta();
// cc1 do tipo object
cc1.correntista = "Aldebaran";
cc1.saldo = 100.0;
3- 8
function Conta() {
this.correntista = "No identificado";
this.saldo = 0.0;
}
Agora todo objeto Conta ter propriedades iniciais definidas. A palavra-chave this um
ponteiro para o prprio objeto. Dentro do construtor, o objeto no tem nome. Quando o
construtor invocado, this, que significa este, se aplica ao objeto que est sendo criado.
Podemos usar this para criar um outro construtor, mais til, que receba argumentos:
function Conta(corr, saldo) {
this.correntista = corr;
this.saldo = saldo;
}
No h conflito entre a varivel local saldo e a propriedade saldo do objeto Conta pois elas
existem em contextos diferentes. Com o novo construtor, possvel criar contas da forma:
cc2 = new Conta("Sirius", 326.50);
cc1 = new Conta("Aldebaran", 100.0);
Para definir mtodos para o novo tipo, basta criar uma funo e copi-la para uma
propriedade do construtor, por exemplo:
function metodo1() {
document.write("Saldo: " + this.saldo");
}
function Conta(corr, saldo) {
this.correntista = corr;
this.saldo = saldo;
this.imprimeSaldo = metodo1;
}
Agora qualquer objeto criado com o construtor Conta() possui um mtodo que
imprime na pgina o valor da propriedade saldo:
cc3 = new Conta("", 566.99);
cc3.imprimeSaldo(); // imprime da pgina: Saldo: 566.99
Exerccio resolvido
Crie um novo tipo Circulo especificando um construtor da forma
Circulo(x, y, r) onde x e y so as coordenadas cartesianas
do crculo e r o seu raio. Utilize o construtor para criar dois
objetos c1 e c2 e imprimir seus valores na tela do browser da
forma mostrada na figura ao lado.
3- 9
Soluo
Uma possvel soluo completa est mostrada na listagem a seguir. Poderamos ter evitado o
cdigo repetitivo ao imprimir os valores criando um mtodo para crculo que fizesse isto. Esse
mtodo proposto como exerccio.
<HTML> <HEAD>
<TITLE>Circulos</TITLE>
<script>
function Circulo(x, y, r) {
// funo "construtora"
this.x = x; // definio das propriedades deste objeto
this.y = y; // a referncia this ponteiro para o prprio objeto
this.r = r;
}
</script>
</HEAD>
<BODY>
<h1>Circulos</h1>
<script>
c1 = new Circulo(2,2,5); // uso da funo construtora
c2 = new Circulo(0,0,4); // para criar dois circulos
c2.x = 1;
c2["y"] = 2;
// uso de propriedades
document.write("<P>c1: raio=" + c1.r + " (" + c1.x + "," + c1.y + ")");
document.write("<P>c1: raio=" + c2.r + " (" + c2.x + "," + c2.y + ")");
</script>
</BODY>
</HTML>
A estrutura for...in
JavaScript possui uma estrutura de repetio especial que permite refletir as propriedades de
um objeto: a estrutura for...in. que pode ser usada para ler todas as propriedades de um
objeto, e extrar os seus valores. A sintaxe
for (variavel in nome_do_objeto) {
// declaraes usando variavel
}
3- 10
onde varivel o nome da varivel que ser usada para indexar as propriedades do objeto. O
bloco ser repetido at no haver mais propriedades. Em cada iterao, uma propriedade
estar disponvel em variavel e seu valor poder ser extrado usando vetores associativos, da
forma:
objeto[variavel]
Veja como exemplo a funo abaixo, que retorna todas as propriedades de um objeto:
function mostraProps(objeto) {
props = "";
for (idx in objeto) {
props += idx + " = " + objeto[idx] + "\n";
}
return props;
}
Os dois objetos acima possuem uma relao hierrquica: Um Alvo contm um Circulo.
possvel, atravs de um Alvo, ter acesso e propriedades do Circulo que ele contm:
a1.circ.x = 20;
a1.circ.y = 10;
3- 11
objetos, diferentemente do que ocorre com valores primitivos, no faz uma cpia do objeto.
Copia um ponteiro ou referncia para eles. preciso usar new para criar um novo objeto.
Exerccios
3.3
Crie um novo tipo Cliente, com as propriedades nome, email e telefone. Crie 5 objetos
usando esse tipo e use for... in para listar e imprimir na pgina cada cliente e suas
propriedades.
3.4
Crie um mtodo para o tipo Crculo para que seja possvel imprimir o raio e centro do
crculo da mesma forma para todos os crculos. Use o formato: Raio: r (x, y).
W indow
1 0...n
W indow
1
< html>
Document
1
Locat ion
Somente
browsers
Microsoft
Janelas adicionais
ou frames
Navigator
0... n
Mimet ypes
0... n
Navigator
History
Somente
browsers
Netscape
PlugIn
0... n
< form>
Form
< img>
Image
< area>
Area
< a href>
Link
< a name>
< applet>
Applet
Anchor
1 0... n
< textarea>
Reset
Text
Radio
Hidden
Image Password Checkbox
File
Submit
Textarea
But t on
3- 12
Select
1... n
Option
- 1999 Helder L. S. da Rocha
< option>
JS11-01-1999/01 A4
< select>
pois o nome window, que representa a janela ativa do browser, sempre pode ser omitido
quando o script roda dentro dessa janela.
H pelo menos uma propriedade em cada objeto do HTML que se refere a objetos que
ele pode conter ou a um objeto no qual est contido. essa caracterstica permite organizar os
3- 13
objetos JavaScript como uma hierarquia. Todos os elementos que existirem na pgina podem
ser objetos accessveis como propriedades de document.
Dentro de uma pgina h vrios elementos: imagens, formulrios, pargrafos, tabelas. O
modelo de objetos do JavaScript 1.1 permite apenas a manipulao de imagens, vnculos,
ncoras, applets, formulrios e seus componentes. O nome de um objeto associado a um
elemento pode ser definido em HTML, atravs do atributo NAME:
<IMG SRC="zebra.gif" name="figura3">
A varivel z um objeto do tipo Image, e pode ser manipulada como tal em JavaScript,
ou seja, suas propriedades podem ser lidas e seus mtodos podem ser invocados. Utilizando
instrues JavaScript pode-se, por exemplo, trocar a imagem (zebra.gif) por outra:
z.src = "jegue.gif";
Quando a janela na qual estamos operando no a janela atual, mas outra que foi aberta
utilizando instrues JavaScript, preciso utilizar o nome do objeto, s que no ser window.
Quando criamos uma nova janela, podemos batiz-la com um nome qualquer que servir de
referncia para operar sobre ela. Essa referncia um objeto do tipo Window:
janela2 = window.open("pgina2.html"); // mtodo open retorna referncia
// do tipo Window que propriedade
// da janela atual (window)
Window
3- 14
janela2.document.open(); // ou window.janela2.document.open()
janela2.document.write("Eu sou texto na Janela 2");
Este tipo de relao (janelas que tm janelas como propriedades) ilustrado no diagrama
de objetos da pgina 3-12. A ltima janela aberta tem um status especial pois representa a
aplicao. Frames so outro exemplo de janelas dentro de janelas. As janelas de frames tm
propriedades que permitem o acesso bidirecional.
Agora possvel ter acesso ao campo de textos em JavaScript usando nomes, em vez de
ndices de vetores:
texto = document.f1.campoTexto;
textoVelho = texto.value;
// lendo a propriedade value...
texto.value = "Novo Texto";
// redefinindo a propriedade value
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
3- 15
O cdigo acima tambm poderia ter sido escrito da forma, com os mesmos resultados:
textoVelho = document.f1.campoTexto.value;
document.f1.campoTexto.value = "Novo Texto";
Exerccio resolvido
Implemente o somador mostrado na figura ao lado em JavaScript. Deve ser possvel digitar
nmeros nos dois campos de texto iniciais,
apertar o boto = e obter a soma dos
valores no terceiro campo de texto.
Para ler um campo de texto, voc vai
ter que ter acesso propriedade value dos
campos de texto (objeto do tipo Text). A
propriedade value um String que pode
ser lido e pode ser alterado. Os campos de
texto so acessveis de duas formas:
Quando ao boto, preciso que no seu evento ONCLICK, ele chame uma funo capaz
de recuperar os dois valores e colocar sua soma na terceira caixa de texto. Este exerccio est
resolvido. Tente faz-lo e depois veja uma das possveis solues na prxima seo.
Soluo
Observe a utilizao de toda a hierarquia de objetos para ler os campos do formulrio, a
converso de string para inteiro usando a funo parseFloat() e a chamada funo soma()
atravs do evento ONCLICK do boto.
<html> <head>
<script language=JavaScript>
function soma() {
a = document.f1.val1.value;
b = document.f1.val2.value;
document.f1.val3.value = parseFloat(a) + parseFloat(b);
}
</script>
</head>
<body>
<h1>Somador JavaScript</h1>
<form name="f1">
3- 16
size=5> +
size=5>
= " onclick="soma()">
size=5>
Observe no cdigo acima que a funo soma() foi definida no <HEAD>. Isto para
garantir que ela j esteja carregada quando for chamada pelo evento. uma boa prtica definir
sempre as funes dentro de um bloco <SCRIPT> situado no bloco <HEAD> da pgina.
this
A palavra-chave this usada como referncia ao objeto no qual se est operando. A palavrachave this pode ser usada apenas quando se est dentro de um objeto. Em objetos criados em
JavaScript, s usamos this dentro de funes construtoras e mtodos. No caso dos objetos
HTML, this s faz sentido quando usada dentro de um dos atributos de eventos (ONCLICK,
ONMOUSEOVER, HREF, etc.):
<input type=button value=" = " onclick="soma(this.form)">
Na linha acima, this refere-se ao objeto Button. A propriedade de Button chamada form
uma referncia ao formulrio no qual o boto est contido (subindo a hierarquia). Usando o
cdigo acima, podemos reescrever o script do somador para que receba uma referncia para o
formulrio (que chamamos localmente de calc):
<script>
function soma(calc) {
a = calc.val1.value;
b = calc.val2.value;
calc.val3.value = parseFloat(a) + parseFloat(b);
}
</script>
3- 17
with
with uma estrutura especial eu permite agrupar propriedades de objetos, dispensando a
use
with(objeto) {
propriedade1 = 12;
propriedade2 = true;
propriedade3 = "informao";
}
typeof
Uma das maneiras de identificar o tipo de um objeto, atravs do operator typeof. Este
operador retorna um String que indica o tipo de dados primitivo (object, number, string, boolean ou
undefined) do operando ou se um objeto do tipo Function. O operando que pode ser uma
varivel, uma expresso, um valor, identificador de funo ou mtodo. A sintaxe :
typeof operando
// ou typeof (operando)
O contedo da string retornada por typeof uma das seguintes: undefined (se o
objeto ainda no tiver sido definido), boolean, function, number, object ou string. Veja
alguns exemplos:
var
var
var
var
var
var
var
3- 18
coisa;
outraCoisa = new Object();
texto = "Era uma vez...";
numero = 13;
hoje = new Date();
c = new Circulo(3, 4, 5);
boo = true;
//
//
//
//
//
//
//
typeof
typeof
typeof
typeof
typeof
typeof
typeof
coisa: undefined
outraCoisa: object
texto: string
numero: number
hoje:
object
c:
object
boo:
boolean
O operador typeof retorna o tipo function para qualquer tipo de procedimento, seja
mtodo, construtor ou funo. Deve-se usar apenas o identificador do mtodo ou funo,
eliminando os parnteses e argumentos:
typeof
typeof
typeof
typeof
typeof
typeof
typeof
Circulo
//
eval
//
document.write
Document
//
Window
//
window
//
Math
//
function
function
// function
function
undefined (nao ha construtor p/ o tipo Window)
object
object (Math nao tipo... objeto)
O uso de typeof til em decises para identificar o tipo de um objeto primitivo, mas
no serve para diferenciar por exemplo, um objeto Date de um Array, ou um document de um
objeto Circulo. So todos identificados como object.
Uma forma mais precisa para identificar o tipo do objeto, identificar seu construtor.
Toda a definio do construtor de um objeto pode ser obtida atravs da propriedade
constructor, que todos os objetos possuem. Por exemplo, c.constructor (veja exemplos
na pgina anterior) contm toda a funo Circulo(x, y, r). Para obter s o nome do
construtor, pode-se usar a propriedade name de constructor:
document.write(c.constructor.name);
document.write(hoje.constructor.name);
// imprime Circulo
// imprime Date
void
O operador void usado para executar uma expresso JavaScript, mas jogar fora o seu valor.
til em situaes onde o valor de uma expresso no deve ser utilizado pelo programa. A
sintaxe est mostrada abaixo (os parnteses so opcionais):
void (expresso);
O operador void til onde o valor retornado por uma expresso pode causar um
efeito no desejado. Por exemplo, na programao do evento de clique do vnculo de
hipertexto (HREF), o valor de retorno de uma funo poderia fazer com que a janela fosse
direcionada a uma pgina inexistente.
Considere o exemplo abaixo. Suponha que no exemplo acima, enviaFormulario()
retorne o texto enviado. Este valor poderia fazer com que a janela tentasse carregar uma
suposta pgina chamada enviado:
<a href="javascript: enviaFormulario()">Enviar formulrio</a>
3- 19
Para evitar que o valor de retorno interfira no cdigo, e ainda assim poder executar a
funo, usamos void que descarta o valor de retorno:
<a href="javascript: void(enviaFormulario())">Enviar formulrio</a>
delete
O operador delete no existe em JavaScript 1.1. Pode ser usado nos browsers que suportam
implementaes mais recentes para remover objetos, elementos de um vetor ou propriedades
de um objeto. No possvel remover variveis declaradas com var ou propriedades e objetos
pr-definidos. A sintaxe a seguinte:
delete objeto;
delete objeto.propriedade;
delete objeto[ndice];
Exerccios
3.5
3- 20
Global
Array Object
Boolean
Number
String
Function
Date
Array()
Boolean()
N umber()
String()
Function()
Date()
Object()
Math
4-1
Como Math, outros tipos tambm servem de repositrio de funes e constantes teis
ao mesmo tempo em que possuem construtores que permitem a criao de objetos
distintos. As funes, diferentemente dos mtodos, no se aplicam a um objeto em especial.
So globais, como as funes parseInt(), eval(), etc. mas precisam ser chamadas atravs do
identificador do construtor (nome do tipo) do objeto, da forma:
Nome_do_tipo.funo(parametros);
Object
Trata-se de um tipo de objeto genrico usado para representar qualquer objeto criado com
new. Seu construtor raramente utilizado pelo programador JavaScript. Existe basicamente
para dar suporte a operaes internas.
Para criar um Object, pode-se fazer:
obj = new Object();
valueOf()
assign(valor)
Ao
Transforma qualquer objeto em uma representao string.
usado automaticamente nas converses de nmeros em
strings, por exemplo, durante a concatenao.
Converte um objeto em seu valor primitivo, se houver.
Implementa o operador de atribuio (=).
Dos trs mtodos acima, o mais usado toString(). Ele pode ser chamado
explicitamente sobre qualquer objeto para transform-lo em uma representao string.
chamado automaticamente quando o objeto usado em uma operao de concatenao.
Todos os objetos tambm possuem uma propriedade constructor que contm uma
string com sua funo de construo. Por exemplo, suponha um objeto criado com a
funo Circulo, definida no captulo anterior. O trecho de cdigo:
4-2
imprime na pgina:
Construtor:
function
this.x
this.y
this.r
}
Circulo(x, y, r) {
= x;
= y;
= r;
Number
um tipo de objeto usado para representar nmeros (tipo primitivo number) como objetos.
A criao de um nmero pode ser feita simplesmente atravs de uma atribuio. O nmero
ser transformado em objeto automaticamente quando for necessrio. Um objeto Number
pode ser criado explicitamente usando new e o construtor Number():
n = new Number(12);
n = 5;
maior = n.MAX_value;
Constante
MAX_value
MIN_value
NaN
NEGATIVE_INFINITY
POSITIVE_INFINITY
Significado
Maior valor numrico representvel: 4,94065e-324
Menor valor numrico representvel: 1,79769e+308
No um nmero: NaN
Infinito positivo: +Infinity
Infinito negativo: -Infinity
4-3
Boolean
um tipo de objeto usado para representar os literais true e false como objetos. Um
valor booleano criado sempre que h uma expresso de teste ou comparao sendo
realizada. O valor ser transformado automaticamente em objeto quando necessrio. Todas
as formas abaixo criam objetos Boolean ou valores boolean:
boo
boo
boo
boo
=
=
=
=
new Boolean("");
new Object(true);
true;
5 > 4;
Function
Um objeto Function representa uma operao JavaScript, que pode ser uma funo, mtodo
ou construtor. Para criar um objeto deste tipo, basta definir uma nova funo com a
palavra-chave function. Tambm possvel criar funes annimas usando o construtor
Function() e o operador new:
func = new Function("corpo_da_funo"); // ou, ...
func = new Function(arg1, arg2, ..., argn, "corpo_da_funo");
4-4
nome_da_funo.propriedade;
Propriedade
arguments[]
arguments.length
length
caller
prototype
Agora todos os objetos criados com o construtor Date tero a propriedade ano:
d = new Date();
document.write("Estamos no ano de: " + d.ano);
4-5
else
return false;
}
O segundo passo, atribuir a nova funo (um objeto Function chamado bissexto) a
uma nova propriedade do prottipo do objeto, que chamamos de isLeapYear:
Date.prototype.isLeapYear = bissexto;
Agora, temos um mtodo isLeapYear() que retorna true se a data no qual for
invocado ocorrer em um ano bissexto, e false, caso contrrio:
hoje = new Date();
if (hoje.isLeapYear())
document.write("O ano " + hoje.ano + " bissexto");
else
document.write("O ano " + hoje.ano + " no bissexto");
4-6
</BODY>
String
O tipo String existe para dar suporte e permitir a invocao de mtodos sobre cadeias de
caracteres, representadas pelo tipo primitivo string. Pode-se criar um novo objeto String
fazendo:
s = new String("string");
ou simplesmente:
s = "string";
// CERTO
e no
s = "ornitorrinco"; // ou s = new String("ornitorrinco");
s.prototype;
// ERRADO: No propriedade de String!
4-7
A funo Endereco() acima poderia ter sido definida anonimamente com new
Function(), como fizemos na definio dos dois mtodos que criamos para o tipo Circulo,
na seo anterior. Utilizamos a sintaxe baseada na palavra-chave function por ser mais
clara e eficiente.
Raramente preciso definir mtodos da forma mostrada acima. O tipo String j possui
uma coleo de mtodos teis, aplicveis diretamente qualquer cadeia de caracteres em
JavaScript. Podem ser divididos em trs tipos:
Os primeiros esto relacionados nas tabelas abaixo, juntamente com dois mtodos que
fazem converses de formato. Supondo que o string usado pelos mtodos abaixo :
s = "Texto";
Mtodo Invocado
Retorna
anchor("ncora")
link("http://a.com")
small()
big()
blink()
strike()
sub()
sup()
italics()
bold()
fixed()
fontcolor("cor")
<a name="ncora">Texto</a><>
<a href="http://a.com">Texto</a>
<small>Texto</small>
<big>Texto</big>
<blink>Texto</blink>
<strike>Texto</strike>
<sub>Texto</sub>
<sup>Texto</sup>
<i>Texto</i>
<b>Texto</b>
<tt>Texto</tt>
<font color="cor">Texto</font> (cor pode ser um
valor rrggbb hexadecimal ou nome de cor)
<font size="7">Texto</font> (o nmero representa
o tamanho e pode ser um nmero de 1 a 7)
fontsize(7)
Retorna
toLowerCase()
toUpperCase()
texto
TEXTO
indexOf("substring")
indexOf("substring",
inicio)
lastIndexOf("substring")
lastIndexOf("substring",
fim)
split("delimitador")
4-9
Mtodo Invocado
substring(inicio, fim)
Fazendo
sexta = data.split(",");
obtendo diad[0] = 13, diad[1] = Agosto, diad[2] = 1999. Podemos agora imprimir a
frase Vlido at 13/Ago/1999 usando:
diad[1] = diad[1].substring(0,3); // diad1[1] agora Ago
document.write("Vlido at " + diad[0] + "/" + diad[1] + "/" + diad[2]);
Exerccios
4.1
Escreva uma funo que faa uma mensagem rolar dentro de um campo <INPUT
TYPE=TEXT>. Deve ter um loop. Use o mtodo substring() para extrair um caractere
do incio de uma String e coloc-lo no final, atualizando em seguida o contedo
(propriedade value) do campo de texto. Crie botes para iniciar e interromper o
rolamento da mensagem.
Array
O tipo Array representa colees de qualquer tipo, na forma de vetores ordenados e
indexados. Para criar um novo vetor em JavaScript, preciso usar o operador new e o
construtor Array():
4-10
=
=
=
=
"Norte";
"Sul";
"Leste";
"Oeste";
Para recuperar o tamanho do vetor, usa-se a propriedade length que tambm pode
ser redefinida com valores maiores ou menores para expandir ou reduzir o vetor:
tamanho = direcao.length; // direcao possui 4 elementos
direcao.length--;
// agora s possui 3
direcao.length++;
// agora possui 4 novamente, mas o ltimo
undefined
O vetor acima foi inicializado com quatro elementos, atravs do seu construtor, mas
isto no necessrio. Ele pode ser inicializado com zero elementos e ter novos elementos
adicionados a qualquer hora. Existir sempre uma seqncia ordenada entre os elementos de
um vetor. No possvel ter ndices avulsos. Se uma propriedade de ndice 6 for definida:
direcao[6] = "Centro";
o novo vetor direcao ser atualizado e passar a ter 7 elementos, que tero os valores:
("Norte","Sul","Leste","Oeste",undefined,undefined,"Centro")
4-11
Mtodo
join() ou join("separador")
reverse()
sort()
sort(funo_de_ordenao())
Ao
Retorna String. Converte os elementos de um
vetor em uma string e os concatena. Se um
string for passado como argumento, o utiliza
para separar os elementos concatenados.
Array. Inverte a ordem dos elementos de um
vetor. Tanto o vetor retornado, quanto o
vetor no qual o mtodo chamado so
afetados.
Array. Ordena os elementos do vetor com
base no cdigo do caractere. Tanto o vetor
retornado, quanto o vetor no qual o mtodo
chamado so afetados.
Array. Ordena os elementos do vetor com
base em uma funo de ordenao. A funo
deve tomar dois valores a e b e deve
retornar:
Menor que zero se a < b
Igual a zero se a = b
Maior que zero se a > b
O mtodo join() tem vrias aplicaes, principalmente quando usado em conjunto com o
mtodo split(), de String. Uma aplicao a converso de valores separados por
delimitadores em tabelas HTML:
dados = "Norte; Sul; Leste; Oeste"; // String
vetor = dados.split(";");
s = "<tr><td>";
s += vetor.join("</td><td>");
s += "</td></tr>";
document.write("<table border>" + s + "</table>");
Uma invocao de split() sobre um string cria um vetor de vrios strings. Uma nova
invocao de split() sobre um desses strings, cria um novo vetor, que pode ser atribudo
mesma varivel que lhe forneceu o string, resultando em um vetor bidimensional:
produtosStr = "arroz: 12.5; feijo: 14.9; aucar: 9.90; sal: 2.40";
cestaVet = produtosStr.split(";"); // separa produtos; cestaVet[i] String
for (i = 0; i < cestaVet.length; i++) {
4-12
cestaVet[i] = cestaVet[i].split(":");
// cestaVet[i] agora vetor
1D
}
// e cestaVet vetor 2D
prod = cestaVet[2][0];
// prod contm o String "aucar"
qte = cestaVet[2][1];
// qte contm o String "9.90"
Exerccios
4.2
Escreva uma pgina contendo dois campos de texto <TEXTAREA> e um boto, com o
rtulo inverter. O primeiro campo de texto dever receber uma string de
informao digitada pelo usurio. Quando o boto inverter for apertado, todo o
contedo do primeiro campo dever ser copiado no outro <TEXTAREA> comeando
pela ltima palavra e terminando na primeira. Dica: use o mtodo reverse() de Array.
Math
O objeto Math no um tipo de objeto. na verdade uma propriedade global read-only.
Serve apenas de repositrio de constantes e funes matemticas. No possvel criar
objetos do tipo Math (com new) e no h, rigorosamente, mtodos definidos em Math mas
apenas funes. Para ter acesso a suas funes e constantes, deve-se usar a sintaxe:
Math.funo();
Math.constante;
Constantes
-1
cosseno
asin(x)
seno-1
atan(x)
tangente-1
atan2(x, y)
retorna o
ngulo de um ponto (x,y)
ceil(x)
arredonda para
cima (3.2 e 3.8 4)
abs(x)
cosseno
exp(x)
ex
floor(x) arredonda para
baixo (3.2 e 3.8 3)
tan(x)
acos(x)
cos(x)
random()
absoluto
max(a, b)
mximo
min(a, b)
mnimo
pow(x, y)
xy
sin(x)
seno
round(x)
arredonda
(3.49 3 e 3.5 4)
sqrt(x)
log(x)
tangente
raiz quadrada
logartmo
natural
E
LN10
LN2
LOG10E
LOG2E
PI
SQRT1_2
SQRT2
e
ln 10
ln 2
log10 e
log2 e
1/sqrt(2)
sqrt(2)
4-13
O programa a seguir utiliza algumas funes e constantes do tipo Math para implementar
uma pequena calculadora cientfica.
<html> <head>
<script language=JavaScript>
<!-function cos() {
a = parseInt(document.f1.val1.value) * (Math.PI / 180);
document.f1.val1.value = Math.cos(a);
}
function sin() {
a = parseInt(document.f1.val1.value) * (Math.PI / 180);
document.f1.val1.value = Math.sin(a);
}
function tan() {
a = parseInt(document.f1.val1.value) * (Math.PI / 180);
document.f1.val1.value = Math.tan(a);
}
function sqrt() {
a = document.f1.val1.value;
document.f1.val1.value = Math.sqrt(parseInt(a));
}
function log() {
a = document.f1.val1.value;
document.f1.val1.value = Math.log(parseInt(a));
}
function exp() {
a = document.f1.val1.value;
document.f1.val1.value = Math.exp(parseInt(a));
}
//--></script>
</head>
<body>
<h1>Calculadora Cientifica</h1>
<form name="f1">
<input type=text name=val1 size=40>
<input type=button value=" C " onclick="this.form.val1.value=''"><br>
<input type=button value=" cos(x) " onclick="cos()">
<input type=button value=" sin(x) " onclick="sin()">
<input type=button value=" tan(x) " onclick="tan()"> graus ( )<br>
<input type=button value=" sqrt(x) " onclick="sqrt()">
<input type=button value=" ln(x) " onclick="log()">
<input type=button value=" exp(x) " onclick="exp()">
</form>
</body> </html>
4-14
A pgina HTML a seguir usa o mtodo random() para devolver um nmero aleatorio
entre 0 e um limite estabelecido em uma chamada de funo. Este nmero ento usado
para carregar imagens (ou outro arquivo) aleatoriamente na pgina.
<HTML> <HEAD>
<SCRIPT LANGUAGE="JavaScript">
function loadFile(name, ext, number) {
return name + Math.floor(Math.random() * lim) + "." + ext;
}
</SCRIPT>
</HEAD>
<BODY>
<h1 align=center>Imagens Aleatrias</h1>
<p align=center>
Ateno... eis a imagem da hora!
<!-- imagens: figura-0.gif, figura-2.gif, ..., figura-4.gif -->
<br><script language="JavaScript">
document.write("<img src=" + loadFile("figura-", "gif", 5) + ">");
</script>
</BODY> </HTML>
Exerccios
4.3
4.4
Date
O tipo Date um tipo de objeto usado para representar datas. Para criar data que represente
a data e hora atuais, chame-o usando new, da forma:
aquiAgora = new Date();
4-15
Alm da data e hora atuais, Date usado para representar datas arbitrrias. Para representar
uma data e hora especfica, pode-se usar funes ou um de seus construtores:
new Date(ano, mes, dia);
// Ex: umDia = new Date(97, 11, 19);
new Date(ano, mes, dia, hora, minuto, segundo);
// Ex: outroDia = new Date(98, 10, 11, 23, 59, 59);
new Date(Data em forma de string: "Mes dd, aa hh:mm:ss");
// Ex: aqueleDia = new Date("October 25, 97
23:59:15");
new Date(milissegundos desde 0:0:0 do dia 1o. de Janeiro de 1970);
// Ex: oDia = new Date(86730923892832);
A tabela a seguir relaciona os mtodos dos objetos do tipo Date, os tipos de retorno
(se houver) e suas aes. No h propriedades definidas no tipo Date.
Mtodo
Ao
getDate()
getDay()
getHours()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getYear()
4-16
Mtodo
Ao
setDate(dia_do_ms)
setHours(hora)
setMinutes(minuto)
setMonth(ms)
setSeconds()
setTime()
setYear()
toGMTString()
toLocaleString()
Alm dos mtodos, que devem ser aplicados sobre objetos individuais criados com o
tipo Date, Date tambm serve de repositrio para duas funes: Date.parse(string) e
Date.UTC(). Elas oferecem formas alternativas de criar objetos Date:
Essas funes, listadas na tabela abaixo, no so mtodos de objetos Date, mas do
construtor Date() e devem ser chamadas usando-se o identificador Date e no usando o
nome de um objeto especfico, por exemplo:
Date d = new Date();
d.parse("Jan 13, 1998 0:0:0 GMT");
// ERRADO!
// CORRETO!
Funo
parse(string)
Ao
Retorna Date. Converte uma data do sistema no formato
IETF (usado por servidores de email, servidores HTTP, etc.)
em milisegundos desde 1/1/1970 0:0:0 GMT (UTC). O valor
de retorno pode ser usado para criar uma nova data no
formato JavaScript. Exemplo:
DataIETF = "Wed, 8 May 1996 22:44:53 0200";
umaData = new Date(Date.parse(DataIETF));
UTC()
Exemplo:
millis = Date.UTC(75, 11, 13, 23, 30);
4-17
Exerccios
4.5
Escreva um programa que receba uma data atravs de um campo de textos (prompt())
no formato dd/mm/aaaa. O programa deve reclamar (use alert()) se o formato
digitado for incorreto e dar uma nova chance ao usurio. Recebido o string, ele deve
ser interpretado pelo programa que dever imprimir na pgina quandos dias, meses e
anos faltam para a data digitada.
4.6
Crie uma pgina que mude de aparncia de acordo com a hora do dia. Se for de
manh (entre 6 e 12 horas), a pgina dever ter fundo branco e letras pretas. Se for
tarde (entre 12 e 18 horas), a pgina dever ter fundo amarelo e letras pretas. Se for
noite (entre 18 e 24 horas), o fundo deve ser escuro com letras brancas e se for
madrugada (entre 0 e 6 horas), o fundo deve ser azul, com letras brancas. Para mudar
a cor de fundo, use a propriedade document.bgColor, passando um string com o
nome da cor como argumento:
document.bgColor = "blue";
4-18
As janelas do browser
A JANELA DO BROWSER manipulvel de vrias formas atravs da linguagem JavaScript.
Pode-se alterar dinamicamente vrias de suas caractersticas como tamanho, aparncia e
posio, transferir informaes entre janelas e frames, abrir e fechar novas janelas e criar
janelas de dilogo.
Janelas do browser so representadas em JavaScript atravs de de objetos do tipo
Window. Pode-se classificar as janelas usadas em JavaScript em cinco categorias:
Alm das janelas comuns, que contm pginas HTML, h trs janelas de dilogo:
alerta, confirmao e entrada de dados, que no tm propriedades manipulveis. Todos os tipos
de janelas so representadas atravs de propriedades do objeto window.
5-1
Objeto Window
O tipo Window1 representa janelas. A propriedade global window representa a janela do browser
onde roda o script. Atravs de window, tm-se acesso a outras propriedades que referenciam
possveis sub-janelas, a janela que a criou (se existir) ou frames. Tambm tm-se acesso a
mtodos que abrem caixas de dilogo de aviso, confirmao e entrada de dados.
As propriedades e mtodos de Window, quando referentes janela atual (objeto
window), podem omitir o nome do objeto:
window.status = "oye!";
// ou status = "oye!";
window.open("documento.html"); // ou open("documento.html");
Mas isto s vale se a janela na qual se deseja invocar o mtodo ou a propriedade for a
janela atual, onde roda o script. A propriedade window refere-se sempre janela atual.
A tabela abaixo relaciona as propriedades dos objetos do tipo Window. Observe que
muitos so objetos Window e, como conseqncia, tm as mesmas propriedades:
Propriedade
Acesso
defaultStatus read /
write
status
r/w
name
r/w
length
r
r
r
r
r
r
r
r
r
parent
top
document
history
location
navigator
opener
self
window
frames
Funo
Contm String. Texto que aparece por default na barra de status
da janela.
Contm String. Define texto que aparecer na barra de status.
Contm String. Contm nome da janela. Este nome utilizvel
em HTML no atributo TARGET em <A TARGET="nome"> e em <BASE
TARGET="nome">. Em frames, retorna uma referncia Window.
Contm Document. Referncia pgina contida na janela.
Contm History. Referncia ao histrico da janela.
Contm Location. Referncia URL exibida na janela.
Contm Navigator. Referncia a string de identificao do browser.
Contm Window. Refere-se a janela que abriu esta janela
Contm Window. Referncia prpria janela. Mesmo que window
Contm Window. Sinnimo de self.
Contm Array de Window. Vetor dos frames contidos na janela.
Contm Number. Nmero de elementos Window no vetor frames
(mesma coisa que window.frames.length)
Contm Window. Referncia janela que contm esta janela (s
existe quando a janela atual um frame)
Contm Window. Referncia janela que no frame que contm a
janela atual (s existe quando a janela atual um frame)
Window um nome genrico que usamos para qualificar janelas. No h construtor ou qualquer
propriedade com este nome. Existe sim, a propriedade window (com w minsculo), que representa a janela
atual.
1
5-2
Janelas de dilogo
Trs mtodos de Window so usados apenas para criar janelas de dilogo. Eles so: alert(),
confirm() e prompt() e esto listados na tabela abaixo. No possvel retornar o
controle da janela (de onde foram chamados) sem que os dilogos sejam fechados.
Mtodo
Exemplo
window.alert("Tenha Cuidado!");
alert("msg")
prompt("msg")
ou
prompt("msg",
"texto inicial")
confirm("msg")
5-3
Nos exemplos acima, a referncia window pode ser omitida ou substituda por outra
referncia caso os dilogos estejam sendo abertos em outras janelas.
Ao
Abre uma nova janela contendo um documento indicado
pela URL. Opcionalmente, a janela pode ter um nome que
pode ser usado em HTML, ou ter alteradas caractersticas
como tamanho, layout, etc. (veja tabela abaixo). Retorna
uma referncia do tipo Window para a janela criada:
filha = window.open("http://a.com/abc.html");
Fecha uma janela (no vale para frames para a ltima janela
da aplicao).
blur()
Torna uma janela inativa
focus()
Torna uma janela ativa (traz para a frente das outras, se for
uma janela independente).
scroll(x, y)
Rola o documento dentro de uma janela de forma que as
coordenadas x e y (em pixels) da pgina apaream no canto
superior esquerdo da rea til da janela, se possvel.
setTimeout("instrues", Executa uma ou mais instrues JavaScript aps um
atraso)
perodo de atraso em milissegundos. Este mtodo
parecido com a funo eval(), mas com temporizao. O
cdigo continua a ser interpretado imediatamente aps o
setTimeout(). A espera ocorre em um thread paralelo.
Retorna Number: um nmero de identificao que pode ser
passado como argumento do mtodo clearTimeout()
para executar a operao imediatamente, ignorando o
tempo que falta.
clearTimeout(id)
Cancela a temporizao de uma operao setTimeout()
cujo nmero de identificao foi passado como parmetro,
e faz com que as instrues do setTimeout() sejam
interpretadas e executadas imediatamente.
close()
5-4
abre uma janela de 200 pixels de altura por 400 de largura sem barra de ferramentas, sem barra
de diretrios, sem campo de entrada de URLs, sem barra de menus, no-redimensionvel e
com barra de status. As caractersticas esto na tabela abaixo:
Caracterstica
height=h
width=w
resizable
toolbar
directories
menubar
location
status
Resultado
h a altura da janela em pixels: height=150
w a largura da janela em pixels: width=300
Se estiver presente permite redimensionar a janela
Se estiver presente, mostra a barra de ferramentas do browser
Se estiver presente, mostra a barra de diretrios do browser
Se estiver presente, mostra a barra de menus do browser
Se estiver presente, mostra o campo para entrada de URLs
Se estiver presente, mostra a barra de status
Se for utilizado o mtodo open() com trs argumentos, qualquer caracterstica acima
que no aparea listada no string passado como terceiro argumento, no estar presente.
5-5
Eventos
Vrios eventos do JavaScript esto relacionados com janelas. Estes eventos so chamados a
partir dos atributos HTML listados abaixo, que so aplicveis aos descritores HTML <BODY>
e <FRAME>:
Por exemplo, o cdigo abaixo em uma pgina carregada em uma janela do browser
impedir que qualquer outra janela esteja ativa at que a janela atual seja fechada. Qualquer
tentativa de minimizar a janela, ou de selecionar outra causar o evento tratado por ONBLUR,
que chamar o mtodo focus(), reestabelecendo o estado ativo da janela.
<body onblur="focus()"> ... </body>
Este outro exemplo, mostra uma o uso do atributo de evento ONUNLOAD para criar
uma pgina que s permite uma nica sada, ou seja, s possvel sair da janela atual para
entrar em outra definida pelo autor da pgina. Qualquer tentativa de escolher uma outra
URL ser sobreposta:
<body onunload="location.href='pagina2.html';"> ... </body>
5-6
Se uma janela criada usando open(), mas o seu valor de retorno no armazenado
em uma varivel, no ser possvel ter acesso s propriedades da janela filha. Mas a nova
janela sempre pode ter acesso janela que a criou, manipular suas propriedades e at fechla. Toda janela filha possui uma propriedade opener, que uma referncia sua janela me.
Para manipular propriedades e invocar mtodos ela poder fazer:
opener.focus();
// torna a janela me ativa
opener.document.forms[0].elements[2].value = "Oi me!";
opener.close();
// mata a me
importante verificar que uma propriedade existe, antes de tentar us-la. Quando se
trabalha com mltiplas janelas, comum uma janela tentar usar uma propriedade que no
existe em outra (ou que ainda no existe). Se uma pgina procura um formulrio em outra
janela e a outra janela no mais apresenta a pgina que tinha o formulrio, o browser acusar
um erro, informando a inexistncia do objeto.
A tentativa de acessar propriedades inexistentes provoca erros feios em JavaScript. Os
browsers mais novos j escondem as janelas de aviso, mas muitos ainda no o fazem. Uma
forma de evit-los sempre verificar se um objeto est definido, antes de us-lo. Isto pode
ser feito em JavaScript usando a palavra-chave null:
if (janela != null) {
// verifica se janela existe
janela.focus();
// coloca na frente
if (janela.document.forms[0] != null) { // formulario existe?
if (campotexto != null) {
janela.document.forms[0].campotexto.value = "OK";
}
}
} else {
janela = open("pagina.html");
janela.document.forms[0].elements[0].value = "OK";
}
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
5-7
Exerccio Resolvido
Monte duas pginas HTML como mostrado na figura abaixo. A primeira pgina deve ter um
boto Abre Janela que, quando apertado, deve abrir uma nova janela nas dimenses
360x280 (pixels). Depois de aberta, a nova janela dever estar na frente da antiga (use
focus()).
Depois que as duas janelas estiverem abertas, o texto digitado no campo enviar, da
janela menor, deve aparecer na caixa de mensagens da janela maior, logo que o boto envia
for pressionado. Em seguida, a janela maior dever tornar-se ativa. Pode-se fazer o mesmo
na janela maior e passar informaes para o campo de mensagens da janela menor.
Use os esqueletos jan1.html e jan2.html disponveis no subdiretrio cap5/. A
soluo mostrada a seguir e est nos nos arquivos jan1sol.html e jan2sol.html.
Soluo
O exemplo a seguir ilustra a comunicao entre janelas. So duas listagens. A primeira o
arquivo para a primeira janela e a segunda o arquivo para a sub-janela. Observe o nome do
arquivo jan2.html. Deve ser idntico ao primeiro parmetro do mtodo open() na
pgina abaixo.
A pgina principal contm um boto que permite criar uma nova janela. A partir da,
escreva algo no primeiro campo da nova janela, clique na primeira e veja os dados serem
copiados de uma janela para outra.
5-8
5-9
</HEAD>
<BODY>
<H1>Janela 1</H1>
<FORM NAME=f1>
<P>Mensagem a enviar:<INPUT TYPE=text NAME="enviar">
<INPUT TYPE=button VALUE="envia" onclick="envia()">
<p>Mensagens recebidas: <br>
<TEXTAREA NAME="mensagens" COLS=40 ROWS=5>
</TEXTAREA>
</FORM>
</BODY>
</HTML>
Frames HTML
Frames so janelas que esto limitadas dentro de outras janelas. Atravs de referncias
especiais, possvel, usando JavaScript, manipular as propriedades de qualquer frame dentro
de uma janela ou em outra janela. Antes de apresentar, porm, como possvel manipular
frames em JavaScript, vejamos como os frames podem ser construdos em HTML.
Para dividir uma janela em frames, preciso criar uma pgina HTML especificando as
dimenses relativas ou absolutas das subjanelas em relao janela que ir conter a pgina.
Uma pgina de frames no um documento HTML, pois no contm informao. Todo
documento HTML deve ter a forma:
<html>
<head> ... </head>
<body> ... </body>
</html>
O bloco <body> contm a informao da pgina. O bloco <head>, contm metainformao, ou seja, informao sobre a pgina. Pginas de frames tm uma estrutura
diferente:
<html>
<head> ... </head>
<frameset atributos> ... </frameset>
</html>
At podem conter blocos <BODY>, mas isto ora os transforma em pginas de informao, ora no causa
efeito algum. Um bloco <BODY> antes do <FRAMESET> faz com que o browser ignore o <FRAMESET>. Um
bloco <BODY> aps o <FRAMESET> ser ignorado por browsers que suportam frames, mas ser lido por
browsers antigos que no os suportam.
2
5-10
divide a janela principal em trs colunas, tendo as duas primeiras da largura total, e a
ltima, metade da largura total. De forma semelhante pode-se dividir a janela em linhas.
Neste outro exemplo (figura ao lado):
<FRAMESET ROWS="100,200,*,100"> ... </FRAMESET>
a janela foi dividida em quatro linhas, tendo a primeira e quarta 100 pixels
cada de altura, a segunda 200 pixels e a terceira, o espao restante.
Um bloco <FRAMESET>...</FRAMESET> s pode conter dois tipos
de elementos:
descritores <FRAME>, que definem a pgina HTML que ocupar uma janela. A
pgina HTML poder ser uma pgina de informao comum ou outra pgina de
frames que dividir a sub-janela novamente em linhas ou colunas.
sub-blocos <FRAMESET> ... </FRAMESET> que dividiro outra vez a subjanela
(em linhas ou colunas) e podero conter descritores <FRAME> e novos subblocos <FRAMESET>.
5-11
pgina de
frames
pgina de
frames
frset1.html
dois.html
Pgina Web
ich aus et in unnus buus
zich aus char wultt dus
janela 1
Formulrio
janela 2-1
pginas de
informao
Formulrio
Pgina Web
a
ich aus et in unnus buus
zich aus char wultt dus
par stak can litte sim
ich aus et in unnus buus
zich aus char wultt dus
par stak can litte sim
janela 2
um.html
janela 2-2
Formulrio
frset2.html
Janela do browser
(janela 0)
tres.html
Observe que h trs nveis de pginas. No nvel mais alto est a pgina frset1.html,
que ocupa toda a janela do browser. No segundo nvel esto os arquivos um.html e
frset2.html. E no terceiro nvel, encontramos os arquivos dois.html e tres.html.
5-12
Esta segunda verso, possui apenas dois nveis. No primeiro, a pgina de frames
frset.html, no segundo, as pginas de informao. A aparncia final a mesma, nas duas
verses, mas na primeira verso h uma janela a mais (janela2) que pode ser manipulada
em JavaScript e em HTML. Se a janela2 for utilizada como alvo de um link HTML:
<a href="pagina.html" TARGET="janela2"> link </A>
5-13
Um script nesta pgina pode manipular os seus frames de duas formas: pelo nome ou
atravs do vetor frames. O cdigo abaixo mostra duas maneiras diferentes de mudar a cor
de fundo das pginas do primeiro e do ltimo frame:
frames[0].document.bgColor
frames[2].document.bgColor
janela1.document.bgColor =
janela2_2.document.bgColor
= "red";
= "blue"; // ... a mesma coisa que...
"red";
= "blue";
A partir de top pode-se chegar a qualquer frame, usando seu nome ou o vetor
frames. Nos casos onde existem apenas dois nveis de frames, top sinnimo de parent. A
figura abaixo mostra vrias formas de comunicao entre frames:
<SCRIPT> em dois.html
top.frames[1].frames[1]
<SCRIPT> em um.html
Pgina Web
ich aus et in unnus buus
zich aus char wultt dus
par stak can litte sim
ich aus et in unnus buus
zich aus char wultt dus
par stak can litte sim
Pgina Web
Formulrio
b
dois.html
Pgina Web
a
um.html
parent = top
parent.parent = top
Formulrio
5-14
top
parent.frames[0]
<SCRIPT> em tres.html
Formulrio
c
tres.html
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
top.frames[0] = parent.parent.frames[0]
Exerccios
5.1
5.2
Este exerccio usa frames para passar informaes entre pginas. Divida a janela em
dois frames, sendo um frame fixo, com altura zero (dever ficar escondido na parte
de baixo da pgina) e outro, ocupando toda a pgina. Crie uma pgina HTML
contendo apenas um formulrio e um elemento <textarea>. Crie mais quatro
pginas HTML. A primeira delas dever ser carregada no frame maior. As trs
primeiras so idnticas e devero ter, cada uma, uma caixa de texto, onde o usurio
dever digitar um nmero, e um link, para a pgina seguinte. Quando o usurio
decidir seguir para a pgina seguinte, o texto digitado dever ser copiado para o
<textarea> da pgina escondida. Ao chegar na quarta pgina, esta dever exibir os
nmeros digitados em cada pgina e a sua soma. (em vez de <textarea>, pode-se
usar <input type=hidden>, e manter os dados temporrios invisveis. Veja o
diagrama da aplicao na figura abaixo. Esta uma forma de passar informaes
entre pginas sem usar cookies.
<FRAMESET
ROWS="100%,0%">
Pgina 1
x 13
Pgina 2
y 17
pag 2
pag 3
Pgina 3
Pgina 4
z 5
pag 4
13 : 17 : 5
Pgina Oculta
5.3
5-15
Captulo 6 O browser
O browser
COM O GRANDE NMERO DE VERSES, PLATAFORMAS E FABRICANTES de browsers, cada
um suportando extenses proprietrias e introduzindo recursos incompatveis, til poder
indentificar o browser que est carregando uma determinada pgina. Com esta informao,
pode-se tomar a deciso utilizar instrues que s existem naquela verso de browser, ou de
redirecionar a janela para outra pgina. Informaes sobre o cliente que acessa uma pgina
so mantidas pela propriedade global navigator.
Objeto Navigator
O objeto Navigator1 representa as propriedades do browser. Usando suas propriedades e
mtodos booleanos (que retornam true ou false) possvel identificar as possibilidades de
um cliente e desenvolver pginas personalizadas com contedo especfico para aproveitar ao
mximo os recursos existentes.
Navigator define as caracterticas de um nico objeto, representado pela propriedade
2
global navigator. Todas as suas propriedades so somente-leitura. Todas as cpias de
navigator em uma mesma aplicao so idnticas e possuem as mesmas propriedades.
As informaes que se pode obter atravs da propriedade navigator so:
Marca, nome, plataforma e verso do browser do cliente
Plug-ins instalados no cliente (em browsers Netscape).
Tipos de dados MIME suportados pelo browser e pela plataforma do cliente,
atravs de plug-ins e programas externos ao browser habilitados a funcionarem
como aplicaes auxiliares para tipos desconhecidos do browser (Netscape).
Assim como Window, no existe na documentao do JavaScript 1.1 um objeto ou construtor chamado
Navigator. Usamos este nome apenas para referirmos ao tipo que define os mtodos e propriedades do
objeto navigator e manter a consistncia com os outros objetos.
2 No Internet Explorer, navigator no global, mas propriedade de window.
1
6-1
Propriedade
userAgent
Descrio
Contm String. Informao contida no cabealho HTTP User-Agent.
Esta propriedade a combinao das propriedades appCodeName e
appVersion.
Exemplos:
Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)
Mozilla/4.5 [en] (Win95; I)
appCodeName
appVersion
appName
mimeTypes
plugins
6-2
Captulo 6 O browser
Identificao da verso
Obter a verso do browser uma tarefa mais complicada. Ela est disponvel tanto na
propriedade userAgent, como na propriedade appVersion. A verso aqui refere-se ao
browser de referncia Mozilla, tanto para Netscape como para o Internet Explorer. O
Internet Explorer 3, por exemplo, compatvel com o Netscape Navigator 2.0, portanto a
verso que aparece para o Internet Explorer 3 2.0 e no 3.03.
Usar appVersion mais fcil pois a verso est logo no incio do string. Tanto nos
browsers da Microsoft quando nos browsers da Netscape a primeira coisa aps a verso
um espao. Portanto, basta identificar o espao, e recuperar o substring que est antes dele.
Eis duas formas de fazer isto:
espaco = navigator.appVersion.indexOf(" ");
versao = parseFloat(navigator.appVersion.substring(0, espaco));
versao = parseInt( navigator.appVersion.split(" ")[0] );
Se apenas interessa o valor maior da verso, pode-se truncar o que est depois do
ponto usando simplesmente:
versao = parseInt(navigator.appVersion);
Depois de extrada a verso, ela pode ser usada para executar trechos de cdigo
dependentes de browser:
if (versao < 3.0 && navigator.appName == "Netscape") {
// cdigo para browsers Netscape de verses inferiores a 3
}
Identificao da plataforma
A posio e o tamanho da informao sobre a plataforma diferem nos browsers Internet
Explorer e Netscape Navigator. O ideal, portanto, identificar primeiro o browser, para
depois identificar a plataforma. Strings como Win, Mac, 95 e NT esto presentes
em ambos os browsers. Pode-se ento localizar esses strings em appVersion:
if (navigator.appVersion.lastIndexOf('Win') != -1) {
// Windows... que tipo?
if (navigator.appVersion.lastIndexOf('NT') != -1)
// Windows NT
else if (navigator.appVersion.lastIndexOf('Mac') != -1) {
// Macintosh
} else {
// outra plataforma... Unix talvez
}
Para obter a verso verdadeira do Internet Explorer, preciso extrair a informao localizada entre
parnteses no meio do string appVersion do Internet Explorer (compatible; MSIE 4.0; Windows
3
95)
6-3
Exerccio Resolvido
Escreva um programa JavaScript que redirecione a janela do browser de acordo com o tipo
de browser que a carregar. Para redirecionar, use a instruo:
location.href = "url destino";
Soluo
A soluo est mostrada no cdigo a seguir (arquivo redir.html) e deve estar em um
bloco <SCRIPT> no incio da pgina.
<html> <head>
<script language="JavaScript1.1">
<!-browser = navigator.appName;
versao = parseInt(navigator.appVersion);
netscape = "Netscape";
explorer = "Microsoft Internet Explorer";
if (browser == netscape && versao >= 3) {
location.href = "netscape.html";
} else if (browser == explorer && versao >= 4) {
location.href = "msie.html";
} else {
location.href = "outro.html";
}
// -->
</script>
</head>
<!-- Somente browsers que no suportam JavaScript 1.1 continuaro -->
(...)
Browsers que so excees (no foram previstos pelo cdigo) sempre devem
permanecer na pgina ou ficar com parmetros default (que no dependam do cdigo) pois
sempre existe a possibilidade do browser no entender JavaScript de forma alguma. O bloco
<SCRIPT> com o atributo LANGUAGE=JavaScript1.1 garante que browsers que suportam
verses de JavaScript inferiores a 1.1 no iro tentar interpretar o cdigo.
6-4
Captulo 6 O browser
Mtodos
Os mtodos de navigator so apenas dois:
Mtodo
Ao
javaEnabled()
Retorna true se o suporte a Java est habilitado.
taintEnabled() Retorna true se o modelo de segurana data-tainting est habilitado.
Se o usurio no suporta data-tainting (o que comum), certas operaes como a
chamada de mtodos em outras janelas poder no funcionar, se contiverem arquivos de
servidores diferentes. Se o suporte a Java no estiver ativado, o browser no ser capaz de
executar applets. Sabendo disso, o programador poder oferecer uma alternativa.
Suponha, por exemplo, que uma pgina use formulrios HTML para oferecer uma
interface de conexo a um servio. O formulrio simples, consiste de duas caixas de texto
(para login e senha) e um boto Conectar:
<form action="auth.exe?verhtml" method=POST>
<p>User ID <input type=text name=usuario size=14>
Senha
<input type=text name=senha size=14 maxlength=10>
<input type=submit value="Conectar">
</form>
Suponha agora que o autor do site decida substitu-la por um applet, oferecendo a
mesma interface, mas aproveitando os recursos de segurana da linguagem Java. No lugar do
formulrio, a pgina teria um descritor HTML do tipo:
<applet code=PainelCon.class height=80 width=450></applet>
6-5
MimeType
Cada objeto do vetor navigator.mimetypes um objeto MimeType, que possui
propriedades de tipo, descrio, extenses de arquivo e plug-ins habilitados para suportar o
tipo. Para obter uma lista de todos os tipos MIME suportados em um browser Netscape
Navigator 3.0 ou superior, pode-se fazer:
Multipart Internet Mail Extension. Padro Internet para identificao de contedo baseado em um par de
identificadores que representam um tipo genrico (imagem, texto, aplicao, etc.) e um tipo especfico (JPEG,
GIF, EXE, HTML, TEX, etc.). O formato tipo_genrico/tipo_especfico. Exemplos: image/jpeg,
image/gif, text/html, text/plain, application/msword, application/exe.
4
6-6
Captulo 6 O browser
description
contm text/html
String. Descrio em ingls do tipo de contedo representado pelo tipo
MIME. Exemplo:
navigator.mimetypes["text/html"].description
suffixes
enabledPlugin
contm null
PlugIn
Cada plug-in instalado no browser (Netscape) do cliente um objeto PlugIn que possui
propriedades contendo o seu nome, nome de arquivo, descrio e vetor de tipos MIME
suportados pelo plug-in. Um vetor de todos os plug-ins obtido atravs da propriedade
navigator.plugins. Se um plug-in existe, ele pode ser includo na pgina usando um
descritor <EMBED>.
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
6-7
O trecho de cdigo abaixo (arquivo plugins.html) pode ser usado para imprimir
uma lista com todos os plug-ins instalados em um browser (somente Netscape):
<script>
numPlugins = navigator.plugins.length;
document.write("<p>Plug-ins instalados: " + numPlugins);
if (numPlugins > 0) {
for (i = 0; i < numPlugins; i++) {
document.write("<p><b>Nome: </b>" + navigator.plugins[i].name);
document.writeln("<br><b>Arquivo: </b>");
document.write(navigator.plugins[i].filename);
document.write("<br><b>Descrio: </b>");
document.write(navigator.plugins[i].description);
document.write("<br><b>Qte. de tipos MIME suportados: </b>");
document.write(navigator.plugins[i].length);
}
}
</script>
Data-tainting
O modelo de segurana do JavaScript impede que programas enviados por um servidor
tenham acesso a propriedades de documentos enviados por outro servidor e assim possam
utilizar informao privativa. Com esse modelo, impossvel que uma janela leia, por
exemplo, o histrico (objeto window.history) de outra janela, caso o documento tenha
originado de um servidor diferente.
O browsers Netscape 3.0 em diante, suportam um modelo segurana conhecido
como data-tainting5 (marcao de dados). Com ele possvel flexibilizar estas restries de
forma segura, mas isto depende do cliente, que deve ativar o recurso no seu browser, j que
ele no e ativado por default. Com o data-tainting ativado, uma janela poder ter acesso a
propriedades de outra janela no importando de onde veio o documento, mas o autor da
5
6-8
Captulo 6 O browser
outra janela pode manchar (taint) certos valores de propriedades que devem ser mantidas
privativas e impedir que essas informaes sejam passadas sem a permisso do usurio.
Na prtica, data-tainting pouco til pois os browsers Netscape no so instalados
com o recurso habilitado. Para instal-lo preciso que o cliente tome a iniciativa de definir
uma varivel de ambiente no seu sistema. Os browsers Internet Explorer tambm no
suportam o recurso, embora sejam mais flexveis em relao segurana. Um programador
pode verificar se data-tainting est habilitado, usando o mtodo taintEnabled() de
navigator:
if (navigator.taintEnabled()) {
// instrues se taint est habilitado
}
Exerccio
6.1
6-9
Captulo 7 - Navegao
Navegao
CINCO OBJETOS JAVASCRIPT ESTO RELACIONADOS COM A NAVEGAO em hipertexto.
Com eles possvel ler e alterar as localidades representadas pelos links, redirecionar as
janelas do browser para outras pginas e controlar as informaes contidas no histrico de
navegao de uma janela.
Area, Link e Anchor permitem manipular com as propriedades dos elementos HTML
<AREA>, <A HREF> e <A NAME> contidos em uma pgina HTML. Os objetos History e Location
permitem mudar o contedo das janelas dinamicamente.
Objeto History
O objeto History um vetor de strings somente-leitura usado por uma janela do browser
para armazenar os lugares j visitados durante uma sesso. O contedo da lista o
equivalente ao encontrado nas opes Histrico, History ou Go dos browsers
Microsoft Internet Explorer e Netscape Navigator. Os botes Back ou Voltar e
Forward ou Avanar usam as informaes no histrico para navegar atravs dele.
History uma caracterstica da janela. Todo objeto Window possui uma propriedade
history. Na janela atual, pode ser usado tambm como uma referncia global, usando
simplesmente o nome history.
As propriedades de History so quatro mas apenas uma utilizvel na prtica, que
length. As outras s so suportadas em browsers Netscape e com vrias restries:
Propriedade
length
current
next
previous
Descrio
Number. Contm o nmero de itens do histrico do browser
String. Contm uma string com a URL da pgina atual.
String. Contm uma string com a URL da prxima pgina do histrico
String. Contm uma string com a URL da pgina anterior do histrico.
7-1
Ao
Avana ou volta n pginas no histrico. A segunda forma procura no
histrico at encontrar a primeira pgina que tenha a string especificada
no ttulo do documento ou nas palavras da sua URL.
Volta uma pgina no histrico (simula o boto Back ou Voltar do
browser).
Avana uma pgina no histrico (simula o boto Forward ou
Avanar do browser).
Retorna String. Converte o histrico em uma tabela HTML de URLs,
cada uma com seu link. Pode ser impressa usando document.write()..
S funciona se o modelo de segurana data-tainting estiver ativado.
Exerccios
7.1
O que, na maioria dos casos, no ocorre. Data-tainting (veja captulo 6) suportado por browsers Netscape,
apenas, e mesmo assim, exige que o usurio habilite a opo em seu browser (no default).
2 O painel de navegao funcionar enquanto o usurio se mantiver no mesmo site (a no ser que datatainting esteja ativado).
1
7-2
Captulo 7 - Navegao
Objeto Location
Location uma propriedade das janelas que representa a URL cujo documento est sendo
exibido3. Todo objeto Window possui uma propriedade location. As propriedades de
Location so strings com partes da URL atual. Se forem alteradas, a URL atual ir mudar e o
browser tentar imediatamente carregar o recurso localizado pela nova URL na janela atual.
A propriedade mais usada de Location location.href, que contm a URL
completa. Mudar o valor de location.href uma forma de causar o redirecionamento
dinmico:
location.href = "http://www.aeiouy.com/pag2.html"
Descrio
A URL completa. Exemplo:
http://www.abc.com:80/sub/dir/index.html?name=Cookie1#parte2
protocol
host
port
hostname
pathname
hash
search
Os mtodos de location so dois: reload() usado para fazer uma pgina ser
recarregada e replace() apaga a pgina anterior do histrico, substituindo-a com uma nova:
Mtodo
Ao
reload() ou
Sem argumentos, recarrega a pgina atual caso no tenha sido
reload(true)
modificada. Com o argumento true, carrega a pgina
incondicionalmente.
replace("URL") Carrega a pgina especificada pela URL e substitui o registro anterior do
histrico com o registro atual.
7-3
Exerccios
7.2
Crie uma roleta que jogue o usurio em um site escolhido aleatoriamente a partir
de uma lista armazenada em um vetor.
7.3
Crie uma janela pequena, sem barra de menus, status, ou scrollbars, para servir de
barra de navegao flutuante para um site. Ela deve abrir quando o usurio clicar em
um link SiteMap e ficar sempre na frente das outras janelas. Todas as URLs das
pginas do site devem estar em um componente <select> que, ao ter uma opo
escolhida pelo usurio, deve fazer com que a janela que o abriu (se ela ainda existir)
passe a exibir a nova URL. Se a janela no mais existir, uma nova dever ser criada.
7.4
Usando setTimeout() (mtodo de Window), escreva uma rotina que faa com que
uma pgina carregue outra que a substitua na janela do browser em 30 segundos.
7-4
Captulo 7 - Navegao
// numLinks contm 7
do exemplo acima tenha sua URL destino alterada para sudeste/index.html: atravs do
ndice do vetor links ou atravs do nome:
document.links[3].href = "sudeste/index.html";
document.se.href = "sudeste/index.html";
Descrio
A URL completa. Exemplo:
http://www.abc.com:80/sub/dir/index.html?name=Cookie1#parte2
protocol
host
port
hostname
pathname
hash
search
target
Eventos
No h mtodos definidos para os objetos Link e Area. Existem, porm, trs eventos
manuseados por atributos dos elementos HTML que representam esses objetos. Os dois
primeiros atributos aplicam-se tanto a elementos <A HREF> como a elementos <AREA>:
vnculo ou imagem.
7-5
Todos os eventos so tratados antes que o browser siga o vnculo do atributo HREF,
por exemplo, no cdigo abaixo, a URL no atributo HREF do vnculo abaixo nunca ser
carregada pois a janela ser redirecionada para outra localidade assim que o usurio passar o
mouse sobre o link:
<a href="http://www.sao.nunca.org" onmouseover="http://www.eh.aqui.com">
No chegue perto deste link!
</a>
Objeto Anchor
O objeto Anchor representa uma ncora fixa. ncoras podem ser referenciadas como URLs
destino localizando partes de um documento. Em HTML, qualquer elemento <A> que tiver
um atributo NAME pode ser usado como ncora:
<a name="aqui"></a>
A ncora no precisa conter texto. Marca uma posio que pode ser localizada a partir de
um vnculo local pgina ou no. Dentro da pgina, pode-se criar um link para a ncora
usando:
<a href="#aqui">Rolar a pgina at chegar l</a>
Em pginas externas, o fragmento #aqui deve ser acrescentado ao link, logo aps o
nome do arquivo. No trecho de cdigo abaixo, h dois objetos Anchor, destacados em
negrito:
<BODY>
<h1><a name="top"></a>Mapa Interativo</h1>
(...)
<p align=center>
<a href="index.html">Volta para Revendedores</a>
<a href="../index.html" name="hp">Home Page</a>
</BODY>
// numAncoras contem 2
7-6
Captulo 7 - Navegao
Descrio
Nome da ncora (texto que est no seu atributo NAME do HTML)
Exerccios
7.5
Escreva um programa JavaScript que construa, no final da pgina, uma tabela HTML
com links para todas as ncoras contidas na pgina.
7.6
7-7
A pgina HTML
AS PROPRIEDADES DE UMA PGINA HTML incluem seus elementos, representados pelos
descritores HTML, atributos como cor de fundo ou cor dos links, e informaes enviadas
pelo servidor como cookies, URL, referenciador e data da ltima modificao. Todas essas
propriedades so acessveis atravs de JavaScript, e vrias podem ser alteradas.
Alm de permitir o acesso s propriedades, JavaScript tambm define vrios mtodos
para gerar HTML e criar pginas novas, em tempo de exibio.
A nica forma de ter acesso a uma pgina atravs da propriedade document, que
qualquer objeto do tipo Window possui. A pgina da janela onde roda o script pode ser
acessada diretamente pela propriedade window.document, ou simplesmente document.
Esta propriedade possui mtodos e propriedades definidos pelo tipo Document, apresentado
neste captulo.
Objeto Document
O objeto document representa o documento HTML atual. document uma propriedade de
window e, portanto, pode ser usado sem fazer referncia a window:
window.document
// ou simplesmente document
Para ter acesso a pginas de outras janelas, preciso citar a referncia Window que
possui a propriedade document:
janela = open("nova.html");
janela.document.bgColor = "green";
parent.fr1.fr1_2.document.forms[0].b1.click();
8-1
Acesso Funo
bgColor
read / Contm String. Define ou recupera cor de fundo da pgina. Pode
write um string contendo cdigo hexadecimal do tipo #rrggbb ou
nome da cor (red, blue, navy, etc.)
fgColor
r / w Contm String. Define ou recupera cor do texto na pgina.
linkColor
r / w Contm String. Define ou recupera cor de links na pgina.
alinkColor
r / w Contm String. Define ou recupera cor de links ativos.
vlinkColor
r / w Contm String. Define ou recupera cor de links visitados.
title
r
Contm String. Recupera o ttulo (<TITLE>) do documento.
links
r
Contm Array de objetos Link. Para obter a quantidade de links
<A HREF> no documento: document.links.length
applets
r
Contm Array de objetos Applet. Para obter a quantidade de
applets <APPLET> no documento: document.applets.length
anchors
r
Contm Array de objetos Anchor. Para obter a quantidade de
ncoras <A NAME> no documento: document.anchors.length
embeds
r
Contm Array de objetos PlugIn. Para obter a quantidade de
plugins <EMBED> no documento: document.plugins.length
plugins
r
Contm Array de objetos PlugIn. Mesma coisa que embeds
images
r
Contm Array de objetos Image. Para obter a quantidade de
imagens <IMG> no documento: document.images.length
location
r
Contm String com URL do documento.
URL
r
Mesma coisa que location.
referrer
r
Contm String com URL do documento que contm um link para
o documento atual.
lastModified
r
Contm String. A string recebida informa a data da ltima
modificao do arquivo. Est no formato de data do sistema. Pode
ser convertida usando Date.parse() e transformada em objeto
ou automaticamente em String.
domain
r / w Contm String com o domnio dos arquivos referenciados.
cookie
r / w Contm String. Usado para ler e armazenar preferencias do usurio
no computador do cliente.
As propriedades bgColor, fgColor, linkColor, vlinkColor e alinkColor alteram
a aparncia da pgina. Correspondem aos atributos BGCOLOR, TEXT, LINK, VLINK e ALINK
do descritor HTML <BODY>, respectivamente. Existem desde as primeiras verses do
JavaScript, mas s podiam ser alteradas antes que a pgina fosse montada. Nos browsers
modernos, possvel mudar essas propriedades em tempo de exibio. Pode-se ter, por
exemplo, um link que apaga a luz quando o mouse passa sobre ele:
8-2
<a href="..."
onmouseover="document.bgColor='black'"
onmouseout=""document.bgColor='white'"> No se aproxime! </a>
Mtodos
Os mtodos de Document so usados principalmente para gerar HTML e criar novas pginas
em tempo de exibio e de carga. Os mtodos tanto podem ser aplicados na janela atual ou
em outras janelas de forma a gerar documentos novos.
Mtodo
write("string") ou writeln()
write("arg1","arg2",...
,"argn")
open() ou
open("tipo/subtipo")
Ao
Recebe e concatena zero ou mais argumentos
separados por vrgulas e os escreve na pgina atual.
8-3
mtodo write(), depois que a carga e exibio da pgina foi concluda, no funciona, pois
o canal de gravao do arquivo j foi fechado. Mas o canal pode ser reaberto com uma
chamada document.open():
document.open();
document.write("Esta a ltima linha do arquivo");
document.close();
A linha document.close() essencial para que o texto seja exibido. Uma chamada
ao mtodo document.clear(), depois de um document.open(), limpa a tela, permitindo
que o texto aparea no incio da tela.
Com exceo de write(), porm, h poucas aplicaes para os outros mtodos no
documento atual. Imprimir no final do arquivo no a melhor forma de criar pginas
dinmicas. As aplicaes mais interessantes so a gerao dinmica de pginas novas.
Mostraremos, na seo a seguir, um exemplo de gerao de pginas on-the-fly.
Em seguida, abrir o documento para que possa receber dados enviados por instrues
write(), posteriores:
w1.document.open(); // abre documento para gravao
w1.document.write("<html><head>\n<title>Nova Pgina</title>\n");
w1.document.write("</head>\n<body bgcolor=white>\n");
w1.document.write("<h1 align=center>Nova Pgina</h1>");
Para que o documento completo seja exibido, preciso que o fluxo de dados seja
fechado, depois que todos as instrues write() tenham sido enviadas. Quando isto
ocorre, quaisquer linhas que estejam na fila so impressas, e o documento fechado.
w1.document.close();
Exerccio Resolvido
Este exerccio consiste na construo de uma janela de confirmao para dados digitados em
um formulrio, antes do envio ao servidor, permitindo que o usurio verifique se os dados
que selecionou esto corretos antes de envi-los.
Crie um formulrio como o mostrado na figura (use o esqueleto form.html
disponvel). Quando o usurio apertar o boto Enviar Dados, uma nova janela dever ser
criada contendo a lista das informaes que ele selecionou e dois botes Corrigir e
Confirmar.
Caso o usurio decida fazer uma correo, deve apertar o boto Corrigir que tornar
ativa (focus()) a janela do formulrio. O usurio pode ento alterar quaisquer informaes
e enviar novamente. Aps novo envio, a janela de confirmao dever ser re-ativada ou
criada caso tenha sido fechada (verifique se preciso criar a janela ou no).
Caso o usurio confirme, os dados devem ser enviados para o servidor. Os dados
digitados na primeira janela, portanto, devem estar presentes tambm na segunda janela em
campos de formulrio (<hidden>) para que o programa CGI no servidor possa recuperlos. Como este exemplo apenas uma simulao, o envio pode ser sinalizado atravs de uma
janela de alerta.
8-5
Soluo
O primeiro passo a criao do formulrio. Ns j fornecemos um esqueleto com um
formulrio (cap8/form.html) pronto. Precisaremos utilizar os nomes dos campos
(atributo NAME) e saber o tipo de dispositivo de entrada usado. A listagem abaixo destaca os
nomes dos campos e seus tipos em negrito:
<form>
(...)
<td>Nome</td>
<td>Endereo</td>
<tr><td>CEP</td>
<td>Telefone</td>
<td>Cidade</td>
<td>Estado</td>
(...)
<option value="Santa Catarina"> SC </option>
<option value="Tocantins">
TO </option>
</select></td></tr>
<tr><td colspan=2>Meio de transporte:</td>
<td colspan=2><select name=Veiculo>
<option selected>Escolha um veculo</option>
<option> Porsche 911 </option>
(...)
<option> Jegue e carroa </option>
</select></td></tr>
<tr><td align=center colspan=4><br>
<input type=button value="Enviar Dados" onclick="enviar(this.form)">
<br> </td></tr></table>
</form>
8-6
Para evitar escrever sempre este longo string todas as vezes que uma varivel do
formulrio for usada, criamos novas variveis dentro da funo enviar():
function enviar(dados) {
// dados = document.forms[0]
nome
= dados.Nome.value;
endereco = dados.Endereco.value;
cep
= dados.CEP.value;
cidade
= dados.Cidade.value;
uf
= dados.UF.options[dados.UF.selectedIndex].value;
tel
= dados.Telefone.value;
carro
= dados.Veiculo.options[dados.Opcao_1.selectedIndex].text;
(...)
}
Antes de gerar uma nova pgina, o ideal cri-la da forma convencional, diretamente
em HTML como uma pgina esttica. Desta forma, fcil verificar sua aparncia e at
acrescentar mais recursos visuais. Nesta verso temporria, preenchemos os espaos onde
estaro os dados a serem gerados dinamicamente com os nomes das variveis (em negrito).
Observe que eles tambm so enviados em campos <hidden>, para que possam ser
repassados ao servidor (programa CGI). Esta a pgina que queremos gerar:
<HTML>
<HEAD>
<TITLE>Confirmao</TITLE>
</HEAD>
<BODY bgcolor=white>
<H2 align=center>Confirme sua inscrio</H2>
<FORM action="/cgi-local/inscricao.pl"> <!-- programa CGI -->
<P>Voc digitou os dados abaixo. Esto corretos?
<UL>
<LI><B>Nome:</B> nome </LI>
<LI><B>Endereo:</B> endereco </LI>
<LI><B>CEP:</B> cep </LI>
<LI><B>Cidade:</B> cidade </LI>
<LI><B>Estado:</B> estado </LI>
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
8-7
8-8
w1.document.write("<input
w1.document.write("<input
w1.document.write("<input
w1.document.write("<input
type=hidden
type=hidden
type=hidden
type=hidden
Eventos
Os eventos do JavaScript que afetam a pgina tambm afetam as janelas. Estes eventos so
chamados a partir dos atributos HTML listados abaixo, e so aplicveis aos descritores
<BODY> e <FRAME>. J os vimos no captulo anterior:
Exerccios
8.1
Escreva uma aplicao onde o usurio possa escolher trs cores de uma lista (use um
<select> ou <input type=radio>): uma cor de fundo, uma cor do texto e uma
cor do link. Aps os seletores, o documento deve conter um ttulo, alguns
pargrafos e links. Depois que o usurio clicar um boto Visualizar, a mesma
pgina deve ser recarregada mostrando a combinao que ele escolheu.
8.2
Escreva uma aplicao que, atravs de uma interface de formulrios, permita que o
usurio monte uma pgina HTML sem precisar saber HTML. O usurio dever
poder escolher o ttulo, dois subttulos e os textos de duas sees. Tambm deve
poder escolher cores (veja exerccio anterior). A pgina deve oferecer duas opes:
8-9
8.3
8-10
Captulo 9 - Imagens
Imagens
EM JAVASCRIPT, POSSVEL MANIPULAR COM AS IMAGENS DE UMA PGINA, alterando a URL
que localiza o arquivo de imagem. Assim, pode-se trocar a imagem que est sendo exibida por
outra durante a exibio da pgina. Tambm possvel criar novos objetos representando
imagens que inicialmente no aparecem na pgina e transferir seus arquivos previamente em
background, para que estejam disponveis na memria na hora da substituio. Com esses
recursos, pode-se incrementar a pgina com recursos dinmicos, como cones que mudam de
aparncia quando ocorre um evento, animaes e banners.
As imagens utilizadas em JavaScript podem ser carregadas de duas formas: atravs do
HTML e atravs de instrues JavaScript. As imagens estticas, fornecidas pela pgina HTML
atravs do descritor <IMG>, so representadas como objetos da pgina (document), acessveis
atravs da sua propriedade images: um vetor que contm referncias para todas as imagens do
documento. As imagens dinmicas, que no so fornecidas pelo HTML, podem ser criadas como
objetos JavaScript dentro de qualquer bloco <SCRIPT> ou atributo HTML de eventos usando o
operador new e o construtor Image().
Neste captulo, conheceremos as duas formas de manipular imagens em JavaScript, e
como utiliz-las para criar pginas dinmicas eficientes.
Image
Tanto uma imagem visvel em uma pgina HTML como uma imagem carregada na memria,
porm invisvel, podem ser representadas em JavaScript por um objeto do tipo Image.. Para criar
uma referncia para uma imagem que no existe na pgina, preciso usar new:
figura5 = new Image(50, 100);
9-1
A propriedade src tem a mesma funo do atributo SRC do descritor HTML <IMG>:
indicar a URL do arquivo-fonte da imagem.
Toda pgina que possui o descritor HTML <IMG> j possui um objeto Image que pode ser
manipulado atravs da sua propriedade document.images (do tipo Array). Para criar uma nova
imagem no documento, preciso usar HTML e o descritor <IMG>, cuja sintaxe geral est
mostrada abaixo:
<IMG SRC="URL do arquivo-fonte da imagem"
NAME="nome_do_objeto"
ALT="texto alternativo (descrio da imagem)"
LOWSRC="URL de arquivo-fonte de baixa-resoluo"
HEIGHT="altura em pixels"
WIDTH="largura em pixels"
HSPACE="margens externas laterais em pixels"
VSPACE="margens externas verticais em pixels"
BORDER="largura da borda de contorno em pixels "
ALIGN="left" ou "right" ou "top" ou "middle" ou "bottom" ou
"texttop" ou "absmiddle" ou "absbottom" ou "baseline"
ISMAP
<!-- imagem mapeada do lado do servidor -->
USEMAP="#mapa" <!-- imagem mapeada por mapa no cliente -->
ONABORT="Cdigo JavaScript"
ONERROR="Cdigo JavaScript"
ONLOAD="Cdigo JavaScript" >
Todos os atributos, com exceo de SRC, so optionais. Para manipular uma imagem do
HTML em JavaScript, preciso usar o vetor images que contm referncias para cada uma
das imagens do documento, na ordem em que elas aparecem no cdigo HTML:
prima = document.images[0];
nona = document.images[8];
9-2
Captulo 9 - Imagens
prima = document.anta;
lowsrc
hspace
vspace
width
Descrio
Boolean. Contm true se a imagem foi carregada completamente.
String. Reflete o valor do atributo HTML BORDER
String. Reflete o valor do atributo HTML HEIGHT
String. Reflete o valor do atributo HTML NAME
String. Reflete o valor do atributo HTML SRC se for uma imagem da
pgina HTML, e permite redefini-lo. Sempre indica o arquivo-fonte ou
URL da imagem.
String. Reflete o valor do atributo HTML LOWSRC e permite redefini-lo.
Indica o arquivo-fonte de baixa-resoluo temporrio da imagem, que
carregado antes do arquivo em SRC.
String. Reflete o valor do atributo HTML HSPACE
String. Reflete o valor do atributo HTML VSPACE
Retorna o valor do atributo HTML WIDTH
bat.jpg
(200x200)
<img src="tapir.gif"
height=200 width=380>
9-3
imagens tenham sido carregadas1. O descritor <IMG> funciona como uma janela onde a imagem
pode ser exibida. Havendo um descritor <IMG> na pgina, sua imagem original poder ser
substituda por qualquer imagem, cujo arquivo tenha sido carregado dinamicamente, atravs da
propriedade src. Por exemplo:
document.images[0].src = animal.src;
mas isto faria com que o browser tentasse carregar a imagem no momento em que a instruo
acima fosse interpretada. Se uma pgina j foi completamente carregada e um evento dispara a
instruo acima, o usurio teria que esperar que a imagem fosse carregada atravs da rede. No
outro exemplo, a carga da imagem poderia ter sido feita antes. Quando o evento causasse a
troca das imagens, ela estaria disponvel no cache e seria substituiria a antiga imediatamente.
Quando se utiliza vrias imagens, til carreg-las todas antes do uso. Isto pode ser feito
colocando instrues em um bloco <SCRIPT> dentro do <HEAD> de uma pgina, o que garante
que ser executado antes de qualquer outra instruo no <BODY>. O cdigo abaixo carrega 10
imagens chamadas tela1.gif, ..., tela10.gif e as armazena em um vetor telas:
<head>
<script>
telas = new Array(5);
for (i = 0; i < imagens.length ; i++) {
telas[i] = new Image();
telas[i].src = "tela" + (i+1) + ".gif";
}
</script>
(...)
<head>
1
2
9-4
Captulo 9 - Imagens
As 10 imagens podem ser usadas para substituir outras imagens da pgina ou para fazer
uma animao. Usando vetores, fica fcil manipular toda a coleo atravs de seus ndices.
Quando uma substituio ocorrer:
document.images[2].src = telas[5];
function carregaImagens() {
telas = new Array(10);
for (i = 0; i < imagens.length ; i++) {
telas[i] = new Image();
telas[i].src = "tela" + (i+1) + ".gif";
}
}
(...)
</script>
</head>
poder ser chamada depois que a pgina tiver sido carregada com:
<BODY ONLOAD="carregaImagens()">
...
</BODY>
Eventos
Os atributos HTML de <IMG> que respondem a eventos associados com imagens so:
9-5
far com que a transferncia da imagem seja reiniciada cada vez que o usurio tentar
interromp-la.
ONLOAD executa quando a imagem termina de ser carregada.
Exerccio Resolvido
Crie um icone ativo (link em torno de uma
imagem) em uma pgina HTML que muda de cor
quando o mouse passa sobre ele. Utilize duas
imagens disponveis no diretrio cap9/. A
primeira, dullbart.gif, mais apagada, deve estar
presente na pgina quando ela for carregada; a
outra brightbart.gif, deve substituir a primeira
quando o mouse estiver sobre ela (evento
ONMOUSEOVER do link <A>). A primeira imagem
dever voltar a ocupar a sua posio quando o mouse deixar a imagem (evento ONMOUSEOUT do
link <A>). H um esqueleto disponvel em bart.html.
A substituio deve ser imediata. As duas imagens devem estar carregadas na memria
antes de haver qualquer substituio.
Soluo
A listagem a seguir apresenta uma possvel soluo ao problema proposto (est no arquivo
bartsol.html).
<html>
<head>
<title>Imagens</title>
<script>
9-6
Captulo 9 - Imagens
apagado = new
aceso
= new
apagado.src =
aceso.src
=
Image();
Image();
"dullbart.gif";
"brightbart.gif";
function apaga() {
document.images[0].src = apagado.src;
}
function acende() {
document.images[0].src = aceso.src;
}
</script>
</head><body>
<a href="" onmouseover="acende()" onmouseout="apaga()">
<img src="dullbart.gif" width=43 height=58 border=0>
</a>
</body>
</html>
Exerccios
9.1
9.2
Na pgina uma.html (figura abaixo) h 5 imagens preto-ebranco. Faa as seguintes alteraes para que sua aparncia seja
mudada de acordo com o movimento do mouse do usurio
sobre as imagens (use os arquivos disponveis no diretrio
cap9/):
a) Faa com que cada imagem impb-nn.jpg (onde nn 01, 02,
03, 04 ou 05) seja trocada por sua
correspondente a cores imnn.jpg quando o mouse passar
sobre a ela.
b) Quando o mouse deixar a imagem
e passar para outra rea da pgina,
9-7
9-8
Captulo 10 Formulrios
10
Formulrios
OS COMPONENTES DE FORMULRIO SO OS OBJETOS HTML mais utilizados em JavaScript.
Por componentes de formulrio nos referimos a qualquer campo de entrada de dados
dentro de um bloco HTML <FORM>, como bootes, caixas de seleo, caixas de texto e
botes de rdio. Eles so a principal forma de entrada de dados disponvel no HTML.
Os objetos de formulrio consistem de doze objetos, situados abaixo de Form, no
modelo de objetos do documento JavaScript. So referncias aos elementos HTML
<INPUT>, <SELECT>, <OPTION> e <TEXTAREA>.
Uma das principais aplicaes do JavaScript, a validao de dados em aplicaes
Web. Verificar se os campos de um formulrio foram preenchidos corretamente antes de
enviar os dados a um programa no servidor uma tarefa realizada eficientemente com
JavaScript. Na maior parte das aplicaes, JavaScript capaz de fazer toda a verificao
localmente, economizando conexes de rede desnecessrias.
Neste captulo, apresentaremos cada um dos objetos JavaScript relacionados a
componentes de formulrio, como cri-los em HTML e como manipular os dados
recebidos por eles.
Objeto Form
O objeto Form o mais alto da hierarquia dos componentes de formulrios. Atravs dele se
tem acesso aos componentes existentes dentro de um bloco HTML <form>, que podem ser
botes, caixas de texto, caixas de seleo, etc.
No possvel criar um objeto Form em JavaScript. Ele precisa existir no cdigo
HTML da pgina atravs de um bloco <form> ... </form>. Este bloco no visvel na
pgina. Serve apenas para agrupar componentes de entrada de dados, torn-los visveis e
associar seus dados a um programa no servidor. A sintaxe do objeto Form em HTML est
mostrada abaixo. Todos os atributos (em itlico) so opcionais para uso em JavaScript:
10-1
<FORM
NAME="nome_do_formulario (usado por JavaScript)"
ACTION="url para onde ser enviado o formulrio"
METHOD="mtodo HTTP (pode ser GET ou POST)"
ENCTYPE="formato de codificao"
TARGET="janela alvo de exibio da resposta do formulrio"
ONRESET="cdigo JavaScript"
ONSUBMIT="cdigo JavaScript" >
... corpo do formulrio ...
</FORM>
Um bloco <FORM> deve estar dentro de um bloco <BODY>, em HTML. Para ter acesso
propriedades de um objeto Form, que um reflexo de <FORM> em JavaScript, necessrio
ter acesso ao documento que o contm. Um documento pode ter vrios formulrios. A
propriedade document, portanto, possui um vetor com referncias a todos os formulrios
do documento, na ordem em que eles aparecem no cdigo. Este vetor est na propriedade
document.forms. Para ter acesso ao primeiro formulrio de um documento (se ele existir),
pode-se usar:
objForm = document.forms[0]
Criado o formulrio em HTML, podemos ter acesso a seus mtodos e propriedades atravs
do operador ponto (.) usando seu nome ou posio no vetor document.forms:
x = document.forms[0].propriedade;
document.f1.mtodo();
A maior parte das propriedades de Form so strings que permitem ler e alterar
atributos do formulrio definidos no elemento HTML <FORM>. A propriedade elements
a exceo. Ela contm um vetor com referncias para todos os elementos contidos no
formulrio, na ordem em que aparecem no cdigo.
Propriedade
elements
elements.length
name
action
encoding
method
target
10-2
Descrio
Array. Vetor de elementos do formulrio (read-only).
Number. Nmero de elementos do formulrio (read-only).
String. Contm o valor do atributo HTML NAME (read-only).
String. Contm o valor do atributo HTML ACTION.
String. Contm o valor do atributo HTML ENCTYPE.
String. Contm o valor do atributo HTML METHOD.
String. Contm o valor do atriuto HTML TARGET.
Captulo 10 Formulrios
Elementos de um formulrio
As propriedades do objeto Form incluem todos os elementos de formulrio e imagens que
esto dentro do bloco <FORM> na pgina HTML. Estes objetos podem ser referenciados
pelos seus nomes propriedades de Form criadas com o atributo NAME de cada
componente, ou atravs da propriedade elements vetor que contm todos os elementos
contidos no bloco <FORM> na ordem em que aparecem no HTML. Por exemplo, os
componentes
<form name="f1">
<input type=text name="campoTexto">
<input type=button name="botao">
</form>
Usar elements em vez do nome de um componente exige uma ateno maior pois a
reorganizao do formulrio ir afetar a ordem dos componentes. Componentes diferentes
possuem propriedades diferentes. Se elements[0] tem uma propriedade que elements[1]
no tem, a tentativa de utilizar a propriedade em elements[1] causar um erro.
Existem trs propriedades que so comuns a todos os elementos. Podem ser usadas
para identificar o tipo do componente, seu nome e para obter uma referncia ao formulrio
que o contm. Essas propriedades so:
Propriedade
form
name
type
Descrio
Form. Referncia ao formulrio que contm este boto.
String. Contm o valor do atributo HTML NAME do componente.
String. Contm o tipo do elemento. Pode ter um dos seguintes valores:
select-one, select-multiple, textarea, text, password, checkbox,
radio, button, submit, reset, file, hidden
10-3
O objeto type de cada objeto geralmente contm o string contido no atributo TYPE
do elemento HTML em caixa-baixa. A nica exceo o objeto do tipo Select que pode ter
dois valores: select-multiple ou select-one, identificando listas de seleo
mltipla e simples.
Mtodos
Os mtodos do objeto Form so usados para submeter os dados ao programa no servidor ou
reinicializar o formulrio com os seus valores originais. Estes mtodos podem habilitar
outros botes (tipo Button) ou qualquer objeto do HTML que capture eventos a
implementar a mesma funcionalidade dos botes <SUBMIT> ou <RESET>:
Mtodo
reset()
submit()
focus()
blur()
Ao
Reinicializa o formulrio
Envia o formulrio
Seleciona o formulrio
Tira a seleo do formulrio
Eventos
Os eventos relacionados ao objeto Form so a reinicializao do formulrio e o envio dos
dados ao servidor, desencadeados por botes Reset e Submit ou por instrues JavaScript.
So interceptados pelo cdigo contido nos atributos HTML abaixo:
10-4
Captulo 10 Formulrios
10-5
aparecer vazio. A figura ao lado mostra a aparncia dos botes em um browser Netscape
Navigator rodando em Windows 95 com e sem o atributo VALUE.
Qualquer objeto <INPUT> um elemento de formulrio e precisa estar dentro de um
bloco <FORM>...</FORM>. para que seja visvel na tela2, possa receber dados e ser
manipulado como um objeto JavaScript. Os botes podem ser acessados atravs do vetor
elements, na ordem em que aparecem no cdigo, ou atravs do seu nome, especificado
pelo atributo NAME:
<form>
<input type=button name=b1>
<input type=submit name=b2>
<input type=reset name=b3>
</form>
Descrio
Form. Referncia ao formulrio que contm este boto.
String. Contm o valor do atributo HTML VALUE que especifica o texto
que aparece no boto. Pode ser lida ou alterada.
String. Contm o valor do atributo HTML NAME. (read-only)
String. Contm o valor do atributo HTML TYPE. (read-only)
Com a propriedade form, um boto pode subir a hierarquia e ter acesso a outros
elementos do formulrio no qual est contido. Por exemplo, no cdigo abaixo, o primeiro
boto altera o rtulo do segundo boto, ao ser apertado. Para ter acesso a ele, obtm uma
referncia ao formulrio em que est contido atravs de sua propriedade form:
<form>
<input type=button name=b1 value="Editar"
onclick="this.form.b2.value='Alterar'">
<input type=submit name=b2 value="Criar">
</form>
O Internet Explorer mostra na tela componentes que no esto dentro de <form>, mas eles no tm
utilidade alguma pois no podem enviar dados ao servidor nem serem manipulados em JavaScript.
2
10-6
Captulo 10 Formulrios
Os mtodos dos objetos Button, Submit e Reset esto associados a eventos. Permitem
simular o evento que ocorre ao clique do mouse, ao ativar e desativar um boto.
Mtodo
Ao
Realiza as tarefas programadas para o clique do boto (executa o cdigo
JavaScript contido no atributo ONCLICK sem que o boto precise ser
apertado).
Ativa o boto.
Desativa o boto.
click()
focus()
blur()
Eventos
Os eventos suportados por botes so trs. Os atributos HTML abaixo respondem a
eventos de boto interpretando o cdigo JavaScript contido neles:
10-7
O objeto Password criado da mesma forma, mas com um atributo TYPE diferente:
<INPUT TYPE="password" ... >
10-8
Captulo 10 Formulrios
</textarea>
</form>
// ou ...
Descrio
Form. Referncia ao formulrio no qual este elemento est contido.
String. Valor do atributo TYPE do HTML.
String. Valor do atributo NAME do HTML.
String. Valor default previamente definido no campo VALUE do HTML.
String. Contedo do campo de texto. Valor que pode ser redefinido.
Ao
Ativa o componente.
Desativa o componente.
Seleciona o campo editvel do componente (faz o cursor aparecer
piscando dentro do campo de texto ou seleciona o texto nele contido).
Eventos
Os eventos suportados por objetos Text, TextArea e Password so quatro. Os atributos
HTML abaixo respondem aos eventos interpretando o cdigo JavaScript contido neles:
componente.
ONCHANGE em Textarea, quando o usurio deixa o componente e o valor seu
valor difere daquele existente antes da sua seleo; em Text e Password quando o
usurio deixa o componente com valor diferente ou aperta a tecla [ENTER].
10-9
Para validar dados digitados em campos de texto, preciso ler sua propriedade value,
que um objeto String. Qualquer operao que possa ser realizada sobre strings pode ser
realizada sobre value. Por exemplo, String possui uma propriedade length, que informa
quantos caracteres possui. Atravs dela pode-se verificar se um campo de textos est vazio
usando:
if (document.forms[0].senha.length == 0) {
alert(" preciso digitar uma senha");
}
O boto chama a funo valida(), passando como argumento uma referncia para o
formulrio, que verifica se o texto digitado no campo do nome contm apenas letras do
alfabeto ASCII. Para comparar, usamos os mtodos toLowerCase() e charAt() de String:
<script>
function valida(f) {
var valid = true;
if (f.nome.value.length <= 0) {
// verifica se string est vazio
valid = false;
} else {
// verifica se usuario digitou caracteres ilegais
for (i = 0; i < f.nome.value.length; i++) {
ch = f.nome.value.charAt(i).toLowerCase();
if (ch < 'a' || ch > 'z') valid = false;
}
}
if (!valid) {
alert("S digite letras (sem acentos) no campo \"Seu Nome\".");
f.nome.focus();
f.nome.select();
} else {
f.submit(); // envia o formulrio
10-10
Captulo 10 Formulrios
}
}
</script>
Objeto Hidden
O objeto Hidden um campo de entrada de dados invisvel, que o usurio da pgina no tem
acesso. Serve para que o programador passe informaes ao servidor, ocultando-as no cdigo
HTML da pgina. bastante til na transferncia de informaes entre formulrios
distribudos em mais de uma pgina. Vrios desses campos foram usados no captulo 8 para
transferir dados digitados em um formulrio para uma pgina gerada on-the-fly. Sua sintaxe a
seguinte:
<INPUT TYPE="hidden"
NAME="nome_do_campo_oculto"
VALUE="valor armazenado" >
Descrio
Form. Referncia ao formulrio no qual este elemento est contido.
String. Valor do atributo NAME do HTML (read-only).
String. Valor do atributo TYPE do HTML (read-only).
String. Valor do atributo VALUE do HTML. Esta propriedade pode ser
redefinida e usada como meio de passar informaes entre pginas.
10-11
A figura abaixo mostra dois grupos de botes de rdio (em um browser Netscape
rodando em Windows95). Observe que os atributos NAME distinguem um grupo do outro. O
atributo CHECKED indica um boto previamente ligado mas que pode ser desligado pelo
usurio ao clicar em outro boto.
O cdigo acima no inclui as informaes que mais interessam, que so: 1) o usurio
selecionou que opo? e 2) a opo x est ou no selecionada? Para responder essas
10-12
Captulo 10 Formulrios
Assim como objetos Radio, elementos Checkbox podem ser manipulados em grupo,
embora isto seja desnecessrio, j que mais de um valor pode estar associado ao mesmo
grupo, como mostrado acima. Se os elementos acima fossem os nicos elementos do
primeiro formulrio de uma pgina, o segundo elemento poderia ser acessado de qualquer
uma das formas abaixo:
almoco = document.forms[0].elements[2];
almoco = document.forms[0].refeicoes[2];
Read/Write Descrio
r
String. Contedo do atributo HTML TYPE (read-only).
r
String. Contedo do atributo HTML NAME (read-only).
r
Boolean. Retorna true se o elemento HTML que
representa o objeto contm o atributo CHECKED.
r /w
Boolean. Retorna true se um Checkbox ou Radio est
atualmente ligado. O valor desta propriedade pode ser
10-13
Propriedade
value
length
Read/Write Descrio
alterado dinamicamente em JavaScript para ligar ou
desligar os componentes.
r/w
String. Contedo do atributo HTML VALUE. O valor
desta propriedade pode ser alterado dinamicamente.
r
Number. Comprimento do vetor de objetos Radio ou
Checkbox. Aplica-se apenas a grupos de elementos
identificados pelo nome (no pode ser usado no vetor
elements, que refere-se a objetos individuais).
Exemplo:
document.forms[0].nomegrupo.length
Ao
Marca (seleciona) o componente.
Ativa o componente.
Desativa o componente.
click()
focus()
blur()
Eventos
Os eventos suportados so trs. Os atributos HTML abaixo respondem aos eventos
interpretando o cdigo JavaScript contido neles:
10-14
Captulo 10 Formulrios
componente.
10-15
<OPTION
VALUE="Valor da opo"
SELECTED >
Texto descrevendo a opo
</OPTION>
// ou ...
Para ter acesso aos dados armazenados pelo objeto recuperado, preciso usar
propriedades do objeto Option. A propriedade text recupera o texto entre os descritores
<option> e </option>. A propriedade value recupera o texto armazenado no atributo
HTML <VALUE>:
textoVisivel = terca.text;
textoUtil = terca.value;
10-16
Captulo 10 Formulrios
O cdigo acima no obtm as informaes que mais interessam, que so: 1) o usurio
selecionou qual opo? e 2) a opo de ndice x ou que contm o texto y est ou no
selecionada? Para responder essas questes, e poder realizar outras tarefas, como selecionar
opes dinamicamente, precisamos conhecer as propriedades do objeto Select e dos seus
objetos Option. Elas esto listadas nas tabelas abaixo.
A primeira tabela lista as propriedades do objeto Select, que so:
Propriedade
name
form
type
Read/Write
r
r
r
r
r
r/w
options
length
selectedIndex
options.lengt
h
options.selectedIndex
r/w
Descrio
String. Equilavente ao atributo HTML NAME.
String. Referncia ao formulrio que contm este objeto.
String. Informa o tipo de lista: select-one, se o elemento
HTML no tiver o atributo MULTIPLE, ou select-multiple, se
tiver.
Array. Vetor de objetos Option contidos no objeto Select.
Number. Nmero de objetos do vetor options.
Number. ndice da opo atualmente selecionada. Para
listas mltiplas, contm o primeiro ndice selecionado.
Number. Mesmo que length.
Number. Mesma coisa que selectedIndex.
value
text
Read/Write Descrio
r
Number. Contm o ndice desta opo dentro do vetor
options do objeto Select ao qual pertence.
r
Boolean. Retorna true se o elemento HTML que
representa o objeto contm o atributo SELECTED.
r/w
Boolean. Retorna true se objeto est selecionado. Pode
ser alterado para selecionar ou deselecionar o objeto
dinamicamente.
r/w
String. Contm o contedo do atributo HTML VALUE
(que contm os dados que sero enviados ao servidor).
r/w
String. O texto dentro de <option>...</option>,
que aparece na lista de opes. Pode ser alterado. Este
texto no ser enviado ao servidor se existir um
atributo VALUE.
10-17
Quando o objeto Select uma lista de seleo mltipla, que pode ou no ter mais de
um tem selecionado, selectedIndex retorna apenas o ndice do primeiro item
selecionado. Neste caso, preciso verificar uma a uma quais opes esto selecionadas
atravs da propriedade selected de cada objeto Options. O cdigo abaixo recupera o texto
visvel de cada uma das opes selecionadas de um objeto Select e as armazena em um vetor:
objSel = document.forms[1].variosdias;
opcoes = "";
if (objSel.type == "select-one") {
// se for caixa de selecao
opcoes = objSel.options[objSel.selectedIndex].text;
} else {
// se for lista de multiplas selecoes
for (i = 0; i < objSel.length; i++) {
if (objSel.options[i].selected) {
opcoes += objSel.options[i].text + "; "
}
}
}
opcoes = opcoes.split(";");
// armazena em vetor
10-18
Captulo 10 Formulrios
objetos Select. As opes disponveis na segunda lista dependem da opo escolhida pelo
usurio na primeira lista:
<head>
<script>
intervalos = new Array(3);
// vetor 2D c/ intervalos/turno
intervalos[0] = new Array("08 s 08:59", "09 s 09:59", "10 s 10:59", "11 s 11:59");
intervalos[1] = new Array("13 s 13:59", "14 s 14:59", "15 s 15:59", "16 s 16:59");
intervalos[2] = new Array("18 s 18:59", "19 s 19:59", "20 s 20:59", "21 s 21:59");
function setIntervalos(f) {
idx = f.turno.options.selectedIndex;
for (i = 0; i < f.horario.length; i++) {
f.horario.options[i].text = intervalos[idx][i];
}
}
</script> </head>
<body>
<form> <p>Escolha um turno:
<select name=turno onchange="setIntervalos(this.form)">
<option>Manh</option>
<option>Tarde</option>
<option>Noite</option>
</select>
<p>Escolha um ou mais intervalos:
<select name=horario size=4 multiple>
<option> Intervalo 01 </option> <!-- Estes valores iro mudar -->
<option> Intervalo 02 </option>
<option> Intervalo 03 </option>
<option> Intervalo 04 </option>
</select> </form>
</body>
contido
(1)
(2)
(3)
Para remover uma opo de uma lista, basta encurtar o vetor options. A funo
abaixo redefine a propriedade length do vetor, encurtando-o cada vez que chamada:
10-19
function menos(f) {
selObj = f.horario;
if (selObj.length > 0) {
len = selObj.length - 1;
selObj.length = len;
}
}
// length = length - 1
O objeto Select possui dois mtodos. Ambos provocam eventos e so usados para
ativar ou desativar o componente:
Mtodo
Ao
Ativa o componente.
Desativa o componente.
focus()
blur()
Eventos
Os eventos suportados por objetos Select so trs. Os atributos HTML abaixo respondem
aos eventos interpretando o cdigo JavaScript contido neles:
componente.
ONCHANGE quando o usurio seleciona uma opo diferente da que estava
previamente selecionada no componente.
Validao de formulrios
Nesta seo mostraremos uma das aplicaes
mais freqentes de JavaScript: a verificao dos
dados em um formulrio antes do envio ao
servidor. O exerccio resolvido a seguir utiliza
todas as categorias de componentes vistos neste
captulo para desenvolver um formulrio de
inscrio em um evento, a validadr as
informaes digitadas pelo usurio.
Exerccio Resolvido
Para este exerccio, utilize o esqueleto contido
no arquivo validform.html (disponvel no
diretrio cap10/) que j contm todo o
formulrio montado em HTML (figura ao
10-20
Captulo 10 Formulrios
lado). Escreva uma rotina JavaScript que verifique os campos de texto, campos numricos,
caixas de checagem e listas de seleo para que estejam de acordo com as regras abaixo:
a) Os nicos campos que podem permanecer vazios so Empresa, Bairro e Fax.
b) Os campos CEP e Telefone s podem conter caracteres numricos (0 a 9), trao -,
espao e parnteses ( e )
c) O campo E-mail deve necessariamente conter um caractere @
d) Se o usurio escolher um minicurso (primeira lista de seleo) e marcar os trs dias do
congresso (trs caixas de checagem), a opo Participao em todo o congresso
(caixa de checagem) dever ser selecionada, e as outras trs, desmarcadas. Se o usurio
marcar Participao em todo o congresso, as outras trs opes devem ser
desmarcadas.
e) Se o usurio decidir participar de todo o evento, ele deve escolher um minicurso. Se
escolher uma segunda ou terceira opo, deve necessariamente escolher uma primeira.
f) Se tudo estiver OK, uma janela de alerta dever ser apresentada ao usurio informandoo que os dados foram digitados corretamente.
A soluo apresentada na seo seguinte e pode ser encontrada no arquivo
validformsol.html. Uma outra verso disponvel no arquivo job_form.html gera uma
nova pgina on-the-fly para confirmao e envio ao servidor (em vez de uma janela de alerta),
caso os dados sejam digitados corretamente. proposta como exerccio.
Soluo
Toda a validao dos dados ocorre no mtodo validar(dados). O formulrio passado
como argumento da funo e passa a ser representado pela varivel local dados. Dentro da
funo validar(), cinco outras funes so chamadas vrias vezes. Cada uma realiza uma
tarefa solicitada nos requisitos (a) a (e) do exerccio, e retorna true se os dados estavam
corretos. No final da funo validar(), se nenhuma das chamadas de funo retornou
false, um dilogo de alerta mostrado avisando que os dados esto corretos:
function validar(dados) {
// requisito (a) verifica campos vazios
if (!checkVazios(dados.Nome, "Participante")) return;
if (!checkVazios(dados.Endereco, "Endereo")) return;
if (!checkVazios(dados.Cidade, "Cidade")) return;
if (!checkVazios(dados.CEP, "CEP")) return;
if (!checkVazios(dados.Telefone, "Telefone")) return;
if (!checkVazios(dados.Email, "Email")) return;
// requisito (b) verifica campos numricos
if (!checkNumericos(dados.Telefone) ) return;
if (!checkNumericos(dados.CEP) ) return;
10-21
O primeiro requisito (a) deve verificar se seis campos no esto vazios. A funo
checkVazios(elemento, "string") verifica o comprimento do valor de cada elemento
Text. Se o texto na propriedade value do objeto tiver comprimento inferior a um caractere,
a funo retorna false:
function checkVazios(elemento, nome) {
if (elemento.value.length < 1) {
alert("O campo " + nome + " no pode ser vazio!");
elemento.focus();
elemento.select();
return false;
} else return true;
}
Captulo 10 Formulrios
O requisito (d) pede duas coisas: para deselecionar as trs caixas de checagem
intermedirias, se a caixa Tudo estiver selecionada e para marcar a caixa Tudo se o
usurio tiver escolhido um minicurso e marcado todas as caixas intermedirias. A funo
checkDias() recebe como argumentos 4 objetos Checkbox (correspondentes s caixas
intermedirias e a caixa Tudo) e um objeto Select (correspondente seleo do primeiro
minicurso) e faz todas as alteraes.
function checkDias(ck, ck10, ck11, ck12, m1) {
if (ck.checked) {
// caixa Tudo est marcada...
ck10.checked = false;
// desmarque as intermedirias...
ck11.checked = false;
ck12.checked = false;
}
// todas as intermediarias ligadas e minicurso escolhido...
if (ck10.checked && ck11.checked && ck12.checked && m1.selectedIndex != 0) {
ck10.checked = false;
ck11.checked = false;
// desmarque todas e...
ck12.checked = false;
ck.checked = true;
// ... marque a caixa Tudo
}
}
10-23
Objeto File
File (ou FileUpload4) representa um
dispositivo de entrada que permite o
envio de um arquivo no cliente ao
servidor. Na tela do browser, aparece
como uma caixa de texto e um boto
com o rtulo Browse... ou Procurar...5. Pode-se
digitar o caminho absoluto ao arquivo que se deseja
enviar ao servidor na caixa de texto ou clicar no boto
Browse... e fazer aparecer um dilogo do sistema de
arquivos, que permite que o arquivo seja localizado de
forma interativa. A figura ao lado mostra a aparncia
do objeto File no browser Netscape em Windows 95
e a janela de dilogo que aparece ao se apertar o boto Browse....
O objeto File criado em HTML atravs de um elemento <INPUT>. A sintaxe geral
do componente est mostrada abaixo:
<INPUT TYPE="file"
NAME="nome_do_componente"
ONBLUR="cdigo JavaScript"
ONFOCUS="cdigo JavaScript"
ONCHANGE="cdigo JavaScript" >
10-24
Captulo 10 Formulrios
nome, especificado pelo atributo NAME. O trecho de cdigo abaixo mostra como acessar um
elemento File chamado nomeFup e que o stimo elemento do primeiro formulrio de uma
pgina:
fup = document.forms[0].nomeFup
fup = document.forms[0].elements[6]
// ou ...
Descrio
Form. Referncia ao formulrio que contm este componente.
String. Contm o valor do atributo HTML NAME. (read-only)
String. Contm o valor do atributo HTML TYPE. (read-only)
String. Contm o texto no campo de textos do objeto, que corresponde ao
arquivo a ser enviado ao servidor. read-only por questes de segurana.
Ao
Ativa o boto.
Desativa o boto.
focus()
blur()
Eventos
Os eventos suportados so dois. Os atributos HTML abaixo respondem aos eventos
interpretando o cdigo JavaScript contido neles:
componente.
10-25
Exerccios
10.1
Aps a validao dos dados no exerccio resolvido, uma janela de alerta aparece na
tela informando que os dados foram digitados corretamente. Acrescente uma nova
funo para substituir o alerta. Esta nova funo dever gerar uma nova pgina onthe-fly (veja o exerccio resolvido do captulo 8) com os dados que o usurio digitou.
Deve dois botes na pgina de confirmao: um para voltar e alterar os dados e
outro para enviar os dados ao servidor. Garanta que os dados sejam preservados em
campos Hidden na nova pgina para que o programa no servidor possa us-los.
10.2
10-26
Captulo 11 Cookies
11
Cookies
UM COOKIE UMA PEQUENA QUANTIDADE DE INFORMAO que pode ser armazenada na
mquina do cliente atravs de instrues enviadas pelo servidor ou contidas em uma pgina
HTML. uma informao que pode persistir por toda uma sesso do cliente em um site,
ou por mais tempo ainda. Um cookie pode ser gravado em uma pgina e recuperado em
outra, permitindo o acesso a propriedades, informaes ou preferncias do usurio a
qualquer momento, de qualquer pgina do site. .
Um cookie est sempre associado a um browser e a um domnio. No um padro
formal ou especificao, e a implementao dos cookies dependente de browser e
fabricante. A sua manuipulao, porm, baseada em padres HTTP (cabealhos) e tem
amplo suporte tanto de tecnologias client-side, como JavaScript, como de tecnologias
server-side como ASP, Servlets, LiveWire e CGI.
O objetivo deste captulo demonstrar o uso de cookies em JavaScript, e apresentar
algumas aplicaes como o Carrinho de Compras. A prxima seo, introduz a
arquitetura de cookies cujo conhecimento essencial para o uso eficiente de cookies com
JavaScript.
Cookies em HTTP
A tecnologia conhecida como HTTP Cookies, surgiu em 1995 como um recurso
proprietrio do browser Netscape, que permitia que programas CGI gravassem informaes
em um arquivo de textos controlado pelo browser na mquina do cliente. Por oferecer uma
soluo simples para resolver uma das maiores limitaes do HTTP a incapacidade de
preservar o estado das propriedades dos documentos em uma mesma sesso os cookies
logo passaram a ser suportados em outros browsers e por linguagens e tecnologias de
suporte a operaes no cliente e servidor. Hoje, embora no seja ainda um padro formal,
um padro de fato adotado pela indstria de software voltada Web e Internet.
11-1
11-2
Captulo 11 Cookies
onde corresponde a uma quebra de linha. O nome do cabealho ser ignorado pelo
browser, se ele no souber o seu significado. Os valores tm um formato especfico para
cada cabealho. O conjunto de caracteres suportado ASCII de 7 bits, portanto,
necessrio converter acentos e outros caracteres antes de us-los como cabealhos.
O bloco de cabealhos separado dos dados por uma linha em branco (dois
caracteres de nova-linha seguidos). Ao receber a resposta, o browser separa o cabealho do
restante da informao, identifica o formato e comprimento dos dados (que vm depois da
linha em branco) e os formata na sua rea de visualizao, se o seu tipo de dados for
suportado.
Um bloco de cabealhos de resposta gerado pelo servidor Web sempre que o
browser solicita uma pgina esttica. Parte ou todo o bloco de cabealhos tambm pode ser
gerado por um programa CGI ou equivalente. Quando um programa CGI gera um
cabealho, pode incluir outros campos de informao sobre a pgina que o servidor no
inclui por default. Pode, por exemplo, definir um ou mais cabealhos Set-Cookie, que iro
fazer com que o browser guarde a informao passada em cookies:
(... outros cabealhos ...)
Set-Cookie: cliente=jan0017
Set-Cookie: nomeclt=Marie
Content-type: text/html
(... dados ...)
11-3
expires=data
Descrio
Este campo obrigatrio. Seqncia de caracteres que no incluem acentos,
ponto-e-vrgula, percentagem, vrgula ou espao em branco. Para incluir
esses caracteres preciso usar um formato de codificao estilo URL.
Em JavaScript, a funo escape() codifica informaes nesse formato
e a funo unescape() as decodifica.
Opcional. Se presente, define uma data com o perodo de validade do
cookie. Aps esta data, o cookie deixar de existir. Se este campo no
estiver presente, o cookie s existe enquanto durar a sesso do browser.
A data deve estar no seguinte formato:
DiaDaSemana, dd-mes-aa hh:mm:ss GMT
Por exemplo:
Monday, 15-Jan-99 13:02:55 GMT
11-4
Captulo 11 Cookies
Recuperao de cookies
Toda requisio de um browser ao servidor consiste de uma linha que contm o mtodo de
requisio, URL destino e protocolo, seguida de vrias linhas de cabealho. atravs de
cabealhos que o cliente passa informaes ao servidor, como, por exemplo, o nome do
browser que enviou o pedido. Uma requisio HTTP tpica tem a forma:
GET /index.html HTTP/1.0
User-Agent: Mozilla/4.5 (WinNT; I) [en]
Host: www.alnitak.org.br
Accept: image/gif, image/jpeg, */*
11-5
Cookies em JavaScript
Cookies podem ser manipulados em JavaScript atravs da propriedade document.cookie.
Esta propriedade contm uma String com o valor de todos os cookies que pertencem ao
espao de nomes (domnio/caminho) do documento que possui a propriedade. A
propriedade document.cookie usada tanto para criar como para ler cookies.
Para definir um novo cookie, basta atribuir um string em um formato vlido para o
cabealho HTTP Set-Cookie propriedade document.cookie. Como cookies no
podem ter espaos, ponto-e-virgula e outros caracteres especiais, pode-se usar a funo
escape(String) antes de armazenar o cookie, para garantir que tais caracteres sero
preservados em cdigos hexadecimais:
nome="usuario";
valor=escape("Joo Grando"); // converte para Jo%E3o%20Grand%E3o
vencimento="Monday, 22-Feb-99 00:00:00 GMT";
document.cookie = nome + "=" + valor + "expires=" + vencimento;
O texto a seguir ser mostrado na pgina, com os trs cookies separados por ;:
usuario=Jo%E3o%20Grand%E3o; vidacurta=%C9%20s%F3%20por%20hoje%21;
vidalonga=%C9%20por%20duas%20semanas%21
As letras acentuadas, espaos e outros caracteres especiais foram substitudos pelo seu
cdigo hexadecimal, aps o %. Para decodificar o texto, pode-se usar unescape():
document.write(unescape(document.cookie));
11-6
Captulo 11 Cookies
A funo acima pode ser chamada tanto para criar cookies como para matar cookies
no mesmo espao de nomes. Para criar um novo cookie, com durao de 12 horas:
setCookie("cook", "Um, dois, tres", 0.5);
Para matar o cookie criado com a instruo acima, basta criar um homnimo com data de
vencimento no passado. Podemos fazer isto passando um nmero negativo como tempo de
validade em setCookie():
setCookie("cook", "", -365);
Uma segunda invocao de split(), desta vez sobre cada um dos pares nome/valor
obtidos acima, separando-os pelo =, cria um vetor bidimensional. O string cookies[i] se
transforma em um vetor para receber o retorno de split("="). Criamos ento duas novas
propriedades: name e value para cada cookie, que contm respectivamente, o nome e valor,
j devidamente decodificados:
for (i = 0; i < cookies.length; i++) {
cookies[i] = cookies[i].split("=");
cookies[i].name = unescape(cookies[i][0]);
cookies[i].value = unescape(cookies[i][1]);
}
11-7
Carrinho de compras
Os cookies so essenciais na construo de aplicaes de comrcio eletrnico, pois
permitem passar informaes de uma pgina para outra e manter os dados persistentes na
mquina do cliente por mais de uma sesso.
O carrinho de compras virtual consiste de um ou mais cookies que guardam as
preferncias do usurio enquanto ele faz compras pelo site. No final, quando o usurio
decide fechar a conta, o(s) cookie(s) so lido(s), os dados so extrados, formatados e
mostrados na tela ou enviados para o servidor. Mesmo que a conexo caia ou que ele decida
continuar a compra no dia seguinte, os dados podem ser preservados, se os cookies forem
persistentes (terem um campo expires com uma data de vencimento no futuro). No final,
depois que o usurio terminar a transao, o cookie no mais necessrio e descartado.
No exerccio a seguir, desenvolveremos uma pequena aplicao de comrcio
eletrnico usando cookies e JavaScript.
Exerccio Resolvido
A Loja XYZ S/A deseja vender seus produtos esquisitos na Web. A implantao do servio
consiste de duas etapas. A primeira a criao de um carrinho de compras virtual para que
os clientes possam selecionar seus produtos. A segunda etapa envolve questes relacionadas
ao servidor, como o acesso ao banco de dados da empresa, segurana, etc. Ficamos
encarregados de desenvolver a primeira etapa e decidimos usar JavaScript.
A sua tarefa desenvolver os requisitos mnimos para lanar a verso 0.1 da aplicao.
Esta verso ainda no adequada publicao no site do cliente, mas j possui as
caractersticas mnimas para demonstrar os principais recursos do site. Os arquivos HTML
j esto prontos no subdiretrio cap11/carrinho/.
Vrias pginas da aplicao esto mostradas na figura abaixo. A primeira a home
page da loja (index.html), que permite que o usurio escolha uma categoria de produtos a
adquirir. Os quatro links da primeira pgina levam s pginas onde o usurio pode escolher
produtos (livros.html, outros.html, dinos.html e insetos.html). Em cada uma, h
um boto para que o cliente adicione uma unidade do produto ao seu carrinho de compras.
Nesta verso 0.1, o cliente s pode adquirir uma unidade de cada produto, por compra.
A pgina carrinho.html permite o controle e visualizao dos produtos do carrinho
de compras. Mostra o carrinho de compras com os produtos selecionados at o momento,
o preo de cada um e o total acumulado. Na primeira coluna, mostra uma caixa de
checagem que permite que o usurio remova um produto do carrinho. Trs botes
permitem que o usurio possa, respectivamente, atualizar o carrinho (caso algum produto
tenha sido adicionado), esvaziar o carrinho e enviar a fatura para a loja (que nesta simulao
consiste em fazer aparecer um dilogo de alerta informando o fato.
O exerccio proposto consiste em completar os seguintes requisitos:
index.html
11-8
(home page)
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
Captulo 11 Cookies
Soluo
A soluo do problema consiste de trs partes: a criao dos cookies (a colocao dos
produtos no carrinho), a leitura dos cookies (a visualizao do contedo do carrinho) e a
remoo dos cookies (o esvaziamento do carrinho).
Para criar os cookies (a), usamos a funo setCookie() abaixo. Ela pode estar
presente em todas as pginas de produtos ou em um arquivo externo (.js), importado em
JS11-01-1999/01 A4 - 1999 Helder L. S. da Rocha
11-9
cada pgina. A funo recebe trs argumentos apenas (estamos supondo que este domnio
no ter outros cookies) que so um nome, um valor e um perodo de validade em dias:
<script>
function setCookie(nome, valor, dias) {
diasms = (new Date()).getTime() + 1000 * 3600 * 24 * dias;
dias = new Date(diasms);
expires = dias.toGMTString();
document.cookie = escape(nome) + "=" +
escape(valor) + "; expires=" + expires;
}
</script>
Precisamos armazenar trs informaes por produto. Se usssemos trs cookies para
cada produto, em pouco tempo ficaramos sem cookies, pois o browser limita o nmero de
cookies em 20 por domnio. Precisamos, portanto, armazenar as informaes em o mnimo
de cookies possvel. Optamos, nesta primeira verso, por definir um cookie por produto1.
Para separar os dados, usamos o & como delimitador do string:
<form>
<input type=button value="Colocar no carrinho"
onclick="setCookie('dino1','D372&Brontossauro&1500.00',5)">
</form>
Ainda no a melhor idia, pois aproveitamos pouco dos 4kB permitidos a cada cookie. Idealmente
colocaramos vrios produtos em um nico cookie e evitaramos armazenar informaes como descrio de
produtos que poderiam ser recuperadas do banco de dados.
1
11-10
Captulo 11 Cookies
Com essas funes, temos condies de montar a tabela com os produtos. Como
estamos supondo que no h outros cookies neste domnio2 podemos verificar se o carrinho
est vazio, simplesmente verificando se o string document.cookie est vazio:
<table border><tr>
<th>Seleo</th><th>Cdigo</th><th>Produto</th><th>Preo</th></tr>
<script>
if (!document.cookie)
document.write("<tr><td colspan=3>Seu carrinho est vazio!</td></tr>");
(...)
Teremos que levar em conta a possibilidade de haver outros cookies neste domnio em uma verso
definitiva.
2
11-11
</script>
</table>
function atualiza() {
for(i = 0; i < document.forms[0].elements.length; i++) {
if(document.forms[0].elements[i].type == "checkbox") {
chkbox = document.forms[0].elements[i];
nome = chkbox.name;
if(!chkbox.checked) {
setCookie(nome,"nada",-365); // mata cookie
}
}
}
location.reload(true);
// atualiza a pgina
}
11-12
Captulo 11 Cookies
Exerccios
11.1
ou
setCookie("visitante","Fulano de Tal")
11.2
Escreva uma aplicao que informe ao usurio quantas vezes ele j visitou a pgina,
quando foi, e de onde ele tinha vindo antes.
11-13
12
JavaScript e Java
APPLETS JAVA OFERECEM RECURSOS QUE VO MUITO ALM do que se dispe com
JavaScript e HTML. Por outro lado, applets pouco interagem com a pgina. No podem
alterar propriedades da pgina nem utilizar formulrios HTML. JavaScript oferece recursos
de programao e integrao total com o browser e a pgina, mas no pode ir alm das
limitaes do HTML e do browser. Usando Java e JavaScript juntos, une-se a riqueza de
recursos de Java integrao do JavaScript com o browser o que permite permite explorar o
melhor de cada tecnologia em uma mesma aplicao.
Os browsers mais populares suportam a o controle de applets a partir de JavaScript e
vice-versa. Isto inclui os browsers Netscape Navigator a partir da verso 3.0 e o browser
Microsoft Internet Explorer a partir da verso 4.01. Neste captulo, mostraremos como
manipular com os applets em uma pgina Web, e exploraremos, com exemplos e exerccios
resolvidos, a comunicao entre applets e JavaScript.
Applets Java
Applets so pequenas aplicaes geralmente escritas em Java que so executadas pelo
browser. Diferentemente do que ocorre com JavaScript, o cdigo Java no interpretado
pelo browser. Um applet tambm no tem cdigo Java que o browser possa interpretar, j
que foi compilado para uma linguagem de mquina. Browsers que suportam Java possuem
uma plataforma virtual, a Java Virtual Machine, que capaz de interpretar a linguagem de
mquina Java, chamada de bytecode.
Applets podem ser usados para desenvolver aplicaes que seriam impossveis em
JavaScript por causa das limitaes do HTML, do protocolo HTTP e do prprio browser.
Com um applet, possvel estender um browser fazendo-o suportar, por exemplo, novos
Alm da comunicao entre applets e scripts, o Netscape Navigator, permite ainda que o programador
utilize diretamente classes da API Java, chame seus mtodos e crie objetos Java a partir de instrues
JavaScript. No discutiremos este recurso aqui por ele no ter suporte alm dos browsers Netscape.
1
12 - 1
12 - 2
Com o cdigo acima, o relgio aparece na pgina como mostrado na figura, com
ponteiros azuis, visor com letras pretas e fundo branco. O autor do applet permite, porm,
que o autor da pgina altere esses parmetros atravs de descritores <PARAM>. Os trs
parmetros modificveis so:
bgcolor cor de fundo (branco default)
fgcolor1 cor dos ponteiros e dial (azul default)
fgcolor2 cor dos nmeros e ponteiro de seguntos (preto default)
Todos os parmetros devem receber como valor um nmero hexadecimal
representando uma cor no formato RGB (mesmo formato usado em HTML): ff0000
vermelho, ffffff branco, 0000ff azul, etc.
Portanto, para incluir o relgio acima em uma pgina, com um fundo cinza claro,
ponteiros marrons e letras douradas, o cdigo seria:
<applet code="Clock2.class" width=170 height=150>
<param name=bgcolor value="dddddd">
<param name=fgcolor1 value="800000">
<param name=fgcolor2 value="808000">
</applet>
Caso o applet esteja em um diretrio diferente daquele onde est a pgina, ser
necessrio usar o atributo CODEBASE, para informar a URL base. Por exemplo, se o arquivo
.class que usamos acima estiver em http://www.abc.com/clocks/, precisamos usar:
<applet codebase="http://www.abc.com/clocks/" code="Clock2.class" ... >
...
</applet>
12 - 3
Objeto Applet
O tipo de objeto Applet representa, no modelo de objetos JavaScript, um applet Java
embutido em uma pgina Web. Tendo uma referncia para um objeto Applet, o
programador pode controlar um applet Java usando JavaScript, sem que precise ter acesso ao
cdigo do applet. Precisar apenas saber os nomes dos mtodos pblicos do applet para que
possa invoc-los via JavaScript. possvel tambm fazer o inverso: controlar JavaScript a
partir de applets. Neste caso, preciso ter acesso ao cdigo do applet e conhecer a linguagem
Java.
No possvel criar objetos Applet usando JavaScript, apenas. Objetos Applet so
fornecidos pelo cdigo HTML da pgina. Se houver na pgina um bloco <APPLET> que
tenha carregado um arquivo executvel Java, existe um objeto Applet utilizvel em JavaScript.
Uma pgina pode ter vrios applets. Eles podem ser obtidos atravs da propriedade
document.applets um vetor que, como document.images e document.forms,
contm referncias para todos os applets presentes na pgina, na ordem em que aparecem
no cdigo. Por exemplo, em uma pgina com trs applets, o primeiro e terceiro podem ser
referenciados da forma:
appy1 = document.applets[0];
appy3 = document.applets[2];
// Applet!
12 - 4
A primeira linha, identifica a classe java (Carta), que um applet. Todo programa em
Java considerado uma classe. A segunda linha contm a declarao de uma varivel
chamada numero. A palavra public indica que se trata de uma varivel pblica (pode ser
usada em JavaScript) e a palavra int indica que um nmero inteiro. Se formos atribuir um
valor varivel numero, atravs de JavaScript, precisaremos ter o cuidado de passar um
nmero inteiro e no um String ou outro tipo de dados. Java, diferente de JavaScript, s
permite que uma varivel receba um valor, se for de um tipo previamente declarado para a
varivel.
As duas ltimas linhas contm as assinaturas dos mtodos mudarMensagem() e
lerMensagem(). A palavra public indica que ambos so pblicos e portanto podem ser
usados em JavaScript. O mtodo mudarMensagem() declarado void, o que significa que
ele no retorna valor. Ele recebe como argumento uma varivel que deve necessariamente
Variveis e mtodos em Java que so declarados static no so acessveis atravs da referncia da applet
mas atravs do tipo Applet, da forma Applet.variavel ou Applet.metodo().
2
12 - 5
ser um objeto do tipo String. O mtodo lerMensagem() no tem argumentos, mas retorna
um valor do tipo String.
Com estas informaes, temos condies de manipular as variveis e mtodos do
applet definido pela classe Carta.class, atravs de propriedades e mtodos de um objeto
Applet:
appy = document.applets[0];
// se for o primeiro applet
appy.numero = 6;
document.write("A mensagem atual " + appy.lerMensagem());
appy.mudarMensagem("Esta a nova mensagem!");
document.write("A mensagem agora " + appy.lerMensagem());
document.write("O nmero " + appy.numero);
Exerccio Resolvido
Para este exerccio, utilize o arquivo Banner.class, que um applet que faz uma
mensagem de texto rolar horizontalmente na tela. A mensagem do Banner pode ser
definida na pgina HTML dentro de um atributo <PARAM> com o nome (atributo NAME)
MSG. O texto que estiver no campo VALUE ser utilizado como a mensagem a ser exibida.
Se o <PARAM> no estiver presente, o applet ainda funcionar, porm, apresentar uma
mensagem default.
Banner possui vrios mtodos pblicos que permitem mudar a mensagem atual,
mudar as cores de fundo e do texto, parar a rolagem e aumentar a velocidade de rolagem
para a direita ou para a esquerda. Os mtodos pblicos de Banner so os seguintes:
public
public
public
public
public
public
void
void
void
void
void
void
Soluo
A primeira tarefa colocar o applet na pgina. Definimos o parmetro MSG com o valor
Bom Dia!, como foi pedido no requisito (a):
<!Coloque o applet aqui -->
<body>
<h1>Applets controlados por JavaScript</h1>
<applet code="Banner.class" height=20 width=450 hspace=10>
<param name="msg" value="Bom Dia!">
</applet>
<form>
(...)
Com o bloco de cdigo acima, o applet j deve aparecer na pgina e comear a rolar
para a esquerda. Para permitir a mudana do texto durante a execuo do applet, chamamos
o mtodo mensagem(), que muda o texto para o string recebido. O string obtido do
campo de textos novotexto::
<p>Texto:
<input type=text name=novotexto size=45>
<input type=button value="Alterar"
onclick="document.applets[0].mensagem(this.form.novotexto.value)">
Criamos ento, uma funo cor(), que converte o valor da opo selecionada em trs
nmeros inteiros. A funo, que recebe um objeto Select como argumento, tambm
identifica qual das duas listas foi selecionada, para invocar o mtodo correto:
<head>
<script>
function cor(selObj) {
corStr = selObj.options[selObj.selectedIndex].value;
rgb = corStr.split(",");
r = parseInt(rgb[0]);
g = parseInt(rgb[1]);
b = parseInt(rgb[2]);
if (selObj.name == "bg") {
document.applets[0].corDeFundo(r, g, b);
12 - 7
Exerccios
12.1
12 - 8
boto, para que limpe a tela de desenho ao ser apertado, e b) a lista de opes, para
que mude a cor do lpis de acordo com a seleo do usurio.
A maior parte dos mtodos pblicos usados na comunicao Java com JavaScript
esto na classe JSObject, listados nas tabelas abaixo (Ateno: estes mtodos so mtodos
Java. No os confunda com mtodos JavaScript). JSObject contm um nico mtodo
esttico, que retorna uma referncia janela do browser:
Assinatura do mtodo de classe (public static) Descrio
Obtm um JSObject representando a
JSObject getWindow(Applet applet)
janela do browser onde est o applet
passado como argumento.
Para manipular com os objetos do browser, preciso obter primeiro uma referncia
para a janela do browser. Para isto, utilizamos o mtodo getWindow() passando o applet
atual como argumento, no cdigo Java, da forma:
JSObject janela = JSObject.getWindow(this);
// cdigo Java!
12 - 9
Descrio
As seguintes operaes, dentro do codigo do applet (Java), permitem que ele tenha
acesso ao contedo de um campo de textos na pgina HTML:
JSObject janela = JSObject.getWindow(this);
// cdigo Java!
JSObject docmt = (JSObject)janela.getMember("document");
JSObject frmArray = (JSObject)docmt.getMember("forms");
12 - 10
O mtodo eval() tambm pode ser usado para obter referncias a propriedades de
Window e objetos de sua hierarquia de forma mais direta que usando sucessivas chamadas a
getMember() e getSlot(). O cdigo abaixo tem o mesmo efeito que o listado
anteriormente para acessar o valor de um campo de texto:
JSObject janela = JSObject.getWindow(this);
String valor = (String)janela.eval("document.form1.campo.value");
Neste outro trecho de cdigo, chamamos uma funo soma(), disponvel na pgina
JavaScript, que recebe dois inteiros (os nmeros 7 e 9) e retorna a soma. Precisamos colocar
valores do tipo int dentro de objetos Integer:
JSObject win = JSObject.getWindow();
Object[] args = {new Integer(7), new Integer(9)};
Integer intObj = (Integer)win.call("soma", args);
int resultado = intObj.intValue();
12 - 11
Exerccio Resolvido
O objetivo deste exerccio estender a aplicao proposta no exerccio 12.1 para que um
evento ocorrido no applet Java provoque uma alterao na pgina HTML. Faz parte deste
exerccio a alterao de um programa em Java, portanto necessrio que esteja disponvel
um ambiente de desenvolvimento Java como o JDK da Sun. A figura abaixo mostra a
aplicao rodando no Microsoft Internet Explorer.
Utilize os seguintes arquivos, localizados no diretrio cap12/:
Desenha2.java
Desenha2.html
As etapas do exerccio so as seguintes:
a) Primeiro altere o arquivo
Desenha2.html, criando uma funo que
receba dois argumentos do tipo String e
preencha os campos de texto coordx e
coordy com os valores recebidos.
b) Depois altere o programa
Desenha2.java para que na ocorrncia
do evento de movimento do mouse
(mtodo mouseMoved()) as coordenadas
x e y do ponteiro do mouse sejam
recuperadas e que a funo JavaScript
definida no item anterior seja chamada
com os valores.
c) Compile o programa, teste e carregue no browser.
Soluo
A primeira parte simples. Consiste apenas em definir a funo que ir alterar os valores
dos campos de texto. Esta funo ser chamada a partir do applet Java.
function setCoords(x, y) {
document.forms[0].coordx.value = x;
document.forms[0].coordy.value = y;
}
12 - 12
Agora precisamos alterar o programa em Java. Uma listagem parcial do programa est
mostrada abaixo. Os trechos que foram adicionados ao programa original esto em negrito:
import
import
import
import
java.awt.*;
java.awt.event.*;
java.applet.*;
netscape.javascript.*;
12 - 13
}
// (... restante do cdigo inalterado: mtodos no
// mostrados aqui nao foram modificados ... )
}
Corrija quaisquer erros e depois teste o applet, carregando-o no browser. Para ver
possveis mensagens de erro, abra o Java Console do seu browser. Aps a correo de
erros, e recompilao, pode ser necessrio fechar todas as janelas do browser e abri-lo
novamente para que a verso atualizada do applet seja carregada corretamente.
Converso de tipos
Java uma linguagem rigorosa em relao a tipos de dados. Na comunicao entre Java e
JavaScript ocorrem diversas converses de tipos. Quando valores so passados de Java para
JavaScript, eles obedecem s converses mostradas na tabela abaixo:
Tipo de dados Java
byte, char, short, int, long, float, double
boolean
java.lang.String
3
12 - 14
Object
JavaObject
JavaClass
JavaArray
netscape.javascript.JSObject
java.lang.Object
java.lang.Class
tipo[]
Exerccios
12.2
12 - 15
12.3
12 - 16
Apndice A - Bibliografia
Bibliografia
Referncias
Documentos consultados na elaborao deste livro.
[1] Tim Berners-Lee. Information Management: A Proposal. CERN European Laboratory for
Particle Physics, March 1989, May 1990. URL:
http://www.w3.org/History/1989/proposal.html.
[2] CERN European Laboratory for Particle Physics. An Overview of the World Wide Web History and Growth. 1997. URL:
http://www.cern.ch/Public/ACHIEVEMENTS/WEB/history.html.
[3] Netscape Corporation. JavaScript (1.1) Guide for Netscape 3.0. 1996. URL:
http://home.netscape.com/eng/mozilla/3.0/handbook/javascript/ .
[4] Microsoft Corporation. Jscript 4.0/5.0beta Reference and Tutorial. 1998. URL:
http://www.microsoft.com/scripting/
A-1
[14]Matthew J. Rechs, Angelo Sirigos, Nik Williams. DevEdge Newsgroup FAQ: JavaScript.
Netscape Corporation. 1998. URL:
http://developer.netscape.com/support/faqs/champions/javascript.html.
[15]World Wide Web Consortium W3C. HTML 3.2/4.0 Specifications. 1998. URL:
http://www.w3.org/pub/WWW/MarkUp/Wilbur/.
[16]Danny Goodman. JavaScript Object Roadmap and Compatibility Guide. 1997. URL:
http://www.dannyg.com/update.html.
[17]Lisa Rein and Jennifer Spelman. ECMAScript in a nutshell: Our guide to the new
specification. NetscapeWorld Magazine, July 1997. URL:
http://www.netscapeworld.com/nw-07-1997/nw-07-javascript.html.
[18]Danny Goodman, Cookie Recipes Client Side Persistent Data.
http://developer.netscape.com/viewsource/goodman_cookies.html.
Apndice A - Bibliografia
http://www.netscapeworld.com/netscapeworld/nw-12-1996/nw-12javascript1.html.
Websites
Alguns websites dedicados a JavaScript, HTML e Java.
Netscape Developers Corner: Site da Netscape dedicado suas tecnologias Web: JavaScript,
LiveWire, LiveConnect, etc. Contm detalhada documentao, artigos, exemplos de cdigo
e software. URL: http://developer.netscape.com/.
JavaWorld: Revista mensal dedicada Java, com artigos, exemplos de cdigo, anlise de
livros, etc. URL: http://www.javaworld.com/.
WebDeveloper.Com: Revista interativa dedicada tecnologias Web. Possui uma seo sobre
JavaScript, com artigos, tutoriais e exemplos de cdigo. URL:
http://www.webdeveloper.com/.
Web Developers Virtual Library. Coleo de tutoriais sobre tecnologias Web, inclundo
JavaScript, Java e DHTML. URL: http://www.wdvl.com/.
DevHead Web Development for the Next Millemnium. Revista interativa da ZDNet com
sees detalhadas sobre diversas tecnologias Web. Tutoriais, artigos, anlise de produtos e
livros. URL: http://www.zdnet.com/devhead/. Seo dedicada a JavaScript:
http://www.zdnet.com/devhead/filters/javascript/.
A-3
EarthWeb Gamelan: Grande repositrio dedicado a Java. Muitos applets, aplicaes, beans,
componentes e documentao. URL: http://www.gamelan.com/.
W3C World Wide Web Consortium: Site do consrcio que define os padres da World
Wide Web. Contm especificaes e software experimental. URL: http://www.w3.org/.
Opera. Um browser alternativo que suporta HTML4, Java (atravs de plug-in), JavaScript
(parcialmente - baseado em JavaScript 1.1) e CSS (folhas de estilo). URL:
http://www.operasoftware.com/.
A-4