@@ -2,11 +2,23 @@ import { IEventEmitter, IEventEmitterOfT } from '@src/EventEmitter';
2
2
import { IContainer } from '@src/platform/IContainer' ;
3
3
import { IMouseEventArgs } from '@src/platform/IMouseEventArgs' ;
4
4
import { BrowserMouseEventArgs } from '@src/platform/javascript/BrowserMouseEventArgs' ;
5
+ import { Lazy } from '@src/util/Lazy' ;
5
6
6
7
/**
7
8
* @target web
8
9
*/
9
10
export class HtmlElementContainer implements IContainer {
11
+ private static resizeObserver : Lazy < ResizeObserver > = new Lazy < ResizeObserver > ( ( ) => new ResizeObserver ( ( entries ) => {
12
+ for ( const e of entries ) {
13
+ let evt = new CustomEvent ( 'resize' , {
14
+ detail : e
15
+ } ) ;
16
+ e . target . dispatchEvent ( evt ) ;
17
+ }
18
+ } ) ) ;
19
+
20
+ private _resizeListeners : number = 0 ;
21
+
10
22
public get top ( ) : number {
11
23
return parseFloat ( this . element . style . top ) ;
12
24
}
@@ -113,21 +125,29 @@ export class HtmlElementContainer implements IContainer {
113
125
}
114
126
} ;
115
127
116
- this . scroll = {
117
- on : ( value : any ) => {
118
- window . addEventListener ( 'scroll' , value , true ) ;
119
- } ,
120
- off : ( value : any ) => {
121
- window . removeEventListener ( 'scroll' , value , true ) ;
122
- }
123
- } ;
124
-
125
128
this . resize = {
126
129
on : ( value : any ) => {
127
- window . addEventListener ( 'resize' , value , true ) ;
130
+ if ( this . _resizeListeners === 0 ) {
131
+ HtmlElementContainer . resizeObserver . value . observe ( this . element ) ;
132
+ }
133
+ this . element . addEventListener (
134
+ 'resize' ,
135
+ value ,
136
+ true
137
+ ) ;
138
+ this . _resizeListeners ++ ;
128
139
} ,
129
140
off : ( value : any ) => {
130
- window . removeEventListener ( 'resize' , value , true ) ;
141
+ this . element . removeEventListener (
142
+ 'resize' ,
143
+ value ,
144
+ true
145
+ ) ;
146
+ this . _resizeListeners -- ;
147
+ if ( this . _resizeListeners <= 0 ) {
148
+ this . _resizeListeners = 0 ;
149
+ HtmlElementContainer . resizeObserver . value . unobserve ( this . element ) ;
150
+ }
131
151
}
132
152
} ;
133
153
}
@@ -142,11 +162,6 @@ export class HtmlElementContainer implements IContainer {
142
162
this . element . style . left = x + 'px' ;
143
163
}
144
164
145
- /**
146
- * This event occurs when a scroll on the control happened.
147
- */
148
- public scroll : IEventEmitter ;
149
-
150
165
/**
151
166
* This event occurs when the control was resized.
152
167
*/
0 commit comments