¿Es posible evitar el comportamiento predeterminado de desplazarse por el documento cuando ocurre un evento popstate?
Nuestro sitio utiliza el desplazamiento animado de jQuery e History.js, y los cambios de estado deben desplazar al usuario a diferentes áreas de la página, ya sea a través de pushstate o popstate. El problema es que el navegador restaura la posición de desplazamiento del estado anterior automáticamente cuando ocurre un evento de estado emergente.
Intenté usar un elemento de contenedor configurado al 100% de ancho y alto del documento y desplazar el contenido dentro de ese contenedor. El problema con eso que he encontrado es que no parece ser tan suave como desplazarse por el documento; especialmente si usa muchos css3 como sombras de caja y degradados.
También intenté almacenar la posición de desplazamiento del documento durante un desplazamiento iniciado por el usuario y restaurarlo después de que el navegador se desplaza por la página (en popstate). Esto funciona bien en Firefox 12, pero en Chrome 19 hay un parpadeo debido a que la página se desplaza y se restaura. Supongo que esto tiene que ver con un retraso entre el desplazamiento y el evento de desplazamiento que se activa (donde se restaura la posición de desplazamiento).
Firefox desplaza la página (y activa el evento de desplazamiento) antes de que se active popstate y Chrome active primero popstate y luego se desplace por el documento.
Todos los sitios que he visto que usan la API de historial usan una solución similar a las anteriores o simplemente ignoran el cambio de posición de desplazamiento cuando un usuario retrocede / avanza (por ejemplo, GitHub).
¿Es posible evitar que el documento se desplace en absoluto en los eventos popstate?
document.body.clientHeight
pero no lo he visto funcionar en todos los navegadores.