Насколько я знаю, вы можете заметить только разницу между "мое приложение изменило хэштег" и "браузер принудительно изменил хэштег".
Вот как я это проверяю:
Когда ваш контроллер выдвигает новое состояние (открывает страницу) со своим новым хэштегом, сохраните этот новый хэштег в глобальной переменной javascript прямо перед тем, как вы установите его в window.location.hash.
Когда вы ловите событие hashchange, вы сравниваете эту свою глобальную переменную с window.location.hash.
Если глобальная переменная такая же, как новый хэш-тег, это означает, что ваше приложение просто изменило сам хэш (и открыло новую страницу).
Если глобальная переменная не установлена, это означает, что браузер форсировал навигацию.
Однако вы не можете знать, принудительно ли браузер осуществлял навигацию из-за редактирования адресной строки или из-за кнопки «назад / вперед».
Рассмотрим этот код:
// Global hashtag variable, used to compare state changes
var gCurrentHash = window.location.hash;
// Called when hashtag is changed by the browser
function onHashChange(event)
{
var hash_tag = window.location.hash;
if (hash_tag != gCurrentHash)
{
// Browser forced navigation
}
else
{
// App caused navigation
}
}
window.addEventListener('hashchange', onHashChange, false);
В вашем контроллере, прямо перед обновлением хеш-тега, наберите этот код:
gCurrentHash = window.location.hash;
Очень важно, чтобы это называлось ДО того, как вы действительно измените window.location.hashtag!
[править] Вы можете попробовать эту альтернативу:
Сохраните историю изменений хэштега в файле cookie и сравните их. По этой информации вы можете оценить события навигации назад / вперед.