Impedir que el navegador se desplace en HTML5 History popstate

¿Es posible evitar el comportamiento predeterminado de desplazamiento del documento cuando se produce un evento de popstate?

Nuestro sitio utiliza el desplazamiento animado jQuery y 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 se produce un evento de estado pop.

He intentado usar un conjunto de elementos de contenedor al 100% del ancho y alto del documento y desplazar el contenido dentro de ese contenedor. El problema que he encontrado es que no parece ser tan fácil como desplazar el documento; especialmente si se usa mucho css3 como cuadros de sombras y gradientes.

También he intentado almacenar la posición de desplazamiento del documento durante un desplazamiento iniciado por el usuario y restaurarlo después de que el navegador desplace 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 está activando (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 inicie Popstate y luego desplace 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 avanza / retrocede (por ejemplo, GitHub).

¿Es posible evitar que el documento se desplace en todos los eventos de popstate?

Respuestas a la pregunta(11)

Su respuesta a la pregunta