Усі наведені вище відповіді порушують очікувану поведінку браузера. Більшість людей хоче те, що буде прокручуватися до верху, якщо це "нова" сторінка, але поверніться до попереднього положення, якщо ви потрапите туди за допомогою кнопки "Назад" (або "Вперед").
Якщо ви припускаєте режим 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-роутер, хоча ви можете замість цього використовувати ng-route, заміняючи $routeChangeSuccess
на $stateChangeSuccess
.