Procurar

Categorias

Posts recentes

Arquivo

Blog feeds

Bookmarks


Ajax e bookmark - adicionando conteúdos dinâmicos aos favoritos
quarta, 15 de novembro de 2006

Quando uma página tem seu conteúdo carregado de forma assíncrona (via ajax), ocorre um conhecido problema ao tentar salvá-la nos favoritos. A não ser que o usuário adicione a página logo que ela carregar - quando nenhuma ação foi executada, nenhum clique foi dado - quando ele clicar no link salvo em favoritos, o conteúdo apresentado será sempre o inicial e não aquele que ele estava vendo no momento em que salvou a página.

A raiz desse problema é a mesma que impede o usuário de usar os botões do histórico em conteúdos carregados com ajax: a única página que existe para o navegador é a inicial, os conteúdos carregados com ajax não são vistos como novas páginas. Como resolver isso? Me ocorreu a idéia de enviar um comando em forma de string (como no script ajaxHistory) usando o hash. Na verdade, o hash foi usado (no lugar da query string) por que eu queria poder também usar o refresh… isso funcionou, mas só no IE. Quando a solução para o refresh for cross-browser (estamos trabalhando para isso…), vou divulgá-la aqui. Mas para usar os favoritos funcionou beleza.

A idéia é a seguinte: criei uma função que adiciona a página aos favoritos dinamicamente, acrescentando um comando javascript à URL, no hash (se o usuário for ao menu Favoritos e clicar em Adicionar a favoritos o sistema não vai funcionar). Ao carregar, uma outra função lê a URL e busca pelo comando, se ele existir, será executado no onload e o hash será esvaziado.

O princípio é bastante simples. Salvamos a página com um comando no hash que, se executado reproduz o estado da página no momento em que o usuário a salvou e executamos esse comando no onload da página. É preciso ser detalhista na hora de escrever essa string de comando, pois muitas vezes não basta executar a função que carrega os conteúdos, é preciso recriar todo um ambiente, setando variáveis e criando elementos.

Há uma variável-chave para o sistema funcionar, a jscommand. Ela deve ser atualizada a cada ação, com a string de comando. Se você resolveu usar o script ajaxHistory, fique atento por que nem sempre a string de comando será igual - quando executamos os comando do array de itens do histórico, trabalhamos num mesmo ambiente. Por outro lado, quando o sujeito voltar à nossa página a partir de um clique no seu menu Favoritos, esse ambiente deve ser inteiramente recriado, portanto, à vezes o comando para o ajaxBookmark, na variável jscommand precisa ser mais complexo.

Vamos ao código, pequeno e simples:

/* ajax_bookmarks.js */

var isIE = (/msie/i.test(navigator.userAgent) && document.all), // é Internet Explorer?
jscommand = ‘’; // aqui criamos a var. que irá guardar o comando atual

// adiciona aos favoritos - chamada a partir de um botão ou link tipo ‘Bookmark this page’
function ajaxBookmark() {
var loc = jscommand == ‘’ ? location.href : // se jscommand está vazia, usa a URL como está
// senão, redefine o hash adicionando a string de comando
location.href.split(’#')[0]+’#jscommand:’+encodeURIComponent(jscommand);
if(isIE) window.external.AddFavorite(loc, document.title); // IE
else if(window.sidebar) window.sidebar.addPanel(document.title, loc, ""); // Mozilla
else alert(’Não foi possível adicionar esta página aos favoritos automaticamente.\n’+
‘Por favor, pressione CTRL + D para adicionar manualmente.’); // ???
}

// usada para checar o hash - deve ser chamada no onload da página
function checkHashCommand() {
if(/#?jscommand\:(.+)$/.test(location.hash)) { // testa se o comando existe e em caso positivo
jscommand = decodeURIComponent(RegExp.$1); // define o comando em jscommand
// e tenta executar a string e limpar o hash
try { new Function(jscommand)(); location.hash = ‘’; }
catch(e) { }
}
}

Um exemplo de uso (com ajaxHistory)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<title>teste ajax</title>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" language="javascript" src="../js/ajax_history.js"></script>
<script type="text/javascript" language="javascript" src="../js/ajax_bookmarks.js"></script>
<script type="text/javascript" language="javascript">
// inicializa o sistema e o histórico
function ajaxFeatures() {
checkHashCommand();
ajaxHistory.activateBrowserHistory();
}
// executa um comando recebido como string
function execute(comm, capt) {
try { new Function(comm)(); if(capt) document.title = capt; }
catch(e) { return; }
ajaxHistory.add(comm, capt);
jscommand = comm; // setando o comando atual
}
</script>
</head>
<!– chamar checkHashCommand() no onload é fundamental!!! –>
<body onload="ajaxFeatures();">
Clique num dos links e depois em ‘Bookmark’ para salvar nos Favoritos,<br />
Vá para outra página e depois volte a partir dos seus Favoritos e<br />
repare no texto exibido abaixo do link ‘Bookmark this page’<br /><br />
<!– para usar a função execute(), foi preciso o ‘return false’ nos links… –>
<p><a href="javascript://" onclick="
execute(’document.getElementById(\’see\’).innerHTML = \’link 1\’;',’link 1′);
return false;">link 1</a><br />
<a href="javascript://" onclick="
execute(’document.getElementById(\’see\’).innerHTML = \’link 2\’;',’link 2′);
return false;">link 2</a><br />
<a href="javascript://" onclick="
execute(’document.getElementById(\’see\’).innerHTML = \’link 3\’;',’link 3′);
return false;">link 3</a> </p>
<p><a href="javascript://Adicionar aos Favoritos" onclick="
ajaxBookmark()">Bookmark this page</a></p>
<p id="see"></p>
</body>
</html>

Bem, a princípio isso me pareceu uma boa solução, mas não funcionou satisfatoriamente em FF 1.5 e NS 7.2. Coisas estranhas acontecem, como a página ser carregada na barra lateral e o resultado da função não ser igual para NS e FF. A função addPanel na verdade não adiciona um item aos Favoritos, apenas cria um panel no Sidebar… Não sou usuário de Mozilla, uso apenas para testar (digo isso sabendo que vai parecer um sacrilégio para alguns, mas tenho que confessar: eu uso o IE!).

Espero que aproveitem a idéia mas, principalmente, espero que alguém que conheça os meandros do Netscape e do Firefox tenha uma boa idéia e possa fazer um ajuste.

Sugestões e comentários são muito bemvindos.

1 Comentário »

Feeds para os comentários nesse post:
TrackBack: http://cauguanabara.blogsome.com/2006/11/15/ajax-e-bookmark-adicionando-conteudos-dinamicos-aos-favoritos/trackback/

  1. Achei um Artigo no site O’Reilly Mail que mostra como fazer para que seja adicionado aos favoritos mesmo quando o usuário clicar na barra de ferramentas do navegador. Testei em IE 7 e FF2.

    Demonstração: http://www.onjava.com/onjava/2005/10/26/examples/examples/oreillymail/oreillymail.html

    Artigo:
    http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html

    Tagôre Cauê

    Por Tagôre Cauê em 2006-11-15 04:18:12, quarta

Say something! »















Por favor digite o texto da imagem acima.

lamp! Mapa do site
Ajax e bookmark - adicionando conteúdos dinâmicos aos favoritos