Все ответы выше нарушают ожидаемое поведение браузера. Большинство людей хотят, чтобы они прокручивались вверх, если это «новая» страница, но возвращались на предыдущую позицию, если вы попадаете туда с помощью кнопки «Назад» (или «Вперед»).
Если вы предполагаете режим HTML5, это оказывается легким (хотя я уверен, что некоторые яркие люди могут придумать, как сделать это более элегантным!):
// Called when browser back/forward used
window.onpopstate = function() {
$timeout.cancel(doc_scrolling);
};
// Called after ui-router changes state (but sadly before onpopstate)
$scope.$on('$stateChangeSuccess', function() {
doc_scrolling = $timeout( scroll_top, 50 );
// Moves entire browser window to top
scroll_top = function() {
document.body.scrollTop = document.documentElement.scrollTop = 0;
}
Это работает так, что маршрутизатор предполагает прокрутку вверх, но немного задерживается, чтобы дать браузеру возможность завершить работу. Если браузер затем уведомляет нас о том, что изменение произошло из-за навигации назад / вперед, он отменяет тайм-аут, и прокрутка никогда не происходит.
Я использовал необработанные document
команды для прокрутки, потому что я хочу перейти ко всей верхней части окна. Если вы просто хотите, чтобы ваш ui-view
прокручивал, то установите, autoscroll="my_var"
где вы управляете, my_var
используя методы выше. Но я думаю, что большинство людей захотят прокрутить всю страницу, если вы переходите на страницу как «новую».
Выше использует Ui-маршрутизатор, хотя вы можете использовать нг-маршрут вместо путем замены $routeChangeSuccess
на $stateChangeSuccess
.