@@ -13,7 +13,8 @@ export function setupNativeEvents(
13
13
return ( router : RouterContext ) => {
14
14
const basePath = router . base . path ( ) ;
15
15
const navigateFromRoute = router . navigatorFactory ( router . base ) ;
16
- let preloadTimeout : Record < string , number > = { } ;
16
+ let preloadTimeout : string ;
17
+ let lastElement : Node | null ;
17
18
18
19
function isSvg < T extends SVGElement > ( el : T | HTMLElement ) : el is T {
19
20
return el . namespaceURI === "http://www.w3.org/2000/svg" ;
@@ -76,38 +77,21 @@ export function setupNativeEvents(
76
77
const res = handleAnchor ( evt as MouseEvent ) ;
77
78
if ( ! res ) return ;
78
79
const [ a , url ] = res ;
79
- if ( typeof transformUrl === "function" ) {
80
- url . pathname = transformUrl ( url . pathname ) ;
81
- }
82
- if ( ! preloadTimeout [ url . pathname ] )
83
- router . preloadRoute ( url , { preloadData : a . getAttribute ( "preload" ) !== "false" } ) ;
80
+ transformUrl && ( url . pathname = transformUrl ( url . pathname ) ) ;
81
+ router . preloadRoute ( url , { preloadData : a . getAttribute ( "preload" ) !== "false" } ) ;
84
82
}
85
83
86
- function handleAnchorIn ( evt : Event ) {
84
+ function handleAnchorMove ( evt : Event ) {
85
+ clearTimeout ( preloadTimeout )
87
86
const res = handleAnchor ( evt as MouseEvent ) ;
88
- if ( ! res ) return ;
87
+ if ( ! res ) return lastElement = null ;
89
88
const [ a , url ] = res ;
90
- if ( typeof transformUrl === "function" ) {
91
- url . pathname = transformUrl ( url . pathname ) ;
92
- }
93
- if ( preloadTimeout [ url . pathname ] ) return ;
94
- preloadTimeout [ url . pathname ] = setTimeout ( ( ) => {
89
+ if ( lastElement === a ) return ;
90
+ transformUrl && ( url . pathname = transformUrl ( url . pathname ) ) ;
91
+ preloadTimeout = setTimeout ( ( ) => {
95
92
router . preloadRoute ( url , { preloadData : a . getAttribute ( "preload" ) !== "false" } ) ;
96
- delete preloadTimeout [ url . pathname ] ;
97
- } , 200 ) as any ;
98
- }
99
-
100
- function handleAnchorOut ( evt : Event ) {
101
- const res = handleAnchor ( evt as MouseEvent ) ;
102
- if ( ! res ) return ;
103
- const [ , url ] = res ;
104
- if ( typeof transformUrl === "function" ) {
105
- url . pathname = transformUrl ( url . pathname ) ;
106
- }
107
- if ( preloadTimeout [ url . pathname ] ) {
108
- clearTimeout ( preloadTimeout [ url . pathname ] ) ;
109
- delete preloadTimeout [ url . pathname ] ;
110
- }
93
+ lastElement = a ;
94
+ } , 20 ) as any ;
111
95
}
112
96
113
97
function handleFormSubmit ( evt : SubmitEvent ) {
@@ -142,17 +126,15 @@ export function setupNativeEvents(
142
126
delegateEvents ( [ "click" , "submit" ] ) ;
143
127
document . addEventListener ( "click" , handleAnchorClick ) ;
144
128
if ( preload ) {
145
- document . addEventListener ( "mouseover" , handleAnchorIn ) ;
146
- document . addEventListener ( "mouseout" , handleAnchorOut ) ;
147
- document . addEventListener ( "focusin" , handleAnchorPreload ) ;
148
- document . addEventListener ( "touchstart" , handleAnchorPreload ) ;
129
+ document . addEventListener ( "mousemove" , handleAnchorMove , { passive : true } ) ;
130
+ document . addEventListener ( "focusin" , handleAnchorPreload , { passive : true } ) ;
131
+ document . addEventListener ( "touchstart" , handleAnchorPreload , { passive : true } ) ;
149
132
}
150
133
document . addEventListener ( "submit" , handleFormSubmit ) ;
151
134
onCleanup ( ( ) => {
152
135
document . removeEventListener ( "click" , handleAnchorClick ) ;
153
136
if ( preload ) {
154
- document . removeEventListener ( "mouseover" , handleAnchorIn ) ;
155
- document . removeEventListener ( "mouseout" , handleAnchorOut ) ;
137
+ document . removeEventListener ( "mousemove" , handleAnchorMove ) ;
156
138
document . removeEventListener ( "focusin" , handleAnchorPreload ) ;
157
139
document . removeEventListener ( "touchstart" , handleAnchorPreload ) ;
158
140
}
0 commit comments