Detectar eventos AngularJS onHashChange externamente
Frecuentes
Visto 1,231 equipos
3
Estoy tratando de escuchar eventos de modificación de URL fuera de una aplicación AngularJS que usa el estándar ui-router
. Dado que Angular actualiza la ubicación hachís, supongo que dispararía onhashchange
eventos. Sin embargo, en los últimos Chrome/Firefox en Mac, nunca lo hace.
Todo lo que veo (en Chrome) es el evento popstate activado una vez para la carga inicial:
$(window).on('hashchange', function(){
console.log('hashchange'); // Never fired
});
$(window).on('popstate', function(){
console.log('popstate'); // Only fires on initial app load
});
¿Hay algún evento diferente que pueda escuchar fuera del código Angular en sí?
1 Respuestas
1
Según la evidencia, parece estar usando pushState
y no hay eventos activados para ese método, por lo que la única solución que encontré es anular el método pushState y activar un evento personalizado:
// Custom pushState event
(function(history){
var pushState = history.pushState;
history.pushState = function(state){
$(window).trigger('pushState');
return pushState.apply(history, arguments);
};
})(window.history);
$(window).on('pushState', function(event){
console.log('hashchange');
});
Respondido 14 Feb 14, 01:02
Tenga en cuenta que en navegadores más antiguos (antiguo IE), no pueden usar pushState
, por lo que cambian el hash y trabajan con el hashchange
evento - Ian
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas javascript angularjs or haz tu propia pregunta.
Si no ve la
hashchange
evento, me pregunto si están usandohistory.pushState
- desarrollador.mozilla.org/en-US/docs/Web/Guide/API/DOM/… - IanEstoy bastante seguro de que
.pushState
debería estar desencadenando elpopstate
evento - helion3De los documentos de MDN sobre el evento popstate:
Note that just calling history.pushState() or history.replaceState() won't trigger a popstate event. The popstate event is only triggered by doing a browser action such as a clicking on the back button (or calling history.back() in JavaScript). And the event is only triggered when the user navigates between two history entries for the same document.
- Ian