Не самый чистый подход, но вы можете установить флаг перед изменением хэша через JS. Я обернул это в функцию - windowLocation()
.
function windowLocation(url) {
window.jsHashFlag = true;
window.newURL = url;
window.location = url;
}
function hashChange(e) {
if(window.jsHashFlag && e.newURL == window.newURL) {
// hash changed programmatically
window.jsHashFlag = false;
window.newURL = '';
}
else {
// hash changed manually
// do something
}
}
window.jsHashFlag = false;
window.onhashchange = hashChange;
// ...
windowLocation('http://www.site.com/foo.html#newHash');