@@ -3,44 +3,50 @@ import elementResizeDetectorMaker = require('element-resize-detector');
3
3
export default class ResizeObserverLite {
4
4
private hasResizeObserver : boolean ;
5
5
private erd ?: elementResizeDetectorMaker . ElementResizeDetectorInstance ;
6
- private listenedElements : HTMLElement [ ] = [ ] ;
6
+ private listenedElement : Element | null = null ;
7
7
private rz ?: ResizeObserver ;
8
8
9
9
constructor ( private handler : ResizeObserverLiteEntriesHandler ) {
10
10
this . hasResizeObserver = typeof ( < any > window ) . ResizeObserver !== 'undefined' ;
11
- if ( ! this . hasResizeObserver ) {
12
- this . erd = elementResizeDetectorMaker ( { strategy : 'scroll' } ) ;
13
- } else {
11
+ if ( this . hasResizeObserver ) {
14
12
this . rz = new ResizeObserver ( ( entries ) => {
15
13
this . handler ( getSize ( entries [ 0 ] . target ) ) ;
16
14
} ) ;
15
+ } else {
16
+ this . erd = elementResizeDetectorMaker ( { strategy : 'scroll' } ) ;
17
17
}
18
18
}
19
19
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 ;
28
35
}
29
36
}
30
37
31
38
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 ) {
38
40
this . rz ! . disconnect ( ) ;
41
+ } else {
42
+ this . erd ! . uninstall ( this . listenedElement ! ) ;
39
43
}
44
+
45
+ this . listenedElement = null ;
40
46
}
41
47
}
42
48
43
- function getSize ( element : HTMLElement ) : ResizeObserverSize {
49
+ function getSize ( element : Element ) : ResizeObserverSize {
44
50
return {
45
51
width : getNumber ( window . getComputedStyle ( element ) [ 'width' ] ! ) ,
46
52
height : getNumber ( window . getComputedStyle ( element ) [ 'height' ] ! )
@@ -63,7 +69,7 @@ export interface ResizeObserverSize {
63
69
64
70
declare class ResizeObserver {
65
71
constructor ( handler : ResizeObserverEntriesHandler ) ;
66
- observe ( element : HTMLElement ) : void ;
72
+ observe ( element : Element ) : void ;
67
73
disconnect ( ) : void ;
68
74
}
69
75
@@ -80,5 +86,5 @@ interface ResizeObserverEntry {
80
86
top : number ;
81
87
width : number ;
82
88
} ;
83
- target : HTMLElement ;
89
+ target : Element ;
84
90
}
0 commit comments