@@ -3,44 +3,50 @@ import elementResizeDetectorMaker = require('element-resize-detector');
33export default class ResizeObserverLite {
44 private hasResizeObserver : boolean ;
55 private erd ?: elementResizeDetectorMaker . ElementResizeDetectorInstance ;
6- private listenedElements : HTMLElement [ ] = [ ] ;
6+ private listenedElement : Element | null = null ;
77 private rz ?: ResizeObserver ;
88
99 constructor ( private handler : ResizeObserverLiteEntriesHandler ) {
1010 this . hasResizeObserver = typeof ( < any > window ) . ResizeObserver !== 'undefined' ;
11- if ( ! this . hasResizeObserver ) {
12- this . erd = elementResizeDetectorMaker ( { strategy : 'scroll' } ) ;
13- } else {
11+ if ( this . hasResizeObserver ) {
1412 this . rz = new ResizeObserver ( ( entries ) => {
1513 this . handler ( getSize ( entries [ 0 ] . target ) ) ;
1614 } ) ;
15+ } else {
16+ this . erd = elementResizeDetectorMaker ( { strategy : 'scroll' } ) ;
1717 }
1818 }
1919
20- observe ( element : HTMLElement ) {
21- if ( ! this . hasResizeObserver ) {
22- this . erd ! . listenTo ( element , ( element ) => {
23- this . handler ( getSize ( element ) ) ;
24- } ) ;
25- this . listenedElements . push ( element ) ;
26- } else {
27- this . rz ! . observe ( element ) ;
20+ observe ( element : Element ) {
21+ if ( this . listenedElement !== element ) {
22+ if ( this . listenedElement ) {
23+ this . disconnect ( ) ;
24+ }
25+
26+ if ( this . hasResizeObserver ) {
27+ this . rz ! . observe ( element ) ;
28+ } else {
29+ this . erd ! . listenTo ( element , ( element ) => {
30+ this . handler ( getSize ( element ) ) ;
31+ } ) ;
32+ }
33+
34+ this . listenedElement = element ;
2835 }
2936 }
3037
3138 disconnect ( ) {
32- if ( ! this . hasResizeObserver ) {
33- for ( const element of this . listenedElements ) {
34- this . erd ! . uninstall ( element ) ;
35- }
36- this . listenedElements = [ ] ;
37- } else {
39+ if ( this . hasResizeObserver ) {
3840 this . rz ! . disconnect ( ) ;
41+ } else {
42+ this . erd ! . uninstall ( this . listenedElement ! ) ;
3943 }
44+
45+ this . listenedElement = null ;
4046 }
4147}
4248
43- function getSize ( element : HTMLElement ) : ResizeObserverSize {
49+ function getSize ( element : Element ) : ResizeObserverSize {
4450 return {
4551 width : getNumber ( window . getComputedStyle ( element ) [ 'width' ] ! ) ,
4652 height : getNumber ( window . getComputedStyle ( element ) [ 'height' ] ! )
@@ -63,7 +69,7 @@ export interface ResizeObserverSize {
6369
6470declare class ResizeObserver {
6571 constructor ( handler : ResizeObserverEntriesHandler ) ;
66- observe ( element : HTMLElement ) : void ;
72+ observe ( element : Element ) : void ;
6773 disconnect ( ) : void ;
6874}
6975
@@ -80,5 +86,5 @@ interface ResizeObserverEntry {
8086 top : number ;
8187 width : number ;
8288 } ;
83- target : HTMLElement ;
89+ target : Element ;
8490}
0 commit comments