Событие hashchange происходит асинхронно, hashChangeEnabled уже сбрасывается в true, когда код в обработчике событий выполняется.Вы должны сбросить ваш hashChangeEnabled в событии hashchange:
if(that.hashChangeEnabled == true){
stateObj = event.getState()
that.stateChangedHandler(stateObj);
}
else {
that.hashChangeEnabled = true;
}
В вашей функции updateURL вы можете проверить, изменился ли хэш:
if (hash !== $.param.fragment()) {
this.hashChangeEnabled = false;
$.bbq.pushState(hash);
}
Или сбросить hashChangeEnabled с помощью setTimeout (дождитесьсобытие hashchange, если срабатывает изменение hash)
this.hashChangeEnabled = false;
$.bbq.pushState(hash);
setTimeout(function() { this.hashChangeEnabled = true; }, 500);