Anatomia de uma Página

A estrutura "page" (página) do jQuery Mobile é otimizada para suportar tanto páginas sozinhas, quanto uma lista de "subpáginas" internas localizadas dentro de um único arquivo.

O objetivo deste modelo é permitir que desenvolvedores criem sites usando as melhores práticas - onde links ordinários vão "simplesmente funcionar" sem nenhuma configuração especial - enquanto criam uma rica, experiência semelhante a aplicativos nativos que não pode ser atingida com requests HTTP padrões.

Estrutura de Página

Uma página utilizando jQuery Mobile deve iniciar com um doctype HTML5 para utilizar todas as funcionalidades que o framework oferece (Dispositivos mais antigos com browsers que não entendem HTML5 irão ignorar com segurança o doctype e vários atributos personalizados). Dentro do 'head', referências ao jQuery, jQuery Mobile e ao tema CSS são todas requeridas para começar:

<!DOCTYPE html>
<html>
	<head>
	<title>Título da Página</title>
	<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.css" />
	<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
	<script src="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.js"></script>
</head>
<body>

...

</body>
</html>

Dentro da tag <body>, cada "página" no dispositivo móvel é identificada com um elemento (geralmente um div) com o atributo data-role="page":

<div data-role="page"> 
	...
</div>

Dentro do container "page", quaisquer tags HTML válidas podem ser utilizadas, mas para páginas típicas em jQuery Mobile, o filho imediato de uma "page" são divs com os data-roles "header", "content" e "footer" (respectivamente: cabeçalho, conteúdo e rodapé).

<div data-role="page">
	<div data-role="header">...</div>
	<div data-role="content">...</div>
	<div data-role="footer">...</div>
</div>

Template de uma página completa

Juntando tudo, esse é o template de página padrão que você deveria usar para começar seus sites:

<!DOCTYPE html>
<html>
	<head>
	<title>Título da Página</title>
	<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.css" />
	<script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
	<script src="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.js"></script>
</head>
<body>

<div data-role="page">

	<div data-role="header">
		<h1>Cabeçalho da Página</h1>
	</div><!-- /header -->

	<div data-role="content">
		<p>O conteúdo da página vem aqui.</p>
	</div><!-- /content -->

	<div data-role="footer">
		<h4>Rodapé da página</h4>
	</div><!-- /header -->
</div><!-- /page -->

</body>
</html>

Visualizar o template

Ligações para páginas externas

O jQuery Mobile automatiza o processo de construção de sites e aplicações com Ajax.

Por padrão, quando você clica em um link que aponta para uma página externa (ex.: produtos.html), o framework irá ler o href do link para formular uma requisição Ajax (Hijax) e mostrar um spinner indicando o carregamento.

Se a requisição Ajax for completa com sucesso, o conteúdo da nova página é adicionado ao DOM, a função mobilize() é chamada, e por fim a nova página é animada para a tela com uma transição de página.

Se a requisição Ajax falhar, o framework irá mostrar uma pequena mensagem de erro sobreposta (estilizada com o tema "e") que desaparece após um breve tempo de forma a não interromper a experiência de navegação. Veja um exemplo de mensagem de erro.

"Páginas" locais internas

Um mesmo documento HTML pode conter múltimplas "páginas" que são carregadas de forma conjunta com o empilhamento de múltiplas divs com o data-role de "page". Cada bloco de "página" precisa de um ID único (id="foo") que será usadoo para linkar internamento entre as "páginas" (href="#foo"). Quando um link é clicado, o framework irá procurar por uma "página" interna com o ID e irá fazer a transição dela para a tela.

É importante notar que se você está linkando de uma página que foi carregada via Ajax para uma página que contenha múltiplas páginas internas, você precisa adicionar ao link um rel="external". Isto diz ao framework fazer uma recarga completa da página para limpar o hash Ajax da URL. Isto é crítico porque páginas Ajax usam o hash (jogo da velha, #) para registrar o histórico Ajax, enquanto páginas com múltiplas subpáginas internas usam o hash para indicar páginas internas, então poderão haver conflitos.

Por exemplo, o link para uma página contendo múltiplas páginas internas irá se parecer com isso:

<a href="multipage.html" rel="external">Link para página multipla</a>

Aqui está um exemplo de um site com 2 "páginas" feito com dois divs jQuery Mobile navegados com links de uma página para outra. Note que os IDs nas páginas só são necessários para dar suporte a ligação interna entre páginas, e são opcionais se cada página for um documento HTML separado. Aqui está como duas páginas ficam dentro de um elemento body.

<body> 

<!-- Começo da primeira página -->
<div data-role="page" id="foo">

	<div data-role="header">
		<h1>Foo</h1>

	</div><!-- /header -->

	<div data-role="content">
		<p>Eu venho primeiro no código então eu sou exibida como página.</p>
		<p>Veja a página interna chamada <a href="#bar">bar</a></p>
	</div><!-- /content -->

	<div data-role="footer">
		<h4>Rodapé</h4>
	</div><!-- /header -->
</div><!-- /page -->


<!-- Começo da segunda página -->
<div data-role="page" id="bar">

	<div data-role="header">
		<h1>Bar</h1>

	</div><!-- /header -->

	<div data-role="content">
		<p>Como eu venho depois no código, sou considerada uma página interna.</p>
		<p><a href="#foo">Voltar para foo</a></p>
	</div><!-- /content -->

	<div data-role="footer">
		<h4>Rodapé</h4>
	</div><!-- /header -->
</div><!-- /page -->

</body>
Visualizar o template de páginas múltiplas

ATENÇÃO: Como estamos usando o hash (#) para manter o histórico de navegação para todas as "páginas" Ajax, não é possível fazer uma ligação para uma âncora em uma página (index.html#foo) em uma página em jQuery Mobile, porque o framework irá procurar por uma "página" com o ID de #foo ao invés do comportamento padrão de rolar para o conteúdo com aquele ID.

Aprenda mais sobre os detalhes técnicos do modelo de navegação e Ajax, hashes e histórico no jQuery mobile.