Estoy buscando usar la API de historial HTML5 para resolver problemas de enlaces profundos con contenido cargado AJAX, pero estoy luchando por despegar. ¿Alguien sabe de algún buen recurso?
Quiero usar esto, ya que parece una excelente manera de permitir la posibilidad de que los que se envían los enlaces no tengan JS activado. Muchas soluciones fallan cuando alguien con JS envía un enlace a alguien sin él.
Mi investigación inicial parece apuntar a una API de Historia dentro de JS y al método pushState.
fuente
Me beneficié mucho de 'Sumérgete en HTML 5'. La explicación y la demostración son más fáciles y precisas. Capítulo de historia - http://diveintohtml5.info/history.html y demo de historia - http://diveintohtml5.info/examples/history/fer.html
fuente
Tenga en cuenta al usar HTML5 pushstate si un usuario copia o marca un enlace profundo y lo vuelve a visitar, entonces será un éxito directo del servidor que será 404, por lo que debe estar listo para ello e incluso una biblioteca pushstate js no ayudará tú. La solución más fácil es agregar una regla de reescritura a su servidor Nginx o Apache de la siguiente manera:
Apache (en su servidor virtual si está usando uno):
Nginx
fuente
La especificación del historial HTML5 es peculiar.
history.pushState()
no despacha unpopstate
evento ni carga una nueva página por sí mismo. Solo estaba destinado a empujar al estado a la historia. Esta es una función de "deshacer" para aplicaciones de una sola página. Debe despachar manualmente unpopstate
evento o utilizarlohistory.go()
para navegar al nuevo estado. La idea es que un enrutador pueda escucharpopstate
eventos y hacer la navegación por usted.Algunas cosas a tener en cuenta:
history.pushState()
yhistory.replaceState()
no despacharpopstate
eventos.history.back()
,history.forward()
y los botones de avance y retroceso del navegador se despachanpopstate
de eventos.history.go()
yhistory.go(0)
hacer una recarga de página completa y no enviarpopstate
eventos.history.go(-1)
(atrás 1 página) yhistory.go(1)
(adelante 1 página) hacenpopstate
eventos de despacho .Puede usar la API de historial de esta manera para impulsar un nuevo estado Y enviar un evento popstate.
history.pushState({message:'New State!'}, 'New Title', '/link'); window.dispatchEvent(new PopStateEvent('popstate', { bubbles: false, cancelable: false, state: history.state }));
Luego escuche los
popstate
eventos con un enrutador.fuente
new PopStateEvent(...)
parece que no funciona en IE11? ¿Hay alguna solución que alguien sepa?var pop_state_event = document.createEvent('Event'); pop_state_event.initEvent('popstate', true, true); window.dispatchEvent(pop_state_event);
Puede probar Davis.js , le brinda enrutamiento en su JavaScript utilizando pushState cuando está disponible y sin JavaScript permite que el código del lado del servidor maneje las solicitudes.
fuente
Aquí hay un gran reparto de pantalla sobre el tema por Ryan Bates de railscasts. Al final, simplemente deshabilita la funcionalidad ajax si el método history.pushState no está disponible:
http://railscasts.com/episodes/246-ajax-history-state
fuente
Es posible que desee echar un vistazo a este complemento jQuery. Tienen muchos ejemplos en su sitio. http://www.asual.com/jquery/address/
fuente
He escrito una abstracción de enrutador muy simple sobre History.js, llamada StateRouter.js . Está en las primeras etapas de desarrollo, pero lo estoy usando como la solución de enrutamiento en una aplicación de una sola página que estoy escribiendo. Al igual que usted, encontré que History.js es muy difícil de entender, especialmente porque soy bastante nuevo en JavaScript, hasta que entendí que realmente necesita (o debería tener) una abstracción de enrutamiento, ya que resuelve un nivel bajo problema.
Este código de ejemplo simple debería demostrar cómo se usa:
Aquí hay un pequeño violín que he inventado para demostrar su uso.
fuente
Si jQuery está disponible, puede usar jQuery BBQ
fuente