Boteco Digital

Introdução ao AJAX com JQuery

09/05/2009
Rodrigo Aramburu

Para quem já trabalha com internet há algum tempo esta é uma sigla bastante comum. Mas o que seria exatamente AJAX?

Para começar vamos esclarecer que AJAX não é uma tecnologia e sim uma metodologia que utiliza tecnologias não tão novas assim como XML e Javascript para fazer requisições assíncronas ao servidor e com as informações retornadas modificar a página já carregada utilizando DOM para modificar-la sem recarregar todo conteúdo novamente. E com isso economizar no tráfego de internet e melhorar a experiência do usuário.

Primeiramente vejamos como uma página simples é carregada.

1 . O usuário digita um URL no campo endereço aperta enter e o navegador envia uma requisição normalmente do tipo GET para o servidor que retorna para o navegador o conteúdo que é exibido.

2. O usuário clica em um link da página então o navegador faz outra requisição ao servidor que envia todo o conteúdo da nova página novamente.

Requisição ajax

Se pensarmos um pouco, muito conteúdo é repetido é baixado quando navegamos entre as página de um mesmo site, como topo, menus, rodapés etc.

Com base nisso, porque não carregar somente o conteúdo que mudou a cada requisição, sem mexer no resto do conteúdo da página? Isto é a base do AJAX.

Quando começou a ser utilizado a o retorno do servidor era feito em XML (por isso o X da sigla) mas com o passar do tempo passou a se chamar AJAX toda requisição assíncrona ao servidor Web.

Bom para entendermos como fazer uma requisição assíncrona precisamos conhecer 2 tipos de requisição que o protocolo HTTP aceita:

GET: É o método mais comum: solicita algum recurso como um arquivo ou um script (qualquer dado que estiver identificado pelo URI) por meio do protocolo HTTP. O método GET é reconhecido por todos os servidores.

POST: Envia dados para serem processados (por exemplo, dados de um formulário HTML) para o recurso especificado. Os dados são incluídos no corpo do comando.

Bom vamos agora ver um pequeno exemplo de como fazer requisições assíncronas e carregar o conteúdo dentro de um div utilizando a JQuery.

HTML Principal
<div id="carregando">Carregando</div>

<h1>Cabeçalho</h1>

<a href="conteudo1.php">Conteudo 1</a>
<a href="conteudo2.php">Conteudo 2</a>
<a href="conteudo3.php">Conteudo 3</a>
<a href="conteudo4.php">Conteudo 4</a>

<div id="conteudo"></div>

Como vimos não é nada diferente do que conhecemos, também temos os arquivos com o conteúdo que irá dentro do div #conteudo:

conteudo1.php
<h1> Conteudo 1</h1>
<p>Donec scelerisque aliquet nunc id mattis. Aliquam auctor bibendum massa at dapibus. Suspendisse ante metus, ornare vitae venenatis vitae, posuere sit amet risus. Nam lacus orci, placerat ut tincidunt nec, tincidunt mollis nisl? Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse id arcu sed urna tincidunt semper. Mauris eu mauris nec est euismod dapibus. Suspendisse imperdiet est id purus placerat consectetur. Curabitur interdum ipsum vitae lacus tincidunt nec elementum nunc consectetur. Etiam dapibus felis non nisl tempor lobortis. Mauris commodo varius ligula eget posuere. Suspendisse ligula arcu, tincidunt dictum varius in, bibendum in purus. Maecenas faucibus, lorem vel fermentum vehicula, dui magna dignissim mauris, viverra egestas magna eros eu lorem. Donec facilisis felis suscipit dui blandit eget commodo erat feugiat. Proin eget diam risus.</p>
conteudo2.php
<h2> Conteudo 2</h2>
<p>Nullam non metus risus, in congue velit. Mauris vitae est massa! Nunc suscipit iaculis varius. Suspendisse eros neque, consectetur ut tincidunt sed, placerat eget ipsum? Phasellus eget mauris libero. Donec elit nunc, varius nec auctor vitae, dapibus non turpis. Donec cursus malesuada quam, id accumsan ante imperdiet ac. Donec purus lorem, fringilla fermentum tempus a, porta quis velit. Morbi quis arcu magna, in ultrices neque? Nullam molestie ultricies nibh placerat varius?</p>
conteudo3.php
<h3> Conteudo 3</h3>
<p>Vestibulum eget tellus eros. Mauris et ante id diam malesuada dignissim. Nam vel sem pulvinar velit tincidunt sodales id et ipsum. Cras magna turpis; egestas non dignissim id; malesuada vel velit! Vivamus libero lorem; congue ut auctor sed; rhoncus mattis magna. Sed eget purus ac ante feugiat laoreet! Aliquam erat volutpat. Duis eu nisi ac metus interdum lobortis eget vitae enim. Nunc adipiscing accumsan magna, at rutrum tortor condimentum ac. Sed lobortis adipiscing erat, faucibus blandit odio mollis in. Integer ipsum justo, varius ac malesuada in, laoreet vitae lacus. Donec varius mauris nec dui tristique aliquet. Donec eros arcu, tristique eget fringilla sit amet, feugiat vel leo. Ut elit justo, elementum ut convallis in, consequat in eros. Proin a leo sed dolor aliquam ultrices.</p>
conteudo4.php
<h4> Conteudo 4</h4>
<p>Cras porta, tellus eu elementum pulvinar, tellus nulla tempus neque, ac posuere sem sem varius quam? Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse lobortis feugiat ante interdum facilisis. Proin ante velit, congue vel lobortis a, commodo id risus. Ut sapien turpis, convallis condimentum suscipit in, imperdiet ut ante. Nullam molestie cursus leo, quis luctus risus bibendum quis? Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse lacus nulla; tincidunt consequat rhoncus sed, suscipit sit amet tellus. Fusce faucibus, justo quis mollis volutpat, ligula est sodales dui; eu dictum ante urna vitae ipsum. Vivamus elementum leo et dui viverra blandit. Nunc ac blandit tellus. Sed dui nibh, porttitor nec sagittis quis, commodo tincidunt libero.</p>

Bom com os arquivos HTML prontos vamos ao que interessa, o código Javascript que é responsável pelas requisições assíncronas pelo método GET:

  $(document).ready(function(){
      $("a").each(function() {
           var href = $(this).attr('href');
           $(this).attr('href','javascript:void(0)');
           $(this).click(function(){
                $('#conteudo').html("");
       	    	$("#carregando").show('slow');
                 $.get( href , function(data){
                        $('#conteudo').html(data);
                        $("#carregando").hide('slow');
                 });
                return null;
        });
     });
  });

Na linha 2 utilizamos o método each que para cada elemento encontrado pelo seletor, no caso “a”(links), ele vai executar a função definida que captura a URL do atributo href do link e armazena em uma variável (linha 3), seta o atributo href para não apontar mais para nenhum link(linha 4), adiciona o evento click (linha 5), dentro do evento click limpamos o div #conteudo (linha 6), mostramos a mensagem de carregando (linha 7) e utilizamos o método $.get(url,function(data){}) que realmente faz a mágica( linha 8).

O método $.get(url,function(data){}) faz a requisição assíncrona com o servidor e passa para a função passada por parâmetro o retorno do servidor na variável data.

Após receber o retorno do servidor jogamos este retorno dentro da div #conteudo(linha 9) e escondemos a mensagem de carregando (linha 10).

Para ver o exemplo funcionando clique aqui

Veremos agora como criar um formulário utilizando AJAX pelo método POST:

HTML
<div id="carregando">Carregando</div>
<div id="mensagem"></div>

<form action="processapost.php" method="post">

    <label for="nome">Nome:</label>
    <input type="text" name="nome" />

    <label for="email">E-mail</label>
    <input type="text" name="email" />

    <input type="submit" value="Enviar" />
</form>
Script que processa a requisição POST (processapost.php)
        Dados enviados:<br /><br />
       <?php echo "Nome: ".$_POST['nome']; ?>
       <br />
       <?php echo "E-mail: ".$_POST['email']; ?>
E o código Javascript:
  $(document).ready(function(){
        var action = $('form').attr('action');
        $('form').attr('action','javascript:void(0);');
        $('form').submit(function(){
       	    	$("#carregando").show('slow');

                 $.post(action ,jQuery("form").serialize(),  function(data){
                        $('#mensagem').html(data);
                        $('#mensagem').show();
                        $("#carregando").hide('slow');
                 });
                return null;
        });

	});

Na linha 2 capturamos a URL que irá processar e retornar os valores do nosso formulário e depois (linha 3) configuramos para que o formulário não envie a requisição como faria normalmente, e configuramos o evento submit (linha 4) que é ativado quando o formulário é enviado.

Quando isto acontecer ele irá mostrar a mensagem de carregando (linha 5) e utilizamos o método $.post(url ,dados, function(data)){} que faz uma requisição via POST para url, enviando um array dados e após executa a função recebendo por parâmetro data com o retorno do servidor. Na linha 8 inserimos o retorno da requisição na div #mensagem, deixamos visível esta div e por fim escondemos a mensagem de carregando(linha 10).

Os dados enviados são passados na forma de array no fomato:

 { var1: "valor1", var2: "valor2" }

ou na forma de string:

 var1=valor&var2=valor

Como vimos no exemplo utilizamos jQuery(“form”).serialize(), que converte um conjunto de inputs em uma string no segundo formato.

Para ver o exemplo funcionando clique aqui

Este foi o tão aguardado artigo sobre AJAX com JQuery, os exemplos são bastante simples mas com um pouco de criatividade dá para fazer coisas bem legais.

Até mais “Vida longa e prospera!”


, , ,

Atualmente existe 28 comentários

  1. Angelo 10/05/2009:

    Muito bom! Parabéns. Simples, prático e fácil de fazer. Estou sempre atento nos artigos de webdesign XD.

  2. Marcelo L. 17/05/2009:

    Interessante, gostei.

    Os exemplos não estão funcionando.

    Até!

  3. Rodrigo Aramburu 20/05/2009:

    Desculpe, já arrumei os exemplos.

  4. Thiago Camargo 26/11/2009:

    Olá, eu utilizei o serialize() só que tive um problema, e mesmo buscando na internet não encontrei a solução… numa text do meu form se usar virgula ele passa tudo para string de forma errada!

    Ex:
    Campo altura eu digitei 1 e o campo espessura digitei 1,11
    quando aplico o serialize, ele monta isso:
    altura=1&espessura=11%2C1

    no seu exemplo ele aparece as virgulas perfeitamente…
    sabe qual seria o erro?

    meu código é este abaixo:

    function showValues() {
    var str = $(“form”).serialize();
    $(“#results”).text(str);
    }

    OBRIGADO!!

  5. Rodrigo Aramburu 30/11/2009:

    Thiago não esta havendo problema, é que o serialize() converte alguns caracteres especiais para um código de URL, você pode conferi-los neste link
    http://www.w3schools.com/TAGS/ref_urlencode.asp

    você pode contornar isso utilizando a funcão replace do javascript.

  6. Rafael 14/03/2010:

    Você poderia ter liberado todos os scripts para download, pelo que eu vi no seu código fonte, ele usa um arquivo jquery.js, e aqui no site não cita ele, mesma coisa do CSS q aqui no site não tem…

    Se liberasse os arquivos para download, seria mais fácil…

  7. Rafael 14/03/2010:

    Desconsidere minha mensagem acima…

    Consegui fazer funcionar aqui :D

    Agora, minha dúvida é a seguinte:

    Tem como eu trocar do DIV, colocar um iframe???

    Pq meu site é em iframe, e pra mim mudar pra DIV, dependendo o conteudo da página, ele irá ficar maior que a DIV, desconfigurando assim o layout…

    Se puder responder no meu email, grato…

  8. Rodrigo Aramburu 15/03/2010:

    Olha para trocar para iframe basta colocar como o “id” do iframe “mensagem”, mas se for trabalhar com iframe não tem muito sentido utilizar AJAX, se tu não quer o div aumente pode utilizar a propriedade CSS:

    overflow:scroll;

    que faz o div ter um scroll igual ao iframe, acho que resolve seu problema.

  9. Rafael 15/03/2010:

    blz, irei fazer os testes aki e ver qual ficará melhor…

  10. Rafael 16/03/2010:

    Uma dúvida no ali no AJAX do formulário, e se o método for GET, tem alguma modificação a fazer alem do method=GET
    ???

  11. Rodrigo Aramburu 16/03/2010:

    sim, no script que irá tratar o formulário e no método do jquery que deve ser “$.get”

  12. Rafael 18/03/2010:

    Eu dinovo ^^…

    Me fala uma coisa, tp no meu site, na DIV é para ficar aberto o arquivo principal.php…

    Só q com o iframe eu sabia como fazer isso, mais com a DIV eu não sei :S

    Como faria para deixar esse arquivo aberto por padrão???

    Pq tpw, eu poderia mto bem escrever o código dentro da DIV e boa…

    Porém se eu faço isso, se o cara clicar lá: Home, ele não vai voltar aquele código novamente… ou vai???

    Ah ideia q me surgiu agora aki foi de fazer o seguinte:

    Colocar o código dentro da DIV, se vc funcionar, ai no link da home, eu coloco pra ir pro principal.php q é o arquivo que contem esse mesmo código da DIV, ou seja, só seria carregado aquele script qndo abrisse o site pela primeira vez…

    Será q dá certo?

  13. jadson 30/10/2010:

    eu gostaria de saber porque o exemplo que eu pegue de vc não esta funcionando no google chrome? mada a resposta para meu e-maio por favor…

  14. João 21/01/2011:

    Cara.. isso não é ajax não!!

  15. Rodrigo Aramburu 26/01/2011:

    João, você está dizendo isso porque não se utiliza XML? se convencionou a chamar de ajax as requisições assincronas ao servidor feitas com javascript, sendo o formato do arquivo XML, JSON ou HTML mesmo. É umas das siglas que se começou a ser utilizada para muitas coisas. O AJAX virou mais uma bussword mesmo perdendo o significado original.

  16. andrew 24/03/2011:

    Olá boa tarde gostaria de saber se o meu menu for em flash funcionaria normalmente?

  17. Rodrigo Aramburu 24/03/2011:

    andrew, se os teus link forem em flash acho que não, não trabalho com flash quem sabe dê para fazer alguma coisa com actionscript.

  18. andrew 24/03/2011:

    Vlw brigado pela atenção.

  19. Rafael 09/05/2011:

    olá, primeiramente parabéns pelo post, ficou mt didático, com certeza ganhou um usuário fixo.. :D

    mas tenho uma dúvida, e se tiver no formulário um campo file? ele enviará os valores certinhos? aqui esta dando erro: Undefined index

    alguma sujestão? grande abraço e sucesso

  20. Rodrigo Aramburu 11/05/2011:

    Rafael,

    para enviar um arquivo é melhor utilizar um plugin, um que já utilizei e gostei muito é o http://valums.com/ajax-upload/

  21. Wagner Drachinski 11/05/2011:

    Olá a todos, eu sou novo em jquery e ajax então gostaria de fazer uma pergunta a vocês, por exemplo eu tenho uma DIV que recebe as páginas clicadas no link, utilizando o AJAX e Jquery($.ajax)… mas assim quando uma página carregada dentro do DIV tem um link ele não funciona. A minha declaração de Jquery é $(“a”).click(function() { var link = $(this).attr(‘href’); … então com isso eu não preciso ficar declarando function link(){ O JQUERY } e dai no a ficar colocando , dessa forma que estou mostrando funciona, mas da primeira não. Por que isso?

    o Jquery não tem acesso com o que foi carregado pelo DIV??
    quem quiser o código inteiro para dar uma melhor olhada é so me mandar um e-mail,

    obrigado

  22. Wagner Drachinski 11/05/2011:

    acima ele fez caca… rrsrs

    e dai no a ficar colocando ‘a href=aaaa onClick=javascript:link()’ , dessa forma que estou mostrando funciona, mas da primeira não. Por que isso?

    o Jquery não tem acesso com o que foi carregado pelo DIV??
    quem quiser o código inteiro para dar uma melhor olhada é so me mandar um e-mail,

    obrigado

  23. Willy Chagas 11/06/2011:

    Wagner Drachinski, você terá que colocar o código dentro de uma função e chama-la depois de carregar o conteúdo, isso se chama função recursiva.

    function load(){

    $(document).ready(function(){
    $(“a”).each(function() {
    var href = $(this).attr(‘href’);
    $(this).attr(‘href’,'javascript:void(0)’);
    $(this).click(function(){
    $(‘#conteudo’).html(“”);
    $(“#carregando”).show(‘slow’);
    $.get( href , function(data){
    $(‘#conteudo’).html(data);
    $(“#carregando”).hide(‘slow’);
    //Carrega novamente a funcao
    load();
    });
    return null;
    });
    });
    });

    }

    Normalmente eu faço assim se alguém faz outro jeito por favor compartilhe. ABs

  24. Antenor Queiroz 29/06/2011:

    Massa esse Post. Tudo bem explicado.
    Pra mim funcionou certinho!!! Valeu!!

  25. Matheus 23/07/2011:

    po kra muito bom, continue postando ae sobre ajax por favor,
    Matheus – Curitiba

  26. flavia 19/10/2011:

    O exemplo dos links está faltando mais explicação.
    Baixei o pacote do JQuery mas nao sei onde fica esse arquivo jquery.js

  27. marlus 29/10/2011:

    nao estou conseguindo apontar o link para abrir na div..
    pode me ajudar?

Deixe um comentário