¿Hay algún evento al que me pueda suscribir cuando se modifique el estado del historial? ¿Cómo?Cómo detectar cuándo se usan history.pushState y history.replaceState?
Respuesta
El evento onpopstate debe ser despedido cuando cambia la historia, se pueden enlazar a ella en su código como este:
window.onpopstate = function (event) {
// do stuff here
}
Este evento también puede ser despedido cuando se carga la página, se puede determinar si el evento fue despedido de una carga de la página, o mediante el uso de pushState/replaceState comprobando el objeto de evento para una propiedad del estado, será indefinido si el evento fue causado por una carga de la página
window.onpopstate = function (event) {
if (event.state) {
// history changed because of pushState/replaceState
} else {
// history changed because of a page load
}
}
en este momento hay ningún evento onpushstate desgracia , para evitar esto necesitas envolver los métodos pushState y replaceState para implementar su propio evento onpushstate.
Tengo una biblioteca que hace que trabajar con pushState sea un poco más fácil, podría valer la pena llamarlo Davis.js, proporciona una API sencilla para trabajar con enrutamiento basado en pushState.
Solía usar esto para también ser notificado cuando pushState
y replaceState
son llamados:
// Add this:
var _wr = function(type) {
var orig = history[type];
return function() {
var rv = orig.apply(this, arguments);
var e = new Event(type);
e.arguments = arguments;
window.dispatchEvent(e);
return rv;
};
};
history.pushState = _wr('pushState'), history.replaceState = _wr('replaceState');
// Use it like this:
window.addEventListener('replaceState', function(e) {
console.warn('THEY DID IT AGAIN!');
});
Por lo general es una exageración sin embargo. Y podría no funcionar en todos los navegadores. (Solo me importa mi versión de mi navegador.)
NB. Tampoco funciona en las secuencias de comandos de contenido de extensiones de Google Chrome, porque no está permitido alterar el entorno JS del sitio. Puede solucionarlo insertando un <script>
con dicho código, pero eso es aún más exagerado.
- 1. Cómo detectar cuándo se muestra y oculta el teclado
- 2. Detectar si y cuándo se realizan llamadas jQuery AJAX
- 3. ¿Cómo detectar cuándo se cambia el tema en WP7?
- 4. ¿Cómo detectar cuándo se está maximizando el formulario?
- 5. ¿Cómo puedo detectar cuándo se ha movido mi Vista?
- 6. ¿Cómo puedo detectar cuándo se está redireccionando la salida?
- 7. ¿Cómo detectar cuándo se inicia la reproducción de VideoView (Android)?
- 8. ¿Cómo puedo detectar cuándo se carga una página web?
- 9. cómo detectar cuándo ha finalizado MotionEvent.ACTION_MOVE
- 10. iOS: ¿Cómo detectar cuándo termina una animación?
- 11. Cómo pasar al objeto jQuery history.pushState
- 12. ¿Cómo puedo detectar cuándo se abren nuevas ventanas y/u obtener una lista de ventanas abiertas?
- 13. Cómo desencadenar un cambio cuando se usa el botón Atrás con history.pushstate y popstate?
- 14. history.pushState() Cambio de buscar valores
- 15. history.pushState no desencadena evento 'popstate'
- 16. ¿Hay algún evento para detectar cuándo se atenúa la pantalla?
- 17. ¿Cómo se usan el dup2 y el tenedor juntos?
- 18. ¿Por qué y cómo se usan funciones anónimas en PHP?
- 19. ¿Qué son los módulos de combinación y cómo se usan?
- 20. ¿Cómo se usan las máscaras personalizadas de Datepicker y Timepicker?
- 21. ¿Cuándo se crea PropertyChangedEventManager y cuándo se adjunta?
- 22. Cómo detectar cuándo se desliza un interruptor, no se hace clic en
- 23. ¿Cómo se usan los marcos de CSS?
- 24. ¿Cómo se usan DVCS en equipos grandes?
- 25. ¿Hay una devolución de llamada para History.pushstate?
- 26. ¿Cómo se usan las matrices débiles?
- 27. ¿Cómo se usan los marcadores en vi?
- 28. Cómo rastrear el uso de la aplicación en Android? ¿Cómo detectar cuándo se lanza una actividad?
- 29. ¿Cómo puedo detectar cuándo sale un subproceso de cliente?
- 30. Cómo detectar cuándo XHR devuelve un recurso en caché?
Parece que event.state aún se puede configurar en la carga de la página (Chrome). – GolezTrol
Mozilla/Firefox no emite un evento onpopstate en la carga de la página, pero Safari/Chrome do – tom
En mi caso, este evento tiene lugar después del éxito de una llamada ajax. Posiblemente debido a esto, no puedo detectar el evento por primera vez. Si hago clic en el botón atrás/adelante, funciona bien, pero no espero que mi usuario haga clic en esos botones de historial. –