Быстрый грязный хак, но это то, на что вы можете опираться:
var curScroll = prevScroll = $(window).scrollTop()
$(window).bind('scroll', function() {
prevScroll = curScroll
curScroll = $(this).scrollTop()
}).bind('hashchange', function() {
$(this).scrollTop(prevScroll)
})
Я использовал здесь jQuery, чтобы он работал во всех браузерах и не затрагивал обработчики onhashchange и прокрутки страницы. Одна проблема, которую я обнаружил, заключается в том, что если дважды щелкнуть один и тот же хэштег, он все равно прокручивается.
UPD. Я только что нашел лучшее решение:
$('a').live('click', function() {
if (this.href.split('#')[0] == location.href.split('#')[0]) {
var scrollTop = $(window).scrollTop()
setTimeout(function() {
$(window).scrollTop(scrollTop)
}, 0)
}
})