используйте шо-то типа window.onhashchange=setBlock.
А чтоб не прыгало при клике и смене hash - можно блоки с соответствующими id делать с display:none и либо показывать их по hashcange, либо ставить их перед нужными блоками, а доступ к блоку получать, например, как querySelector(location.hash'+*'). Или можно попробовать поставить перед блоком с нужным id якорь с таким же name и display:none, хотя я не уверен, что прокрутка не будет прыгать к блоку с таким id, так как якорь хоть и первый, но скрытый.. В общем, можно поэксперементировать)