Estou pensando em usar a API de histórico do HTML5 para resolver problemas de vínculo profundo com o conteúdo carregado com AJAX, mas estou lutando para sair do papel. Alguém sabe de bons recursos?
Eu quero usar isso, pois parece uma ótima maneira de permitir a possibilidade de aqueles que estão sendo enviados, os links podem não ter o JS ativado. Muitas soluções falham quando alguém com JS envia um link para alguém sem.
Minha pesquisa inicial parece apontar para uma API de histórico no JS e o método pushState.
fonte
Eu me beneficiei muito com 'Dive into HTML 5'. A explicação e a demonstração são mais fáceis e objetivas. Capítulo Histórico - http://diveintohtml5.info/history.html e demonstração do histórico - http://diveintohtml5.info/examples/history/fer.html
fonte
Lembre-se de usar o HTML5 pushstate se um usuário copiar ou adicionar um link direto aos favoritos e visitá-lo novamente; isso será um acesso direto ao servidor, que será 404; portanto, você deve estar pronto para isso, e mesmo uma biblioteca pushstate js não ajudará. vocês. A solução mais fácil é adicionar uma regra de reescrita ao servidor Nginx ou Apache da seguinte maneira:
Apache (no seu vhost, se você estiver usando um):
Nginx
fonte
A especificação do histórico do HTML5 é peculiar.
history.pushState()
não despacha umpopstate
evento ou carrega uma nova página por si só. Era apenas para empurrar o estado para a história. Este é um recurso "desfazer" para aplicativos de página única. Você deve despachar manualmente umpopstate
evento ou usarhistory.go()
para navegar para o novo estado. A idéia é que um roteador possa ouvirpopstate
eventos e fazer a navegação por você.Algumas coisas a serem observadas:
history.pushState()
ehistory.replaceState()
não despachepopstate
eventos.history.back()
,history.forward()
E as costas do navegador e botões de avançar fazer expediçãopopstate
eventos.history.go()
ehistory.go(0)
recarregue a página inteira e não enviepopstate
eventos.history.go(-1)
(voltar 1 página) ehistory.go(1)
(avançar 1 página) enviampopstate
eventos.Você pode usar a API do histórico como esta para enviar um novo estado E enviar um evento popstate.
history.pushState({message:'New State!'}, 'New Title', '/link'); window.dispatchEvent(new PopStateEvent('popstate', { bubbles: false, cancelable: false, state: history.state }));
Em seguida, ouça
popstate
eventos com um roteador.fonte
new PopStateEvent(...)
parece não funcionar no IE11? Existe uma solução alternativa que alguém conhece?var pop_state_event = document.createEvent('Event'); pop_state_event.initEvent('popstate', true, true); window.dispatchEvent(pop_state_event);
Você pode experimentar o Davis.js , ele fornece roteamento em seu JavaScript usando pushState quando disponível e sem JavaScript, permite que o código do lado do servidor lide com as solicitações.
fonte
Aqui está um ótimo roteiro do Ryan Bates sobre railscasts. No final, ele simplesmente desabilita a funcionalidade ajax se o método history.pushState não estiver disponível:
http://railscasts.com/episodes/246-ajax-history-state
fonte
Você pode dar uma olhada neste plugin jQuery. Eles têm muitos exemplos em seu site. http://www.asual.com/jquery/address/
fonte
Eu escrevi uma abstração de roteador muito simples sobre o History.js, chamada StateRouter.js . Está nos estágios iniciais de desenvolvimento, mas estou usando-o como a solução de roteamento em um aplicativo de página única que estou escrevendo. Como você, achei o History.js muito difícil de entender, especialmente porque eu sou bastante novo em JavaScript, até entender que você realmente precisa (ou deveria ter) uma abstração de roteamento sobre ela, pois resolve um nível baixo problema.
Este exemplo de código simples deve demonstrar como é usado:
Aqui está um pequeno violino que inventei para demonstrar seu uso.
fonte
se o jQuery estiver disponível, você poderá usar o jQuery BBQ
fonte