Skip to content

Commit 12be3cc

Browse files
committed
Initial code
1 parent a8ca04d commit 12be3cc

File tree

7 files changed

+176
-1
lines changed

7 files changed

+176
-1
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,6 @@ jspm_packages
3535

3636
# Optional REPL history
3737
.node_repl_history
38+
39+
# TypeScript generated code
40+
lib

.nvmrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6.9

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
# resize-observer-lite
2-
A ResizeObserver polyfill that only works for elements that can contain child elements.
2+
3+
A ResizeObserver polyfill that has limited functionality of ResizeObserver.

package.json

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"name": "resize-observer-lite",
3+
"version": "0.0.0",
4+
"description": "A ResizeObserver polyfill that has limited functionality of ResizeObserver.",
5+
"repository": {
6+
"type": "git",
7+
"url": "git+https://github.com/d6u/resize-observer-lite.git"
8+
},
9+
"keywords": [],
10+
"author": "Daiwei Lu <[email protected]> (http://daiwei.lu/)",
11+
"license": "MIT",
12+
"bugs": {
13+
"url": "https://github.com/d6u/resize-observer-lite/issues"
14+
},
15+
"homepage": "https://github.com/d6u/resize-observer-lite#readme",
16+
"main": "lib/index.js",
17+
"typings": "lib/index.d.ts",
18+
"files": [
19+
"lib"
20+
],
21+
"dependencies": {
22+
"element-resize-detector": "1.1.9"
23+
},
24+
"devDependencies": {
25+
"typescript": "2.0.3"
26+
},
27+
"scripts": {
28+
"clean": "rm -rf lib",
29+
"build": "tsc",
30+
"pretest": "npm run clean && npm run build",
31+
"test": "echo \"Error: no test specified\" && exit 1",
32+
"preversion": "npm run clean && npm run build"
33+
}
34+
}

src/index.ts

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import elementResizeDetectorMaker = require('element-resize-detector');
2+
3+
export default class ResizeObserverLite {
4+
private hasResizeObserver: boolean;
5+
private erd?: elementResizeDetectorMaker.ElementResizeDetectorInstance;
6+
private listenedElements: HTMLElement[] = [];
7+
private rz?: ResizeObserver;
8+
9+
constructor(private handler: ResizeObserverLiteEntriesHandler) {
10+
this.hasResizeObserver = typeof (<any> window).ResizeObserver !== 'undefined';
11+
if (!this.hasResizeObserver) {
12+
this.erd = elementResizeDetectorMaker({strategy: 'scroll'});
13+
} else {
14+
this.rz = new ResizeObserver((entries) => {
15+
this.handler(getSize(entries[0].target));
16+
});
17+
}
18+
}
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);
28+
}
29+
}
30+
31+
disconnect() {
32+
if (!this.hasResizeObserver) {
33+
for (const element of this.listenedElements) {
34+
this.erd!.uninstall(element);
35+
}
36+
this.listenedElements = [];
37+
} else {
38+
this.rz!.disconnect();
39+
}
40+
}
41+
}
42+
43+
function getSize(element: HTMLElement): ResizeObserverSize {
44+
return {
45+
width: getNumber(window.getComputedStyle(element)['width']!),
46+
height: getNumber(window.getComputedStyle(element)['height']!)
47+
};
48+
}
49+
50+
function getNumber(str: string): number {
51+
const m = /^([0-9\.]+)px$/.exec(str);
52+
return m ? parseFloat(m[1]) : 0;
53+
}
54+
55+
export interface ResizeObserverLiteEntriesHandler {
56+
(size: ResizeObserverSize): void;
57+
}
58+
59+
export interface ResizeObserverSize {
60+
width: number;
61+
height: number;
62+
}
63+
64+
declare class ResizeObserver {
65+
constructor(handler: ResizeObserverEntriesHandler);
66+
observe(element: HTMLElement): void;
67+
disconnect(): void;
68+
}
69+
70+
interface ResizeObserverEntriesHandler {
71+
(entries: ResizeObserverEntry[]): void;
72+
}
73+
74+
interface ResizeObserverEntry {
75+
contentRect: {
76+
bottom: number;
77+
height: number;
78+
left: number;
79+
right: number;
80+
top: number;
81+
width: number;
82+
};
83+
target: HTMLElement;
84+
}

tsconfig.json

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"compileOnSave": false,
3+
"enableAutoDiscovery": false,
4+
"compilerOptions": {
5+
"declaration": true,
6+
"declarationDir": "lib",
7+
"module": "commonjs",
8+
"noImplicitAny": true,
9+
"noImplicitThis": true,
10+
"noUnusedLocals": true,
11+
"noUnusedParameters": true,
12+
"noResolve": true,
13+
"outDir": "lib",
14+
"pretty": true,
15+
"sourceMap": true,
16+
"target": "es5",
17+
"moduleResolution": "node",
18+
"noImplicitReturns": true,
19+
"noFallthroughCasesInSwitch": true,
20+
"allowUnreachableCode": false,
21+
"forceConsistentCasingInFileNames": true,
22+
"strictNullChecks": true
23+
},
24+
"include": [
25+
"typings-custom/*.d.ts",
26+
"src/*.ts"
27+
]
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
declare module 'element-resize-detector' {
2+
namespace elementResizeDetectorMaker {
3+
interface ElementResizeDetectorMaker {
4+
(opts: ElementResizeDetectorMakerOptions): ElementResizeDetectorInstance;
5+
}
6+
7+
interface ElementResizeDetectorMakerOptions {
8+
strategy: 'scroll';
9+
}
10+
11+
interface ElementResizeDetectorInstance {
12+
listenTo(element: HTMLElement, handler: ElementResizeDetectorEventHandler): void;
13+
uninstall(element: HTMLElement): void;
14+
}
15+
16+
interface ElementResizeDetectorEventHandler {
17+
(element: HTMLElement): void;
18+
}
19+
}
20+
21+
const elementResizeDetectorMaker: elementResizeDetectorMaker.ElementResizeDetectorMaker;
22+
23+
export = elementResizeDetectorMaker;
24+
}

0 commit comments

Comments
 (0)