@@ -15,7 +15,7 @@ const defaults: Options = {
1515 debug : false ,
1616} ;
1717
18- /** Hook into beforeunload */
18+ /** Hooked into beforeunload? */
1919let hookedIntoBeforeUnload = false ;
2020
2121/**
@@ -44,12 +44,7 @@ export default function restoreScroll(
4444 window . addEventListener ( "beforeunload" , storeAll ) ;
4545 }
4646
47- register ( element , settings ) ;
48-
49- /**
50- * Return a destroy function
51- */
52- return { destroy : ( ) => unregister ( element ) } ;
47+ return register ( element , settings ) ;
5348}
5449
5550/**
@@ -61,36 +56,20 @@ function register(element: ScrollContainer, settings: Settings) {
6156 /** Mark the element */
6257 element . setAttribute ( "data-restore-scroll" , "" ) ;
6358
59+ /** First time? Then attach the scroll handler further down */
60+ const isFirstTime = ! element . __restore_scroll ;
61+
6462 /** Create and store the state in the element */
6563 element . __restore_scroll ??= {
6664 selector : createContainerSelector ( element , logger ) ,
67- onScroll : debounce ( ( ) => store ( element , settings ) , 150 ) ,
6865 } ;
6966
7067 /** Always restore when called */
7168 restore ( element , settings ) ;
7269
73- const eventTarget = isRootElement ( element ) ? window : element ;
74-
75- /** Allow for repeated calls to `register` (interesting for e.g. the window) */
76- eventTarget . removeEventListener ( "scroll" , element . __restore_scroll . onScroll ) ;
77- eventTarget . addEventListener ( "scroll" , element . __restore_scroll . onScroll , {
78- passive : true ,
79- } ) ;
80- }
81-
82- /**
83- * Unregister an element from scroll restoration
84- */
85- function unregister ( element : ScrollContainer ) {
86- if ( ! element . __restore_scroll ) return ;
87-
88- /** Unmark the element */
89- element . removeAttribute ( "data-restore-scroll" ) ;
90-
91- const eventTarget = isRootElement ( element ) ? window : element ;
92-
93- eventTarget . removeEventListener ( "scroll" , element . __restore_scroll . onScroll ) ;
94-
95- element . __restore_scroll = undefined ;
70+ if ( isFirstTime ) {
71+ const eventTarget = isRootElement ( element ) ? window : element ;
72+ const onScroll = debounce ( ( ) => store ( element , settings ) , 150 ) ;
73+ eventTarget . addEventListener ( "scroll" , onScroll , { passive : true } ) ;
74+ }
9675}
0 commit comments