Canais iMasters

Javascript + Ajax

Requisição HttpRequest com Prototype

Neste artigo veremos, de forma simples e objetiva, como desenvolver um sistema de pesquisa utilizando os recursos da biblioteca Prototype.

Visite o site oficial do Prototype em http://prototype.conio.net. A documentação não é um ponto forte do site, mas você pode ler uma boa referência da biblioteca no site do Sérgio Pereira: http://www.sergiopereira.com/articles/prototype140.js.ptBR.html.

Com o Prototype é possível desenvolver de forma simples e direta. Essa biblioteca encapsula diversas funções do Javascript. Neste artigo daremos ênfase aos métodos $(), $F(), Event.observe e principalmente à classe Ajax.Request.

Começaremos pela tela do usuário, página totalmente em HTML, onde há a inclusão dos arquivos prototype.js e request.js. No arquivo resquest.js estão as funções construídas para realizar a busca de livros.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
5 <title>Requisição HttpRequest com Prototype</title>
6 <script type="text/javascript" src="ajax/prototype.js"></script>
7 <script src="ajax/request.js" type="text/javascript"></script>
8 <link href="css/busca.css" rel="stylesheet" type="text/css" />
9 </head>
10 <body>
11 <h1> Requisição HttpRequest com Prototype</h1>
12 <fieldset>
13 <legend> Busca de Livros </legend>
14 <form name="formPesquisa">
15 <input type="text" id="pesquisa" size="20" maxlength="40" name="pesquisa" class="inputBusca" />
16 <input type="button" id="btnBusca" value="Pesquisar" class="inputBusca" />
17 </form>
18 <div id="divResultado"></div>
19 </fieldset>
20 </body>
21 </html>

Interface com o usuário, a primeira parte do sistema a ser construída.

Repare que no botão de pesquisa (Linha 16) não há o onclick, comumente utilizado para chamadas de funções Javascript. Isso é possível porque o sistema está utilizando Javascript não-obstrutivo. Em outras palavras, você não precisa modificar seu código html para fazer chamadas a funções Javascript. A função responsável em iniciar o processo de busca ao clicarmos no botão de pesquisa está no arquivo request.js. Para entender melhor esse conceito, recomendo dois bons artigos publicados aqui no iMasters, o primeiro do Leandro Vieira (http://www.imasters.com.br/artigo/5136) e o segundo do André Metzen (http://www.imasters.com.br/artigo/4768/).

Ao realizar uma busca utilizando, por exemplo, o termo ajax, deverá retornar uma tela como a da Figura 1.2.

Artigo_clip_image001.gif
Tela HTML com retorno da pesquisa realizada pela palavra-chave ajax.

Na figura abaixo temos o código-fonte do arquivo request.js:

Artigo_clip_image002.gif
Arquivo request.js, com todas as funções Javascript construídas pelo desenvolvedor, necessárias para a comunicação entre a tela HTML e o script de busca.

Examinando o arquivo request.js:

Linha 1: início da função responsável pelo processo de chamada do arquivo de busca que realizará a pesquisa no banco de dados.

Linha 2: informamos qual o nome da página responsável por ir ao banco de dados e trazer as informações.

Linha 3: é declarada a variável termo onde será armazenado o que foi digitado pelo usuário no campo de busca. Aqui está o Javascript não-obstrutivo, citado anteriormente, possível com o uso da função $F() do Prototype que captura o valor do elemento identificado na linha 15 da página index.html.

Linha 4: é declarada a variável contendo o parâmetro que será enviado para a página debusca (busca.php).

Linhas 5 a 7: aqui instanciamos a classe Ajax.Request. O método de envio é post. Quando a requisição terminar (onComplete) é chamada a função listaLivros().

Linha 8: função $() do Prototype, faz o papel do document.getElementById(). O innerHtml Insere a mensagem Buscando livros... no div divResultados, mensagem que será posteriormente sobrescrita quando o script chegar na Linha 10.

Linha 10: Função responsável em inserir no div divResultados o retorno HTML  da página busca.php, armazenado em responseText.

Linhas 14 a 16: função obervadora Init() contendo o Event.observe do Prototype, cujo papel é observar o elemento btnBusca (linha 16 do arquivo index.html). Quanto acionado o botão de busca, será chamada a função buscaLivros().

Linha 17: Dessa vez, o Event.observe tem como objetivo chamar a função Init() ao término do carregamento da página (window, load). É importante a compreensão desse trecho, pois os elementos da página index.html, identificados pelos seus respectivos ids, passam a existir apenas depois que a página é totalmente carregada. Pesquise sobre o padrão Observer do Javascript para melhor entendimento.

Finalmente a página de busca:

Artigo_clip_image004.jpg
Página de busca. Um script comum em PHP, que devolve o resultado do banco de dados.

Essa página não tem segredo. Ela foi construída em PHP e por funcionar de forma independente pode ser reescrita em qualquer outra linguagem, como JSP ou ASP.

Na linha 2, é instanciada a classe mysqli, que estabelece a conexão com o MySQL. A linha 7 recupera o parâmetro enviado pela Ajax.Resquest (linha 5 do arquivo request.js).

Nas linhas 14 a 17 o script varre o resultado da consulta imprimindo os dados no formatado HTML que serão exibidos no div divResultado da página index.html. Caso nenhum registro seja resultado, retornará a mensagem da linha 20.

O objetivo da requisição com HttpResquest é que o tráfego das informações ocorra em background, sem que o usuário precise esperar a página inteira ir com a requisição e depois voltar com a resposta, como acontece na navegação clássica.

Para fins didáticos, não utilizei orientação a objetos com arquitetura em camadas, mas recomendo que você construa seus aplicativos com base na arquitetura MVC: separação da lógica de banco (persistência), negócio, controle e visualização. Para quem desenvolve em PHP, recomendo para a camada de visualização o uso do template Smarty (http://smarty.php.net).

Você pode baixar o código-fonte completo deste artigo, incluindo o prototype.js, clicando aqui. Ao


Comente também

16 Comentários

Pietro Cheldon
Pietro Cheldon

mais podia ter uma versão adaptada para o ASP né !!!

Marcio Muzzi
Marcio Muzzi

Amigos, apenas uma correção na matéria: no detalhamento do arquivo %u201Crequest.js%u201D, onde explica sobre a linha 3 %u201CAqui está o Javascript não-obstrutivo, citado anteriormente, possível com o uso da função $F()...%u201D não é nesse trecho que é aplicado o conceito do Javascript não-obstrutivo e sim nas linhas 14 a 16 onde está a função observadora.

Pietro Cheldon, veja que quando inicio a explicação da página de busca (busca.php), comento que ela pode ser reescrita em outra linguagem, inclusive ASP.

Marcio Muzzi
Marcio Muzzi

Amigos, apenas uma correção na matéria: no detalhamento do arquivo request.js, onde explica sobre a linha 3: qui está o Javascript não-obstrutivo, citado anteriormente, possível com o uso da função $F()... não é nesse trecho que é aplicado o conceito do Javascript não-obstrutivo e sim nas linhas 14 a 16 onde está a função observadora.

Eurico Vidal
Eurico Vidal

se quiser eu altero os dados PHP para ASP...
com conexão com ACCESS
meu email: euricovidal@hotmail.com

Marcio Muzzi
Marcio Muzzi

Gostaria de ver a adaptação, basta você informar o nome do seu arquivo ASP na linha 2 do arquivo request.js. Depois que estiver funcionando manda para o meu e-mail o seu código e depois comente aqui se foi fácil a adaptação.
Abraços.

Charles Souza
Charles Souza

muito bom.
não ligue para a critica que tem acima, sempre há pessoas para criticar mesmo sem razao.
continue escrevendo seus artigos assim.
vlw

David Coca
David Coca

Ronaud Pereira
Ronaud Pereira

Muito legal o artigo. Porém ao executá-lo, surge a mensagem da ausência da classe mysqli. E realmente, acho que faltou iniciar essa classe. De qualquer forma, parabéns.

Flavio dos Santos
Flavio dos Santos

Uso o S.O. Linux e ao tentar descompactar o pacote .rar apresenta a mensagem de erro.
O amigo Marcio Muzzi pode fazer uma compactação por zip?
Agradeço por sua Boa Vontade de colocar mais ensinamentos para os novatos, como eu.

Grato.

Marcio Muzzi
Marcio Muzzi

Flavio, me passa seu e-mail que respondo com o arquivo.zip. Meu e-mail: marcio.muzzi@gmail.com

Fernando Jacinto
Fernando Jacinto

Marcio, muito bom ... estou utilizando algo parecido no site japs.etc.br, mas tenho uma dúvida ?!?!? Vc pode me ajudar ???
Tem um função js:
function $(s) {
return document.getElementById(s);
}
e assim faço as consistências ...
Mas só consigo utilizar $(id).value com input text, como faço para utilizar com um array type radio do tipo radio(0).checked = True ... no velho javascript ???
Grato ! ! !

Francielle Oliveira da luz
Francielle Oliveira da luz

oi amigo gostei muito do seu artigo, e já deu p/ ter umas ideias, mais faz muito tempo que não programo em php, vou por uma versão jsp se vc não achar ruim. blz???

Marcio Muzzi
Marcio Muzzi

Francielle, a idéia é justamente essa, esse exemplo funcionar independentemente da linguagem do servidor. Além disso Java é muito bom! Depois comenta aqui como foi a adaptação. Abraços

Vinicius Alegreti Meza
Vinicius Alegreti Meza

Olá Márcio, quero parabenizá-lo pelo artigo. Em particular, como seu artigo foi escrito no ano passado, já pode avisar seus leitores que a documentação está reforçada, com versões em PDF e chm. A API completa está disponível! Um forte abraço.

abelardo oliveira
abelardo oliveira

Adorei o codigo, mas fiquei com uma duvida, tentei rodar, mas deu um erro que nao encontrou a classe mysqli , como resolvo esse problema? abracos abelardo.oliveira@hotmail.com agradeço

Marcio Muzzi
Marcio Muzzi

Olá Abelardo. Antes de tudo, obrigado por prestigiar meu artigo.

Você precisa que a extensão do mysqli esteja habilitada no servidor. Se for Windows, entre no php.ini e descomente a seguinte linha: extension=php_mysqli.dll

Se for Linux, siga as orientações conforme a referência no site oficial do PHP:
http://br2.php.net/manual/pt_BR/ref.mysqli.php

Abraço

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize