@@ -29,20 +29,40 @@ export function isInDOM(node: Node | null): boolean {
29
29
return node ?. isConnected ?? false ;
30
30
}
31
31
32
- export function addDisposableListener < K extends keyof GlobalEventHandlersEventMap > ( node : EventTarget , type : K , handler : ( event : GlobalEventHandlersEventMap [ K ] ) => void , useCaptureOrOptions ?: boolean | AddEventListenerOptions ) : IDisposable ;
33
- export function addDisposableListener ( node : EventTarget , type : string , handler : ( event : any ) => void , useCaptureOrOptions ?: boolean | AddEventListenerOptions ) : IDisposable ;
34
- export function addDisposableListener ( node : EventTarget , type : string , handler : ( event : any ) => void , useCaptureOrOptions ?: boolean | AddEventListenerOptions ) : IDisposable {
35
- let controller : AbortController | undefined = new AbortController ( ) ;
32
+ class DomListener implements IDisposable {
36
33
37
- const opts : AddEventListenerOptions = typeof useCaptureOrOptions === 'boolean'
38
- ? { capture : useCaptureOrOptions , signal : controller . signal }
39
- : { signal : controller . signal , ...( useCaptureOrOptions ?? { } ) } ;
34
+ private _handler : ( e : any ) => void ;
35
+ private _node : EventTarget ;
36
+ private readonly _type : string ;
37
+ private readonly _options : boolean | AddEventListenerOptions ;
40
38
41
- node . addEventListener ( type , handler , opts ) ;
42
- return toDisposable ( ( ) => {
43
- controller ?. abort ( ) ;
44
- controller = undefined ;
45
- } ) ;
39
+ constructor ( node : EventTarget , type : string , handler : ( e : any ) => void , options ?: boolean | AddEventListenerOptions ) {
40
+ this . _node = node ;
41
+ this . _type = type ;
42
+ this . _handler = handler ;
43
+ this . _options = ( options || false ) ;
44
+ this . _node . addEventListener ( this . _type , this . _handler , this . _options ) ;
45
+ }
46
+
47
+ public dispose ( ) : void {
48
+ if ( ! this . _handler ) {
49
+ // Already disposed
50
+ return ;
51
+ }
52
+
53
+ this . _node . removeEventListener ( this . _type , this . _handler , this . _options ) ;
54
+
55
+ // Prevent leakers from holding on to the dom or handler func
56
+ this . _node = null ! ;
57
+ this . _handler = null ! ;
58
+ }
59
+ }
60
+
61
+ export function addDisposableListener < K extends keyof GlobalEventHandlersEventMap > ( node : EventTarget , type : K , handler : ( event : GlobalEventHandlersEventMap [ K ] ) => void , useCapture ?: boolean ) : IDisposable ;
62
+ export function addDisposableListener ( node : EventTarget , type : string , handler : ( event : any ) => void , useCapture ?: boolean ) : IDisposable ;
63
+ export function addDisposableListener ( node : EventTarget , type : string , handler : ( event : any ) => void , options : AddEventListenerOptions ) : IDisposable ;
64
+ export function addDisposableListener ( node : EventTarget , type : string , handler : ( event : any ) => void , useCaptureOrOptions ?: boolean | AddEventListenerOptions ) : IDisposable {
65
+ return new DomListener ( node , type , handler , useCaptureOrOptions ) ;
46
66
}
47
67
48
68
export interface IAddStandardDisposableListenerSignature {
0 commit comments