Escolar Documentos
Profissional Documentos
Cultura Documentos
Aprendendo JavaScript
Aprendendo JavaScript
Sumrio
1 Introduo
2 Histrico de JavaScript
3 Conceitos
4.1.2 Booleano
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.3 Indefinido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
4.1.4 null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
4.1.5 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.1.6 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.2 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
4.2.1 Aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
4.2.2 Comparao
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
13
4.2.4 Atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
4.2.5 Lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
13
4.4 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
4.5 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
21
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.6 Excees
5 Web 2.0
31
31
31
35
6 Ferramentas
43
INTRODUO
Introduo
www.google.com
www.gmail.com
3
www.google.com/maps
2
HISTRICO DE JAVASCRIPT
Histrico de JavaScript
HISTRICO DE JAVASCRIPT
CONCEITOS
Conceitos
CONCEITOS
CONCEITOS
Nesta seo esto descritos os conceitos bsicos para se programar em JavaScript. Quem j possui algum conhecimento com outras linguagens de programao sabe que os comandos bsicos compem a "caixa de ferramentas" que
deve ser utilizada para criar qualquer aplicao, seja ela muito pequena ou gigantesca.
A aplicao em JavaScript sempre ser composta desses comandos e elementos menores, e a lgica com que foram colocados juntos para se relacionarem
possibilita a criao de uma soluo visando o resultado esperado.
4.1
4.1.1
Tipos de dados
Tipos numricos
Ponto flutuante
var x = 12,3; //declarado na forma comum
var x = 4,238e2; //declarado como potncia de 10 que equivale a 423,8
4.1.2
Booleano
Uma varivel do tipo booleano pode assumir apenas dois valores: true e false.
Os valores deste tipo so em geral usados pela linguagem como resultado de
comparaes e podem ser usados pelo usurio para valores de teste ou para
atributos que possuam apenas dois estados. Equivale ao uso de um inteiro com
valores 0 ou 1 na linguagem C.
O JavaScript converte automaticamente true para 1 e false para 0 quando
isso for necessrio.
Exemplo:
var a = 14;
var b = 42;
var tr = (a == 14);
var fl = (a == b);
// Neste caso tr ir conter o valor true e fl o valor false.
var int1 = tr+1;
var int2 = fl+1;
// A varivel int1 ir conter o valor 2 (true + 1), pois true
// automaticamente convertido para 1 e int2 ir conter o valor 1
// (false + 1), pois false convertido para 0.
4.1.3
Indefinido
Uma varivel indefinida quando ela foi declarada de alguma forma mas no
possui nenhum valor concreto armazenado. Quando tentamos acessar uma
varivel que no teve nenhum valor associado a ela teremos como retorno "undefined" (indefinido).
Exemplo:
var marvin;
window.alert(marvin);
// Quando tentamos imprimir a varivel marvin na janela de alerta
// ser impresso "undefined" pois no h nenhum valor associado a ela.
var text = "";
// O mesmo no ocorre com o caso acima, pois essa varivel contm uma
// sequncia de caractres nula e nada ser impresso.
4.1.4
null
10
4.1.5
Strings
4.1.6
Arrays
11
4.2
Operadores
Nesta seo listaremos, de forma sucinta, os principais operadores que compem o ncleo da linguagem JavaScript.
As tabelas a seguir mostram todos esses operadores.
4.2.1
4.2.2
Aritmticos
Operador
Operao
Exemplo
Adio
x+y
Subtrao
x-y
Multiplicao
x*y
Diviso
x/y
x%y
Inverso de sinal
-x
++
Incremento
x++ ou ++x
--
Decremento
x-- ou --x
Comparao
Operador
Funo
Exemplo
==
Igual a
(x == y)
!=
Diferente de
(x != y)
===
(x === y)
!==
No Idntico a
(x !== y)
>
Maior que
(x > y)
>=
Maior ou igual a
(x >= y)
<
Menor que
(x < y)
<=
Menor ou igual a
(x <= y)
12
4.2.3
Bit a bit
Operador
Operao
Exemplo
&
E (AND)
(x & y)
OU (OR)
(x | y)
Ou Exclusivo (XOR)
(x y)
Negao (NOT)
>>
(x >> 2)
<<
(x << 1)
>>>
(x >>> 3)
4.2.4
4.2.5
4.3
Atribuio
Operador
Exemplo
Equivalente
x=2
No possui
+=
x += y
x=x+y
-=
x -= y
x=x-y
*=
x *= y
x=x*y
/=
x /= y
x=x/y
%=
x %= y
x=x%y
&=
x &= y
x=x&y
|=
x |= y
x=x|y
x = y
x=xy
>>=
x >>= y
x = x >>= y
<<=
x <<= y
x = x <<= y
>>>=
x >>>= y
x = x >>>= y
Lgicos
Operador
Funo
Exemplo
&&
E Lgico
(x && y)
||
OU Lgico
(x || y)
Negao Lgica
!x
Estruturas de controle
if ... else
A estrutura if usada quando se deseja verificar se determinada expresso
verdadeira ou no, e executar comandos especficos para cada caso.
13
Exemplo 1:
var a = 12;
var b = 5;
if (a == b) {
window.alert("12 igual a 5?!?!");
} else {
window.alert("a diferente de b");
}
// No caso acima a frase escrita seria "a diferente de b"
14
Exemplo:
var marvin = "robot";
switch (marvin) {
case "human":
document.write("hello carbon unit!");
break;
case "alien":
document.write("brrr I hate aliens!");
break;
case "robot":
document.write("emergency, to the rescue!");
break;
default:
document.write("what are you?");
break;
}
do ... while
Diferentemente do while, o do ... while primeiro executa o contedo do lao
uma vez e, depois disso, realiza o teste da expresso pare decidir se continuar
executando o lao ou ir seguir o resto do programa.
15
Exemplo:
var cont = [5,2];
do{
cont[0]+=1;
cont[1]+=2;
document.write(cont0 = +cont[0]+cont1 =
} while ((cont[0]+cont[1]) < 15)
// Com o uso de do...while, no primeiro teste,
// j valer 10, e os contadores j terao sido
// pois o lao j foi executado a primeira vez
+cont[1]);
cont[0]+cont[1]
impressos uma vez
antes do teste!
for
Na maioria das vezes, quando usamos um lao do tipo while tambm construmos uma estrutura com um contador que incrementado a cada passo para
controle do lao e manipulao interna de objetos, arrays como nos exemplos
anteriores. Os laos for oferecem a vantagem de j possurem em sua estrutura
essa varivel de contador e increment-la de maneira implcita.
Exemplo:
var cont = [5,2,3];
for(var i=0 ; i < 3 ; i++) {
cont[i]++;
}
// Ao final do lao cada elemento do vetor cont foi incrementado em 1
4.4
Funes
O construtor Function()
A segunda forma de se declarar uma funo utilizando o construtor Function()
e o operador new, pois em JavaScript funes e objetos so interligados.
Exemplo:
var areaTri = new Function("b","h","return (b*h)/2;");
// a funo acima calcula a rea de um tringulo dadas sua base
// altura. Para invoc-la basta usar areaTri(arg1,arg2)
17
estrutura, essa forma de se declarar funes costuma ser mais usada quando
precisamos declarar um funo pequena, ocupando apenas uma linha.
Funes como literais
Uma terceira e ltima forma de se declarar uma funo em JavaScript atravs
de literais.
Exemplo:
var areaTri = function(b,h) { return (b*h)/2; };
// Para invocar a funo basta usar areaTri(arg1,arg2) como
// na declarao pelo construtor
Essa forma basicamente a mesma que declarar atravs do construtor Function(). No entanto, ela melhor porque os comandos podem ser declarados com
a sintaxe normal de JavaScript ao invs de ser uma string como o caso do
construtor. Com literais no h necessidade de manter a funo em uma linha,
dentro das chaves podemos construir a funo usando um comando por linha
normalmente.
4.5
Objetos
18
Mtodos
No paradigma de orientao a objetos, os mtodos so simplesmente funes
que so invocadas por meio de um objeto! E em JavaScript isso levado to a
srio que a maneira de se criar mtodos para seus objetos leva isso ao p da
letra. Basta criarmos uma funo e atribu-la a uma propriedade do objeto.
Exemplo:
// Uma funo fictcia para clculo de um consumo de combustvel
function calc_consumo(distancia) {
return distancia/(15/this.motor);
}
// Agora atribuimos a funo, sem os argumentos, para a
// propriedade consumo. Considerando o objeto j instnciado
// do exemplo anterior
car.consumo = calc_consumo;
// Pronto! j podemos invoc-la fazendo:
var gas = car.consumo(200);
// calculando quanto o carro gastaria de
// combustvel em 200 kilmetros
19
Prototypes
Quando declaramos ou atribumos um mtodo no construtor de um objeto ele
ficar disponvel para todas as instncias criadas a partir desse construtor. No
entanto, existe um modo muito mais eficiente de se fazer isso, que com o uso
da propriedade prototype. Tudo o que for definido no prototype de um objeto
poder ser referenciado por todas as instncias desse objeto. Mesmo as propriedades do prototype que forem definidas ou alteradas depois da instanciao
sero acessveis aos objetos declarados anteriormente. Alm disso, importante
ter em mente que os atributos e funes declarados no prototype no so copiados para os objetos, portanto h uma economia significativa de memria quando
usamos muitas propriedades compartilhadas e instncias.
Exemplo:
// Vamos elaborar mais o exemplo do carro, mas dessa
// vez usando prototype
function calc_consumo(distancia) {
return distancia/(15/this.motor);
}
// Classe que representa um carro
function Carro(modelo, marca, ano, motor) {
this.modelo = modelo;
this.marca = marca;
this.ano = ano;
this.motor = motor;
}
Carro.prototype.rodas = 4;
Carro.prototype.consumo = calc_consumo;
// Agora a classe possui uma constante que informa
// o nmero de rodas e o mtodo consumo em seu
// prototype
var car1 = new Carro("G800" , "Gurgel" , 1976 , 1.0);
var car2 = new Carro("147" , "Fiat" , 1984 , 2.0);
// Podemos acessar agora tanto a constante rodas
// quanto o mtodo consumo
if(car1.rodas == 4) window.alert("ainda bem!");
var gas = car2.consumo(180);
// e o mais importante que ambas esto acessando
// apenas uma nica constante e um nico mtodo
// na memria
Arrays Associativos
Para finalizar nossa discusso sobre objetos, vamos mostrar como eles podem
ser usados como arrays associativos, ou seja, um array com objetos indexados
por valores no numricos. Isso s pode ser feito porque possvel acessarmos
atributos de um objeto usando MeuObjeto["atributo"]. Assim podemos simular
o comportamento de um array associativo armazenando cada item em um atri20
buto.
Exemplo:
var arr = new Object();
arr["nome"] = "Zaphod Beeblebrox";
arr["cargo"] = "Presidente do Universo";
window.alert(arr["nome"]);
// Ir mostrar uma mensagem contendo:
// "Zaphod Beeblebrox"
// Note que no h nenhuma diferena se fizermos:
window.alert(arr.nome)
// Exceto que a string usada como ndice no modo []
// pode ser manipulada em tempo de execuo
Objeto String
Vamos nos ater agora aos mtodos das Strings, e embora existam outros, aqui
sero relacionados apenas os que fazem parte da ECMA 262-3 que equivale
ao JavaScript 1.6, pois estes mtodos so comuns a uma grande variedade de
browsers como FireFox, Netscape e Internet Explorer.
valueOf() - retona o valor primitivo do objeto string. til quando desejamos
atribuir o valor de um objeto string para uma varivel que seja do tipo
primitivo string.
Exemplo:
var stob = new String("Gerador de campos POP");
var str = stob.valueOf();
// Dessa forma stob ser um objeto do tipo Object e
// str ser uma varivel primitiva do tipo string.
concat(string1,string2, ... ,stringN) - este mtodo retorma uma string contendo a prpria string da qual o mtodo foi chamado e todos os caracteres
das strings que lhe foram passadas como argumentos, na ordem em que
21
foram fornecidos.
Exemplo:
var str1 = "Praticamente ",str2 = "Inofensiva";
var result = str1.concat(str2);
// A varivel result dever conter a string
// "Praticamente Inofensiva" apos a execuo do cdigo.
indexOf(padrao,pos) - procura a ocorrncia da string contida em padrao a partir da posio pos dentro da string sobre a qual se invocou este mtodo e
retorna o ndice da primeira ocorrncia. Caso no encontre o padro buscado, retorna -1. O atributo pos no obrigatrio, se ele estiver indefinido,
o valor 0 (zero) ser assumido como padro e a busca nesse caso afetar a
string inteira.
Exemplo:
var cachalote = "Vou chamar isso de cauda, cauda um bom nome!";
var ind1 = cachalote.indexOf("cauda");
var ind2 = cachalote.indexOf("cauda",25);
var ind3 = cachalote.indexOf("improbabilidade");
// Aps executado a varivel ind1 dever ter o valor 19
// ind2 dever conter 26, que o valor da ocorrncia de cauda
// aps a posio 25, como foi especificado no parmetro
// e ind3 ir conter -1 pois o padro no encontrado.
replace(velho,novo) - busca na string uma substring que seja igual ao contedo de velho e a substitui pelo contedo de novo e retona a string resultante da substituio. Alm disso, o argumento novo pode ser uma funo.
Dessa maneira, para cada ocorrncia da substring a funo ser chamada
com 3 argumentos: a substring encontrada; o deslocamento do incio da
22
Exemplo 2:
// Uma funo que chama o mtodo toUpperCase para transformar
// a substring em caractres maisculos e retorn-la.
function up(sub,pos,str) {
return sub.toUpperCase();
}
\
var a = "No se esquea de sua toalha!";
var res = a.replace("toalha",up);
// Neste caso quando o padro encontrado a funo up
// chamada e seu valor de retorno substitui o padro.
// no caso "toalha" ser substitudo por "TOALHA".
Note que o exemplo acima ilustra apenas um uso muito simples do que
pode ser realmente feito com o uso do mtodo replace chamando uma funo. Essa funo pode ser to complexa quanto necessrio, desde que
receba os mesmos trs parmetros. O mtodo toUpperCase ser explicado
adiante.
search(padrao) - busca o contedo de padrao e retorna o ndice de incio desse
padro ou -1 caso ele no seja encontrado. Tambm possvel utilizar esse
mtodo com uma expresso regular em padrao.
Exemplo:
var str = "A vida, o universo e tudo mais";
var res1 = str.search("tudo");
var res2 = str.search("cachalote");
// O cdigo acima aps executado resultaria no valor 21 na
// varivel res1 e -1 na varivel res2, porque cachalote
// no foi encontrado na string.
23
corresponder a uma posio direita de incio, caso contrrio ser retornada uma string vazia.
Exemplo:
var
var
var
var
toLowerCase() - os caractres da string so todos convertidos para letras minsculas. Se o objeto no for uma string, ento ele ser convertido automaticamente para string antes da operao ser realizada.
Exemplo:
var str =
var res =
// Depois
// conter
24
Objeto Array
Agora faremos uma breve descrio dos mtodos que o objeto Array traz consigo.
concat(item1,item2, ... ,itemN) - agrupa dois ou mais arrays e retorna o resultado
Exemplo:
var x = ["a vida","o universo"];
var y = ["e tudo mais"];
var resultado = x.concat(y);
// Isso geraria o array resultado contendo
// ["a vida","o universo","e tudo mais"]
26
Exemplo 2:
// Uma funo simples para comparar valores numricos
// os detalhes sobre a utilizao de funes sero abordadas
// mais adiante.
function compara(x,y) {
if (x < y)
return -1;
else if (x == y)
return 0;
else
return 1;
}
var vetor = [5,45,1,4,16];
var errado = vetor.sort();
var certo = vetor.sort(compara);
// O array errado ir conter [1,16,4,45,5]
// e o array certo ir conter [1,4,5,16,45]
splice(inicio, quantidade, elem1, ... , elemN) - este mtodo pode ser usado
para remover, inserir ou substituir elementos em um Array. Os argumentos "inicio" e "quantidade" so obrigatrios, mas os elementos posteriores
so opcionais.
Para apenas remover elementos do array devemos usar o mtodo com: inicio sendo o ndice do primeiro elemento a ser removido, quantidade sendo
o numero de elementos a remover e nenhum outro argumento.
Para inserir um elemento sem remover nenhum outro, basta utilizar o mtodo com parmetro inicio sendo o ndice da posio onde sero inseridos
os elementos, quantidade deve ser 0 pois no desejamos remover nenhum
elemento e cada elemento a ser inserido deve ser um novo argumento subsequente.
Para substituir elementos do array, precisamos que inicio contenha o ndice
a partir do qual os elementos sero substitudos, quantidade deve conter
o nmero de elementos que sero substitudos e mais um argumento para
cada elemento quer ser inserido substituindo os elementos originais. Note
que se houver menos elementos do que o valor em quantidade, o excedente
27
Exemplo 2:
var array = [1,2,5,6];
array.splice(2,0,3,4);
// Como resultado teremos em array o vetor [1,2,3,4,5,6]
// Isso significa que a partir do ndice 2 deletamos 0 elementos
// e inserimos os valores 3 e 4
Exemplo 3:
var array = [1,2,3,4,5,6];
array.splice(2,2,7,8);
// Como resultado teremos em array o vetor [1,2,7,8,5,6]
// Ou seja, a partir do ndice 2 deletamos 2 elementos e inserimos
// os elementos 7 e 8 no lugar deles
28
A seguir, vamos dar uma olhada nas propriedades do objeto Arrays. As propriedades so acessadas de modo similar aos mtodos, basta usar o nome do
objeto.propriedade e depois disso teremos um exemplo simples.
constructor - esta propriedade uma referncia funo que criou este objeto
array.
length - propriedade que contm o tamanho do array, ou seja, a quantidade de
elementos contidos nele.
prototype - permite se adicionar propriedades e mtodos a este objeto array.
Este usado na orientao a objetos para que um objeto herde elementos
do prototype do outro.
Exemplo:
var vetor = ["a","b","c","d"];
var tam = vetor.length;
// A varivel tam ir conter o valor 4 porque existem quatro
// elementos no array
Encerramos nossa discusso sobre objetos aqui. Embora haja mais detalhes
que podem ser apresentados e caracterizem o potencial de uso sobre sobre eles,
no objetivo deste documento nos aprofundarmos muito nos tpicos abordados e sim proporcionar as ferramentas para um bom uso inicial da linguagem.
Aqueles que se interessarem pelo assunto podero encontrar muitas informaes nos materiais referenciados na Bibliografia.
4.6
Excees
29
Agora vamos introduzir o comando Throw para fazer com que essa funo
gere uma exceo que possa ser tratada pela prpria aplicao.
Exemplo 2:
/* Funo para ler uma posio de um array e
* mostra-la na tela
*/
function lerarr(indice) {
if (!indice) throw Error;
else window.alert(array[indice]);
}
lerarr();
// Ao executar essa chamada agora temos a mensagem:
// "uncaught exception: function Error() { [native code] }"
Agora temos uma funo que capaz de verificar a existncia do seu parmetro e caso ele no tenha sido passado, gera uma exceo.
JavaScript no nos obriga a tratar essas excees enquanto elas no forem
lanadas, por exemplo, no caso acima se tivssemos passado o argumento corretamente, no receberamos nenhuma mensagem dizendo que existe uma exceo no tratada. O interpretador ir apenas "reclamar" quando essa exceo
for lanada e no estiver sendo tratada, como no caso acima. Agora vejamos
como podemos trat-la.
Exemplo:
/* Considerando a funo do exemplo anterior j declarada */
try {
lerarr(); //funo que pode lanar exceo
} catch (e) {
// comandos a serem executados em caso de exceo
window.alert("Oops! No soup for you!");
} finally {
document.write("ocorreu um erro");
}
WEB 2.0
Web 2.0
5.1
O que Ajax?
O nome Ajax foi cunhado por Jesse James Garrett em 2005 para se referir a
um conjunto de tecnologias que j existiam, mas que passaram a ser usadas
de forma inovadora, enriquecendo as possibilidades de interao na web para
torn-las o mais prximo de aplicaes desktop quanto possvel.
As pginas web sempre sofreram com falta de interao devido a prpria natureza catica da internet, de possuir uma latncia alta e ser pouco confivel.
Assim, muito comum clicarmos em um link e termos que esperar as vezes at
alguns segundos, dependendo da conexo, at que a prxima pgina seja carregada do servidor para sua mquina. claro que as conexes tm melhorado
dia a dia, mas ainda assim o simples fato de que a cada mudana de pgina
precisamos exibir um documento totalmente novo que contm, alm dos dados
que requisitamos, todas as informaes de layout novamente, representa um
gasto de banda considervel.
Uma grande diferena do Ajax que as pginas apresentadas no browser
passam a ser aplicaes, ou seja, a primeira vez que entramos em uma pgina,
a aplicao carregada para nossa mquina e depois essa aplicao fica responsvel por requisitar ou enviar os dados para o servidor de forma assncrona.
Como a aplicao est o tempo todo no browser do cliente, este no perde a
interao e pode realizar aes mesmo enquanto espera a requisio de algum
dado do servidor. Por exemplo, continuar trabalhando com os dados que j foram carregados no passado. A Figura 1 ilustra essa diferena, nela podemos
observar que as aplicaes Ajax possuem uma camada a mais entre a interface
com o usurio e o servidor, essa camada a aplicao propriamente dita.
5.2
O papel do JavaScript
WEB 2.0
Figura 1: As diferenas entre uma pgina web comum e uma aplicao Ajax [2]
Figura 2: Arquitetura de uma aplicao Ajax. Observe como o cdigo JavaScript o elemento
responsvel por organizar todos os outros no cliente e trocar dados com o servidor
32
WEB 2.0
33
WEB 2.0
Quando executar o exemplo acima em seu browser a pgina ir conter apenas uma frase no incio e um boto com o nome "Altera rvore DOM". Quando
for clicado esse boto, a funo divEdit() chamada e insere um novo pargrafo
na pgina sem necessidade de recarreg-la. Este exemplo simples mostra apenas como usar JavaScript para manipular a rvore DOM, no entramos na rea
do Ajax ainda, mas essa a base para o tratamento dos dados obtidos atravs
da tcnica.
34
5.3
WEB 2.0
35
WEB 2.0
</new>
</news>
O arquivo CSS usado apenas para estilizar o documento. Com CSS possvel tornar vrios textos aparentemente sem formatao em uma pgina muito
atraente!
No nosso caso, por se tratar de um pgina pequena e com o propsito de
mostrar apenas o funcionamento do Ajax, no precisamos de uma folha de estilos muito complexa. Assim, os comandos CSS trabalham mais com as margens,
cores e posicionamento das divs vistas no documento HTML anteriormente.
Arquivo: news.css
-----------------------------------------------------------------------------/* ---------------------- TAGS -------------------*/
body {
margin: 0;
text-align: center;
}
h2 {
font-size: 12pt;
36
WEB 2.0
font-weight: bold;
}
h3 {
font-size: 10pt;
font-weight: bold;
color: #8B0000;
padding-top: 10px;
border-top: 1px dashed #000000;
}
/**
* Funo que fica verificando as notcias no servidor em perodos
* de tempo
* @param data Endereco dos dados no servidor
*/
function timedNews(data)
{
// Busca os dados no servidor
sendRequest(data);
37
WEB 2.0
38
WEB 2.0
{
// Retira mensagem de loading
loadingMsg(0)
// Trata os dados recem chegados
parseNews();
}
// Caso contrrio coloca a mensagem de loading
else
{
loadingMsg(1);
}
}
/**
* Funo que dado a data e ttulo de uma notcia verifica se ela j
* esta sendo exibida na pgina.
* @param titulo O ttulo da notcia que se deseja buscar
* @return True se a notcia j existir e False caso contrrio
*/
function newDetect(titulo)
{
// Recupera a div onde as notcias sero inseridas
var sitenews = document.getElementById(news);
// Pega o primeiro filho
var oldnew = sitenews.firstChild;
if (oldnew == null)
{
// a div de notcias no possui filhos
// logo no existe nenhuma notcia
return false;
}
else
{
// Busca em todas as notcias
while (oldnew != null)
{
// Armazena o ttulo das notcias atual
var tit = oldnew.getElementsByTagName(h3);
tit = tit[0].innerHTML;
// Se for igual ao ttulo que estamos testando
if (tit == titulo)
{
// Retorna que a notcias j existe
return true;
}
oldnew = oldnew.nextSibling;
}
// Se nenhuma notcias for igual
// Retorna que no existe
return false;
}
}
/**
* Funo que recebe o XML carregado, separa as notcias e as
* insere na pgina caso ela no exista
*/
function parseNews()
39
WEB 2.0
{
var news = req.responseXML.getElementsByTagName(new);
for (var i=0 ; i<news.length ; i++)
{
var date = getNodeValue(news[i],date);
var title = getNodeValue(news[i],title);
var titcont = date+" - "+title;
// Veririca se a notcias j esta na pgina
if (newDetect(titcont) == false)
{
// Cria a div que ira conter a notcia
divnew = document.createElement(div);
divnew.setAttribute(id,new+i);
// Cria o ttulo das notcias
var titulo = document.createElement(h3);
titulo.appendChild(document.createTextNode(titcont));
// Cria o corpo das notcia
var corpo = document.createElement(p);
corpo.setAttribute(class,corpo);
// Agrega o contedo obtido ao corpo criado anteriormente
var txt = document.createTextNode(getNodeValue(news[i],content));
corpo.appendChild(txt);
// Agrega o ttulo e o corpo a div criada no inicio
divnew.appendChild(titulo);
divnew.appendChild(corpo);
// Busca onde a notcias ser inserida na pgina
var base = document.getElementById(news);
// Insere a notcia como primeira da pgina
base.insertBefore(divnew,base.firstChild);
}
}
}
/**
* Funo para pegar o valor de uma propriedade de um objeto
* @param obj
* @param tag Nome da propriedade que se deseja saber o valor
* @return retorna uma string contendo o valor da propriedade
*/
function getNodeValue(obj,tag)
{
return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
}
/**
* Funo que indica indica ao usurio quando dados estam sendo carregados
* @param set Valor 1 para colocar a mensagem, qualquer outro para remover
*/
function loadingMsg(set)
{
if (set == 1)
{
var msg_div = document.getElementById(loadDiv);
40
WEB 2.0
if (msg_div == null)
{
// Cria a div de loading
msg_div = document.createElement(div);
msg_div.setAttribute(id,loadDiv);
// Insere o texto na div criada
var txt = document.createTextNode(Loading...);
msg_div.appendChild(txt);
// Agrega a div no corpo da pgina
var corpo = document.getElementsByTagName(body);
corpo[0].appendChild(msg_div);
}
else
{
// Altera o contedo da div
msg_div.innerHTML = "Loading...";
}
}
else
{
// Busca a div de loading na pgina
var msg_div = document.getElementById(loadDiv);
// Se encontrar remove
if (msg_div != null)
{
var pai = msg_div.parentNode;
pai.removeChild(msg_div);
}
}
}
Agora vamos descrever cada uma das funes separadamente, para esclarecer quaisquer dvidas que tenham restado aps a leitura do cdigo todo.
timedNews(data) - esta a nica funo que chamada diretamente pela pgina HTML da nossa aplicao; ela a funo que chama a sendRequest
para requisitar os dados do servidor e em seguida se programa para ser
executada novamente a cada 30 segundos, por isso, a cada perodo de 30
segundos o arquivo de dados requisitado novamente e as notcias contidas nele so verificadas pela funo parseNews.
sendRequest(url,params,HttpMethod) - funo responsvel por requisitar os
dados do servidor de forma assncrona ao servidor; para isso, ela instancia um objeto XMLHttpRequest utilizando a funo initXMLHttpRequest e
depois configura a funco onReadyState como callback da chamada.
initXMLHttpRequest() - esta funo existe apenas devido a incompatibilidade
entre os browsers. Como nos dois mais usados o objeto XMLHttpRequest
possui diferenas na implementao, essa funo testa a existncia desses
objetos e retorna qual foi encontrado para funo sendRequest utiliz-lo.
41
WEB 2.0
onReadyState() - funo configurada como callback na sendRequest. Ela chamada a cada mudana no estado da requisio e enquanto este estado no
for igual a READY_STATE_COMPLETE ele configura uma mensagem escrito
"loading..."na pgina. Quando a requisio estiver completa, a mensagem
de loading retirada e chama-se a funo parseNews() para tratar os dados
recm chegados.
newDetect(titulo) - dado um ttulo, esta funo verifica se j existe alguma
notcia com este ttulo inserida na pgina. Se houver retorna true, caso
contrrio retornar false.
parseNews() - chamada para tratar os dados quando eles chegam do servidor.
Essa funo primeiro recupera a data e o ttulo das notcias e os junta
formando assim o ttulo que ser colocado na pgina, aps isso ela chama
a funo newDetect para verificar se esse ttulo j se encontra na pgina,
se for retornado false o notcia inserida na pgina, caso contrrio nada
ser feito, pois se trata de uma notcia antiga.
getNodeValue(obj,tag) - esta funo serve apenas para recuperar o valor de um
atributo de um n DOM, ela foi implementada apenas para facilitar esse
processo e evitar linhas de comando muito grandes na funo parseNews.
loadingMsg(set) - controla a exibio/remoo da mensagem de loading na pgina. Se set for 1 a mensagem colocada, para outro valor a mensagem de
loading removida, se existir.
42
FERRAMENTAS
Ferramentas
Firebug
Firebug uma extenso para o browser Firefox que mostra um console muito
completo. Ele capaz de mostrar erros de JavaScript, XML e CSS. Alm disso,
ele guarda um registro das chamadas ao XMLHttpRequest, o que o torna uma
boa ferramenta para debugging de aplicaes AJAX.
Com Firebug possvel colocar breakpoints ao longo do cdigo, observar variveis especficas, alterar tanto o JavaScript quanto CSS e XML em tempo de
execuo e ver o resultado naquele momento. Tambm pode ser usado para
mostrar a rvore DOM de uma pgina.
Na Figura 3 pode-se observar as abas que contm o Console, o cdigo HTML,
CSS, o script em JavaScript, a rvore DOM e por ltimo, a guia Net, que mede
quanto tempo foi necessrio para carregar cada uma das requisies de dados
feitas pela pgina.
Os aspectos que chamam ateno sobre o aplicativo Firebug que ele muito
simples de usar, so necessrios apenas alguns poucos minutos para se familiarizar com sua interface e com algum tempo de uso, podemos descobrir que ele
uma ferramenta realmente completa e poderosa.
Para usurios de outros browsers, o Firebug possui uma verso lite que pode
ser usada em qualquer browser. Essa verso consiste em um arquivo na prpria
linguagem JavaScript que deve ser includo na pgina que se deseja utiliz-lo.
A extenso Firebug se encontra na verso 1.05 e pode ser encontrada em
www.getfirebug.com. Recentemente, tivemos a notcia de que a Yahoo! dedicar
um de seus engenheiros para auxiliar o autor da ferramenta a desenvolv-la.
43
FERRAMENTAS
JSDoc
JSDoc uma ferramenta implementada em Perl que faz busca por comentrios
em arquivos JavaScript e gera documentos HTML com toda a documentao.
Ela baseada nos mesmos comandos da ferramenta javadoc, utilizada para
gerar documentao para Java.
Usurios que j esto familiarizados com javadoc no tero nenhum problema para usar o JSDoc, pois a maior parte da sintaxe utilizada para os comentrios a mesma e ela serve tanto para documentar arquivos JavaScript
estruturais quanto orientados a objeto. Na Figura 4 vemos uma amostra de
como so as pginas geradas pelo aplicativo.
A pgina da ferramenta pode ser encontrada em http://jsdoc.sourceforge.net
44
FERRAMENTAS
Figura 4:
Spket IDE
Spket uma IDE para desenvolvimento de JavaScript, SVG, XUL/XBL e Yahoo!
Widget. Ele oferece recursos como completar o cdigo enquanto digitamos e
destaque visual da sintaxe da linguagem. Podemos encontr-lo em duas verses,
como plugin para o editor Eclipse ou como uma plataforma independente (RCP).
A verso atual 1.5.9 e pode ser encontrada em http://www.spket.com. Na
Figura 5 podemos ver sua tela de edio.
45
REFERNCIAS
Referncias
[1] Douglas Crockford. Javascript: The worlds most misunderstood
programming language, 2001. Disponvel em
http://javascript.crockford.com/javascript.html , ltimo acesso em
10/01/2007.
[2] Jesse J. Garrett. Ajax: A new approach to web applications, 2005.
Disponvel em
http://www.adaptivepath.com/publications/essays/archives/000385.php ,
ltimo acesso em 04/06/2007.
[3] Gavin Kistner. Object-oriented programming in javascript, 2003. Disponvel
em http://phrogz.net/JS/Classes/OOPinJS.html , ltimo acesso em
10/01/2007.
[4] Mozilla Development Center MDC. Core javascript 1.5 guide. Disponvel em
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide , ltimo
acesso em 10/01/2007.
[5] Wikipedia the free encyclopedia. Javascript. Disponvel em
http://en.wikipedia.org/wiki/Js , ltimo acesso em 13/01/2007.
46
REFERNCIAS
47