Resolvendo o problema do botão voltar em aplicações Ajax

In: Ajax| Javascript| Jquery| Web Standards| Web developing

9 Mar 2009

Quem aqui sempre sonhou em fazer aplicações em Ajax na qual o usuário pode navegar livremente utilizando o botão voltar e avançar, e além disso, pode adicionar seções específicas ao seu bookmark. Na teoria, isto não seria possível, visto que, o “Ajax” em si, utilizando pela maioria, é utilizado para recarregar apenas alguns blocos da página, mantendo aquela página ativa, e consequentemente, impossibilitando o uso do botão voltar ou de bookmarks, do contrário teríamos a boa e velha requisição da página inteira.

Mas então, como o GMAIL funciona? Ele é totalmente em ajax e mesmo assim, você consegue navegar utilizando o botão voltar, e se colocar um link como http://mail.google.com/mail/#compose na barra de endereços, ele irá abrir a tela de composição de e-mails normalmente. O grande segredo está nas #âncoras.
Navegação Orientada a Âncoras

Uma coisa muito interessante das chamadas Âncoras, é que elas permitem que você use o botão voltar e avançar, por exemplo, sem gerar nenhuma requisição e sem precisar sair daquela página, então, o que poderíamos fazer?

A primeira coisa seria criar um arquivo Javascript que irá ficar toda hora verificando se alguma âncora está ativa, caso esteja, ele envia a requisição ajax chamando a seção específica, baseada no nome da âncora, que será carregada dentro do bloco principal, simples não?

Como já é de praxe para Javascript hoje em dia, usaremos Jquery, portanto, lembrem-se de incluir o arquivo da biblioteca na sua aplicação.

Teríamos então, um arquivo de nome “core.js”, assim:

  1. /**
  2. * Ao carregar a página, o temporizador é iniciando para checar se há uma nova âncora ativa a cada 300ms
  3. */
  4. $().ready(function(){
  5. setInterval("checkAnchor()", 300);
  6. });
  7. var currentAnchor = null;
  8.  
  9. /**
  10. * Metodo que checa se há alguma mudança de âncora, se houver, envia a requisição ajax
  11. */
  12. function checkAnchor(){
  13.  
  14. if(currentAnchor != document.location.hash){
  15. currentAnchor = document.location.hash;
  16.  
  17. /**
  18. * Se não há nenhuma âncora ativa, a seção default é carregada
  19. */
  20. if(!currentAnchor)
  21. query = "section=home";
  22. else
  23. {
  24. /**
  25. * Cria a string de resultado. Convertendo a url: URL/#fotos&id=2 em URL/?section=fotos&id=2
  26. * */
  27. var splits = currentAnchor.substring(1).split(‘&’);
  28. var section = splits[0];
  29. delete splits[0];
  30. var params = splits.join(‘&’);
  31. var query = "section=" + section + params;
  32. }
  33. /**
  34. * Envia a requisição
  35. */
  36. $.get("callbacks.php",query, function(data){
  37. $("#bloco_principal").html(data);
  38. });
  39. }
  40. }
  41.  

Ok, o conteúdo será carregando no eleme nto de ID “bloco_principal” através do resultado das requisições Ajax que estão sendo enviadas para a página “callbacks.php” em formato de querystring GET.
Para pegarmos, teríamos algo desse tipo:

  1. $section = addslashes(strip_tags($_GET[’section’]));
  2. $pagina = "paginas/".$section.".php";
  3. if (file_exists($pagina))  {
  4. include($pagina);
  5. }

Com isso, bastaria uma pasta “paginas” contendo as páginas com os mesmos nomes das âncoras.

E para chamar cada seção, bastaria uma simples página html com links do tipo:

http://meusite.com/#fotos

que seria detectado pelo método “checkAnchor()” do javascript, que chamará uma requisição php carregando a página de nome fotos.php dentro do diretorio paginas, que será exibida dentro do bloco #bloco_principal que está contido na mesma página do link clicado, e o melhor de tudo, você pode voltar, avançar e adicionar as seções que quiser aos favoritos, à vontade.

Para ilustrar melhor o exemplo, fiz uma cópia descarada (haha), do site do evento php-pb.net, com a única diferença de possuir navegação em ajax através de âncoras (o original possui navegação normal). Acessem pelo link: http://www.diegopessoa.com/php-pb-ajax

Se quiserem baixar o exemplo funcionando, cliquem aqui!

6 Responses to Resolvendo o problema do botão voltar em aplicações Ajax

Avatar

ivolnei

January 19th, 2010 at 18:58

Show de bola, estava procurando isso a muito tempo e efim, cá está.
Parabéns.

Uma questão. Se eu quiser mandar um valor pela URL, como faço?

Avatar

Diego Pessoa

January 19th, 2010 at 20:53

Olá Ivolnei, obrigado!

Basta adicionar o parâmetro normalmente após a marcação da âncora, exemplo: site.com/#secao&id=5. O código disponível no post trata também os parâmetros.

=)

Avatar

Candida

April 13th, 2010 at 1:10

Olá Diego… estou fazendo uma página em ajax + php. Esta página pega dados dinamicos e joga em paginações… Só que não estou conseguindo fazer funcionar se a url que envio fica assim: #sistema?idpessoa=1. Tens alguma solução?

Avatar

Candida

April 13th, 2010 at 13:23

Ja consegui descobrir o que era ^^ Mas valeu memso assim =P… super show o tutorial parabens =D

Avatar

Diego Pessoa

May 11th, 2010 at 21:16

Obrigado =)

Avatar

Eduardo

June 24th, 2010 at 20:50

Cara, muito bom. Sabe dizer se o Gmail usa a mesma técnica? Vi que eles usam âncoras e a página não é recarregada ao navegar (modifiquei parte do html com o Firebug e ele não é restaurado).

Comment Form

About this blog

Hi! I'm a Brazilian Software Developer. Degree in Systems for the Internet at IFPB and enthusiast of technologies related to web. Nowadays I'm working as technical leader of the ITVP project at the Dynavideo company. (See more)

  • Eduardo: Cara, muito bom. Sabe dizer se o Gmail usa a mesma técnica? Vi que eles usam âncoras e a página n [...]
  • Diego Pessoa: Obrigado =) [...]
  • Candida: Ja consegui descobrir o que era ^^ Mas valeu memso assim =P... super show o tutorial parabens =D [...]
  • Candida: Olá Diego... estou fazendo uma página em ajax + php. Esta página pega dados dinamicos e joga em p [...]
  • Diego Pessoa: Olá Ivolnei, obrigado! Basta adicionar o parâmetro normalmente após a marcação da âncora, e [...]

Twitter Updates

    Flickr Photostream

    photo photo photo photo photo photo photo photo photo photo photo photo