File tree 6 files changed +49
-15
lines changed
6 files changed +49
-15
lines changed Original file line number Diff line number Diff line change 1
1
import { isMobile } from '../util/env'
2
2
import { body , on } from '../util/dom'
3
3
import * as sidebar from './sidebar'
4
- import { scrollIntoView } from './scroll'
4
+ import { scrollIntoView , scroll2Top } from './scroll'
5
5
6
6
export function eventMixin ( proto ) {
7
- proto . $resetEvents = function ( ) {
8
- scrollIntoView ( this . route . path , this . route . query . id )
7
+ proto . $resetEvents = function ( source ) {
8
+ const { auto2top} = this . config
9
+
10
+ ; ( ( ) => {
11
+ // Rely on the browser's scroll auto-restoration when going back or forward
12
+ if ( source === 'history' ) {
13
+ return
14
+ }
15
+ // Scroll to ID if specified
16
+ if ( this . route . query . id ) {
17
+ scrollIntoView ( this . route . path , this . route . query . id )
18
+ }
19
+ // Scroll to top if a link was clicked and auto2top is enabled
20
+ if ( source === 'navigate' ) {
21
+ auto2top && scroll2Top ( auto2top )
22
+ }
23
+ } ) ( ) ;
9
24
10
25
if ( this . config . loadNavbar ) {
11
26
sidebar . getAndActive ( this . router , 'nav' )
Original file line number Diff line number Diff line change @@ -144,7 +144,7 @@ export function fetchMixin(proto) {
144
144
}
145
145
}
146
146
147
- proto . $fetch = function ( cb = noop ) {
147
+ proto . $fetch = function ( cb = noop , $resetEvents = this . $resetEvents . bind ( this ) ) {
148
148
const done = ( ) => {
149
149
callHook ( this , 'doneEach' )
150
150
cb ( )
@@ -156,7 +156,7 @@ export function fetchMixin(proto) {
156
156
done ( )
157
157
} else {
158
158
this . _fetch ( ( ) => {
159
- this . $resetEvents ( )
159
+ $resetEvents ( ) ;
160
160
done ( )
161
161
} )
162
162
}
Original file line number Diff line number Diff line change @@ -8,7 +8,7 @@ import {getAndActive, sticky} from '../event/sidebar'
8
8
import { getPath , isAbsolutePath } from '../router/util'
9
9
import { isMobile , inBrowser } from '../util/env'
10
10
import { isPrimitive } from '../util/core'
11
- import { scrollActiveSidebar , scroll2Top } from '../event/scroll'
11
+ import { scrollActiveSidebar } from '../event/scroll'
12
12
import { prerenderEmbed } from './embed'
13
13
14
14
function executeScript ( ) {
@@ -107,7 +107,7 @@ export function renderMixin(proto) {
107
107
}
108
108
109
109
proto . _bindEventOnRendered = function ( activeEl ) {
110
- const { autoHeader, auto2top } = this . config
110
+ const { autoHeader} = this . config
111
111
112
112
scrollActiveSidebar ( this . router )
113
113
@@ -120,8 +120,6 @@ export function renderMixin(proto) {
120
120
dom . before ( main , h1 )
121
121
}
122
122
}
123
-
124
- auto2top && scroll2Top ( auto2top )
125
123
}
126
124
127
125
proto . _renderNav = function ( text ) {
Original file line number Diff line number Diff line change @@ -30,7 +30,25 @@ export class HashHistory extends History {
30
30
}
31
31
32
32
onchange ( cb = noop ) {
33
- on ( 'hashchange' , cb )
33
+ // The hashchange event does not tell us if it originated from
34
+ // a clicked link or by moving back/forward in the history;
35
+ // therefore we set a `navigating` flag when a link is clicked
36
+ // to be able to tell these two scenarios apart
37
+ let navigating = false
38
+
39
+ on ( 'click' , e => {
40
+ const el = e . target . tagName === 'A' ? e . target : e . target . parentNode
41
+
42
+ if ( el . tagName === 'A' && ! / _ b l a n k / . test ( el . target ) ) {
43
+ navigating = true
44
+ }
45
+ } )
46
+
47
+ on ( 'hashchange' , e => {
48
+ const source = navigating ? 'navigate' : 'history'
49
+ navigating = false
50
+ cb ( { event : e , source} )
51
+ } )
34
52
}
35
53
36
54
normalize ( ) {
Original file line number Diff line number Diff line change @@ -28,11 +28,13 @@ export class HTML5History extends History {
28
28
e . preventDefault ( )
29
29
const url = el . href
30
30
window . history . pushState ( { key : url } , '' , url )
31
- cb ( )
31
+ cb ( { event : e , source : 'navigate' } )
32
32
}
33
33
} )
34
34
35
- on ( 'popstate' , cb )
35
+ on ( 'popstate' , e => {
36
+ cb ( { event : e , source : 'history' } )
37
+ } )
36
38
}
37
39
38
40
/**
Original file line number Diff line number Diff line change 1
1
import { HashHistory } from './history/hash'
2
2
import { HTML5History } from './history/html5'
3
3
import { supportsPushState } from '../util/env'
4
+ import { noop } from '../util/core'
4
5
import * as dom from '../util/dom'
5
6
6
7
export function routerMixin ( proto ) {
@@ -30,16 +31,16 @@ export function initRouter(vm) {
30
31
updateRender ( vm )
31
32
lastRoute = vm . route
32
33
33
- router . onchange ( _ => {
34
+ router . onchange ( params => {
34
35
updateRender ( vm )
35
36
vm . _updateRender ( )
36
37
37
38
if ( lastRoute . path === vm . route . path ) {
38
- vm . $resetEvents ( )
39
+ vm . $resetEvents ( params . source )
39
40
return
40
41
}
41
42
42
- vm . $fetch ( )
43
+ vm . $fetch ( noop , vm . $resetEvents . bind ( vm , params . source ) )
43
44
lastRoute = vm . route
44
45
} )
45
46
}
You can’t perform that action at this time.
0 commit comments