Событие onhashchange
есть, но его нельзя отменить надежно во всех браузерах, чтобы предотвратить прокрутку. Лучшее решение - записать положение прокрутки перед изменением местоположения хэша и затем сбросить его. Например, следующий код будет ловить щелчок по любой ссылке - которая не останавливает распространение - со значением href #
и предотвращает вертикальную прокрутку страницы:
document.onclick = function (evt) {
var tgt = (evt && evt.target) || event.srcElement,
scr = document.body.scrollTop;
if (tgt.tagName == "A" && tgt.href.slice(-1) == "#") {
window.location.href = "#";
document.body.scrollTop = scr;
return false;
}
}
Если вы меняете хеш через скрипт, вы можете использовать следующий код:
var scr = document.body.scrollTop;
window.location.href = '#';
document.body.scrollTop = scr;
Любой из этих методов можно настроить, чтобы избежать прокрутки отдельных элементов или горизонтальной прокрутки страницы. Обратите внимание, что вы можете удалить весь хэш (включая #
), не вызывая навигацию или прокрутку в современных браузерах, вызывая функции pushState
или replaceState
.