Skip to content

Commit 1e4143f

Browse files
author
Daiwei Lu
committed
observe method now will replace observed element
1 parent 54ede07 commit 1e4143f

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

src/index.ts

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,50 @@ import elementResizeDetectorMaker = require('element-resize-detector');
33
export 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

6470
declare 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
}

typings-custom/element-resize-detector.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ declare module 'element-resize-detector' {
99
}
1010

1111
interface ElementResizeDetectorInstance {
12-
listenTo(element: HTMLElement, handler: ElementResizeDetectorEventHandler): void;
13-
uninstall(element: HTMLElement): void;
12+
listenTo(element: Element, handler: ElementResizeDetectorEventHandler): void;
13+
uninstall(element: Element): void;
1414
}
1515

1616
interface ElementResizeDetectorEventHandler {
17-
(element: HTMLElement): void;
17+
(element: Element): void;
1818
}
1919
}
2020

0 commit comments

Comments
 (0)