@@ -35,12 +35,18 @@ interface EventListener {
35
35
( event : Event ) : void ;
36
36
}
37
37
38
+ interface EventListenerObject {
39
+ handleEvent ( event : Event ) : void ;
40
+ }
41
+
42
+ type EventListenerOrEventListenerObject = EventListener | EventListenerObject ;
43
+
38
44
/**
39
45
* @see {@link https://dom.spec.whatwg.org/#interface-eventtarget DOM Standard - 2.7. Interface EventTarget }
40
46
*/
41
47
export default class EventTarget {
42
48
#listeners: {
43
- [ type : string ] : Set < EventListener > ;
49
+ [ type : string ] : Set < EventListenerOrEventListenerObject > ;
44
50
} ;
45
51
46
52
constructor ( ) {
@@ -52,11 +58,12 @@ export default class EventTarget {
52
58
*/
53
59
addEventListener (
54
60
type : string ,
55
- listener : EventListener ,
61
+ listener : EventListenerOrEventListenerObject ,
56
62
// eslint-disable-next-line @typescript-eslint/no-unused-vars
57
63
options : boolean | AddEventListenerOptions = false
58
64
) : void {
59
- this . #listeners[ type ] = this . #listeners[ type ] ?? new Set < EventListener > ( ) ;
65
+ this . #listeners[ type ] =
66
+ this . #listeners[ type ] ?? new Set < EventListenerOrEventListenerObject > ( ) ;
60
67
61
68
if ( ! this . #listeners[ type ] . has ( listener ) ) {
62
69
this . #listeners[ type ] . add ( listener ) ;
@@ -80,7 +87,13 @@ export default class EventTarget {
80
87
81
88
if ( listeners && ! event [ internalEventSymbol ] . propagationStoped ) {
82
89
for ( const listener of listeners ) {
83
- listener . call ( this , event ) ;
90
+ if ( typeof listener === 'undefined' ) continue ;
91
+
92
+ if ( typeof listener === 'function' ) {
93
+ listener . call ( this , event ) ;
94
+ } else if ( typeof listener . handleEvent === 'function' ) {
95
+ listener . handleEvent . call ( listener , event ) ;
96
+ }
84
97
}
85
98
}
86
99
@@ -98,7 +111,7 @@ export default class EventTarget {
98
111
*/
99
112
removeEventListener (
100
113
type : string ,
101
- listener : EventListener ,
114
+ listener : EventListenerOrEventListenerObject ,
102
115
// eslint-disable-next-line @typescript-eslint/no-unused-vars
103
116
options : boolean | EventListenerOptions = false
104
117
) : void {
0 commit comments