2014-02-14 4 views
1

Я пытаюсь прослушать события модификации URL-адресов за пределами приложения AngularJS, которое использует стандарт ui-router. Так как Angular обновляет местоположение hash, я предполагаю, что он сгорит onhashchange событий. Однако в обоих последних версиях Chrome/Firefox на Mac это никогда не происходит.Обнаружение AngularJS onHashИзменить события извне

Все, что я вижу (в Chrome) это событие popstate выстрелил один раз для начальной загрузки:

$(window).on('hashchange', function(){ 
    console.log('hashchange'); // Never fired 
}); 
$(window).on('popstate', function(){ 
    console.log('popstate'); // Only fires on initial app load 
}); 

Есть ли другое событие я могу слушать снаружи самого углового кода?

+0

Если вы не вижу события 'hashchange', интересно, используют ли они' history.pushState' - https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history – Ian

+0

I «Я уверен, что' .pushState' должен запускать событие «popstate» – helion3

+0

Из документов MDN в событии popstate: 'Обратите внимание, что просто вызов history.pushState() или history.replaceState() не вызывает событие popstate. Событие popstate запускается только с помощью действия браузера, такого как щелчок по кнопке «Назад» (или вызов history.back() в JavaScript). Событие запускается только тогда, когда пользователь перемещается между двумя записями истории для того же документа. – Ian

ответ

0

Основываясь на доказательствах, кажется, использует pushState и нет никаких событий не срабатывает для этого метода, поэтому единственное решение я нашел это переопределить метод PushState и вызвать пользовательское событие:

// 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'); 
}); 
+0

Обратите внимание, что в старых браузерах (старый IE) они не могут использовать 'pushState', поэтому они меняют хэш и работают с событие 'hashchange' – Ian

Смежные вопросы