1
+ import { debounce } from "./misc" ;
2
+
1
3
/** Options for the `onSelector()` method of {@linkcode SelectorObserver} */
2
4
export type SelectorListenerOptions < TElem extends Element = HTMLElement > = SelectorOptionsOne < TElem > | SelectorOptionsAll < TElem > ;
3
5
@@ -20,11 +22,18 @@ type SelectorOptionsCommon = {
20
22
continuous ?: boolean ;
21
23
/** Whether to debounce the listener to reduce calls to `querySelector` or `querySelectorAll` - set undefined or <=0 to disable (default) */
22
24
debounce ?: number ;
25
+ /** Whether to call the function at the very first call ("rising" edge) or the very last call ("falling" edge, default) */
26
+ debounceEdge ?: "rising" | "falling" ;
23
27
} ;
24
28
25
29
export type SelectorObserverOptions = {
26
30
/** If set, applies this debounce in milliseconds to all listeners that don't have their own debounce set */
27
31
defaultDebounce ?: number ;
32
+ /**
33
+ * If set, applies this debounce edge to all listeners that don't have their own set.
34
+ * Edge = Whether to call the function at the very first call ("rising" edge) or the very last call ("falling" edge, default)
35
+ */
36
+ defaultDebounceEdge ?: "rising" | "falling" ;
28
37
/** Whether to disable the observer when no listeners are present - default is true */
29
38
disableOnNoListeners ?: boolean ;
30
39
/** Whether to ensure the observer is enabled when a new listener is added - default is true */
@@ -63,6 +72,7 @@ export class SelectorObserver {
63
72
64
73
const {
65
74
defaultDebounce,
75
+ defaultDebounceEdge,
66
76
disableOnNoListeners,
67
77
enableOnAddListener,
68
78
...observerOptions
@@ -76,6 +86,7 @@ export class SelectorObserver {
76
86
77
87
this . customOptions = {
78
88
defaultDebounce : defaultDebounce ?? 0 ,
89
+ defaultDebounceEdge : defaultDebounceEdge ?? "rising" ,
79
90
disableOnNoListeners : disableOnNoListeners ?? false ,
80
91
enableOnAddListener : enableOnAddListener ?? true ,
81
92
} ;
@@ -123,12 +134,8 @@ export class SelectorObserver {
123
134
}
124
135
}
125
136
126
- private debounce < TArgs > ( func : ( ...args : TArgs [ ] ) => void , time : number ) : ( ...args : TArgs [ ] ) => void {
127
- let timeout : number ;
128
- return function ( ...args : TArgs [ ] ) {
129
- clearTimeout ( timeout ) ;
130
- timeout = setTimeout ( ( ) => func . apply ( this , args ) , time ) as unknown as number ;
131
- } ;
137
+ private debounce < TArgs > ( func : ( ...args : TArgs [ ] ) => void , time : number , edge : "falling" | "rising" = "falling" ) : ( ...args : TArgs [ ] ) => void {
138
+ return debounce ( func , time , edge ) ;
132
139
}
133
140
134
141
/**
@@ -146,6 +153,7 @@ export class SelectorObserver {
146
153
options . listener = this . debounce (
147
154
options . listener as ( ( arg : NodeListOf < Element > | Element ) => void ) ,
148
155
( options . debounce || this . customOptions . defaultDebounce ) ! ,
156
+ ( options . debounceEdge || this . customOptions . defaultDebounceEdge ) ,
149
157
) ;
150
158
}
151
159
if ( this . listenerMap . has ( selector ) )
0 commit comments