Screencaster Transmitindo conhecimento


Como criar uma navegação AJAX que funcione? (Parte 2/2)

Seguindo nosso tutorial sobre navegação AJAX, vamos agora criar a parte do javascript para fazer a navegação AJAX propriamente dita. No tutorial anterior fizemos a navegação via includes, que é o primeiro passo para conseguirmos aplicar o javascript de modo que mesmo sem ele o usuário (ou o Google) consiga navegar tranquilamente no site.

Para fazer funcionar a navegação AJAX nós precisamos resolver os seguintes problemas:

1 - Saber qual link deve levar para qual página e carregar assincronamente (se é que essa palavra existe) a página que se quer abrir clicando no link
2 - Colocar o conteúdo da mesma dentro da div principal
3 - Trocar o título da página no “<title>” (opcional)
4 - Trocar o ID do body (opcional)
5 - Fazer com que, de algum modo, o usuário possa por exemplo enviar o endereço da página “contato” para outra pessoa, e quando esta pessoa abrir o endereço enviado caia já na página contato

Vou explicar aqui como resolver estes 5 problemas básicos para criar a navegação. Para auxiliar no desenvolvimento dessa navegação, eu utilizei a biblioteca jQuery, que vocês já devem conhecer de outros posts aqui no blog.

É interessante criar uma pasta “js” na pasta do seu site, para colocar nossos arquivos javascript. Coloque então nessa pasta o jquery.js, e também crie um arquivo chamado “navigation.js”, ou o nome que você preferir. Depois disso, vamos incluir os dois javascripts no nosso index:

<script src="/js/jquery.js" type="text/javascript"></script> 
<script src="/js/navigation.js" type="text/javascript"></script>

Certo, vamos começar a escrever o navigation.js, criando primeiramente o código que vai atribuir aos links do menu, no evento click, a ação de carregar a página via AJAX:

$(function(){
	$("ul#menu li a").click(function(){
		if(this.className.match(/vaipra_/)) {
			carregaPagina(this.className.replace("vaipra_",""))
			return false
		} else {
			return true
		}
	})
})

Observe que os links do seu menu deverão ter uma classe com a estrutura “vaipra_nomedapagina”, exemplo: “vaipra_contato”, sendo “contato” o nome da página. Não esqueça de mudar o caminho para os links dependendo do seu html alí onde está “ul#menu li a”, o seletor funciona da mesma forma que no CSS.

A função “carregaPagina” é a que se encarregará de carregar a página dentro da div principal. Aquele “return false” serve para evitar que o href do link seja aberto após a execução do script. Já caso o link não tenha a classe “vaipra_pagina” nós retornamos true, para que ele funcione normalmente.

Perceba que eu não utilizei ponto-e-vírgula no código javascript. O ponto-e-vírgula no javascript é opcional, e eu sinceramente prefiro não utilizar, afinal odeio ponto-e-vírgula (viva Ruby, Python e outras linguagens livres disso).

Vamos criar a função que carrega a página:

carregaPagina = function(pagina)
{
	if(pagina != '') {
		location.hash = pagina
		show_loading()
 
		var pagina_sem_hash = pagina.replace("#","")
		$("#conteudo_principal").load("/"+pagina_sem_hash+".php", function(){
			hide_loading()
		})
 
		document.body.setAttribute("id", pagina_sem_hash)
	}
}

Linha 4 - Defino que o hash do location será o nome da página que queremos carregar (mais adiante explico isso direito)
Linha 5 - Chamo o show_loading(), que irá exibir o “carregando”
Linha 8 - Aqui chamo a função “load” do jQuery na div principal, passando como parâmetros o nome da página (sem o “#” e acrescentando o “.php”), também digo para o jQuery executar a função hide_loading() após a página estar carregada, esta função vai esconder o “carregando”
Linha 12 - Altero o ID do body

Vamos resolver os últimos problemas agora. Primeiro, queremos que ao abrir, por exemplo, “www.exemplo.com.br/#contato”, já abra o site carregando imediatamente a página “serviços”, então vamos alterar algo no nosso primeiro código:

$(function(){
	if(location.hash != '') {
		carregaPagina(location.hash)
	}
 
	$("ul#menu li a").click(function(){
		if(this.className.match(/vaipra_/)) {
			carregaPagina(this.className.replace("vaipra_",""))
			return false
		} else {
			return true
		}
	})
})

Acrescentei uma verificação alí: caso haja um hash no endereço (tipo www.exemplo.com/#servicos), será carregada a página definida no hash. Legal isso, não? Só pra não me chamarem de chato, vamos criar então o “carregando” com um fade in pra dar um estilo.

Primeiro crie uma div oculta no seu html, formatando-a com CSS a gosto, mas não esquecendo de por um display:none para ela ficar escondida por padrão. Minha div ficou assim (HTML e depois CSS):

<div id="ajax_loader">Carregando, aguarde...</div>
div#ajax_loader { 
	font:10px/201px 'Trebuchet MS', arial, helvetica, sans-serif; 
	color:#333; 
	text-align:center; 
	text-transform:uppercase; 
	position:absolute; 
	left:35%; 
	top:50%; 
	width:300px; 
	height:200px; 
	margin:-100px 0 -150px 0; 
	border:5px solid #4292DD; 
	background:#FFF url(imagens/ajax-loader.gif) no-repeat center center; 
	display:none; 
}

Agora vamos criar as funções show/hide loading, que irão mostrar e esconder o loader, e esconder e mostrar o conteúdo do site com um efeito de fade out/in:

show_loading = function()
{
	$("#ajax_loader").fadeIn()
	$("#conteudo_principal").animate({'opacity' : 'hide'}, 'fast')
}
 
hide_loading = function()
{
	$("#ajax_loader").fadeOut()
	$("#conteudo_principal").animate({'opacity' : 'show'}, 'slow')
}

Por hoje é só pessoal, creio que vocês tenham percebido que não é nada de outro mundo criar uma navegação AJAX eficiente, e que funciona pra todo mundo, mesmo quando o javascript não está disponível. A importância dela funcionar mesmo sem javascript é principalmente pelos robôs de busca, mas também incluí pessoas que usam leitores de tela e alguns celulares, então sempre que possível é bom fazer a coisa funcionar sem depender de javascript.

Até a próxima!


12 pessoas comentaram

  1. Rafael Silva says:

    Não estou conseguindo usar, não está funcionando no ie7

  2. ANDRE CARAVACA says:

    Olá… testei o código e funcionou. Legal.
    No entanto, queria saber como faço no seguinte cenário:

    Página Index.php -> Abre uma sessão em php, estabelece conexão ao banco de dados e
    mostra o menu de navegação.

    Página home.php -> faz uma pesquisa no DB usando a conexão já aberta na página index.php

    Página login.php -> usuário faz login autenticando a sessão usando a conexão já aberta na página index.php. Nesse momento o nome do usuário é mostrado em todas as página que visita.

    Tentei fazer algo semelhante ao cenário acima, mas não obtive sucesso.
    Só consegui algum resultado abrindo a conexão ao DB em cada uma das páginas.
    E não consegui trabalhar com sessões.

    Pergunto: Isso é possível? trabalhar com sessões php e navegação por ajax?

  3. abraao says:

    gostei de sua serie de tutoriais sobre o rails e estou agora lendo um pouco sobre jquery , sou iniciante nas duas areas , alias sou iniciante em programação orientada a objeto tb . valew pela ajuda espero que publique sempre mais abraços .

  4. Luís says:

    Olá. Obrigado por se dar ao trabalho de explicar os procedimentos de Jquery. Tentei seguir o seu tutorial mas acho que não entendi. Não sei como fazer os links (o menu). Pode-me ajudar? obrigado

  5. Sou meio contra navegação em ajax… mas, vale como referência técnica nesse caso! :)

    []s!

  6. inside says:

    É Chris, eu também sou contra colocar navegação em ajax num site inteiro. Mas existem casos como no tv.screencaster.com.br em que é bacana usar.

  7. [...] this page was mentioned by Gui (@_inside), Gui (@_inside) and others. [...]

  8. Michael says:

    Muito mal explicado velho, nem falou onde teria que fazer e etc.
    Muito ruin

  9. Manoel says:

    Lixo mesmo ele explica tudo menos aonde fica os arquivos, puta que paril quero meu tempo de volta@@@!!

  10. inside says:

    Talvez esteja mal explicado mesmo Michael, apenas para aqueles que são burros e inseguros o suficiente para precisarem se auto-reafirmar postando duas vezes com nomes diferentes.
    Lhe apresento o Sr. IP: 201.78.235.167.
    Muito prazer, e caia fora do meu blog, não é lugar para gente como você.

  11. Vick says:

    Adorei seu tutorial, eh o q estou precisando, mas nao ocnsegui fazer funcionar, pode me ajudar?
    o conteudo da pagina abre em outra aba

    Vlw!!!

  12. Alexander says:

    Funcionou pela metade somente os efeitos fade e o loader estão sendo carregados na página. A parte da class do link esta um pouco confusa.

Agora é a sua vez: