Skip to content

Commit cbd92d4

Browse files
committed
Added object sensor variant, but its too slow in the initialization step
1 parent 4dba9c4 commit cbd92d4

File tree

1 file changed

+58
-52
lines changed

1 file changed

+58
-52
lines changed

src/ResizeSensor.js

Lines changed: 58 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
;
77
(function() {
88

9+
var isFrameBasedUpdate = 'requestAnimationFrame' in window;
10+
var isIE = navigator.userAgent.match(/Trident/);
11+
912
/**
1013
* Class for dimension change detection.
1114
*
@@ -48,6 +51,8 @@
4851
}
4952
}
5053

54+
var elementType = Object.prototype.toString.call(element);
55+
5156
/**
5257
*
5358
* @param {HTMLElement} element
@@ -57,76 +62,77 @@
5762
if (!element.resizedAttached) {
5863
element.resizedAttached = new EventQueue();
5964
element.resizedAttached.add(resized);
65+
6066
} else if (element.resizedAttached) {
6167
element.resizedAttached.add(resized);
6268
return;
6369
}
6470

65-
element.resizeSensor = document.createElement('div');
66-
element.resizeSensor.className = 'resize-sensor';
67-
var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
68-
var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';
69-
70-
element.resizeSensor.style.cssText = style;
71-
element.resizeSensor.innerHTML =
72-
'<div class="resize-sensor-expand" style="' + style + '">' +
73-
'<div style="' + styleChild + '"></div>' +
74-
'</div>' +
75-
'<div class="resize-sensor-shrink" style="' + style + '">' +
76-
'<div style="' + styleChild + ' width: 200%; height: 200%"></div>' +
77-
'</div>';
78-
element.appendChild(element.resizeSensor);
79-
80-
if (!{fixed: 1, absolute: 1}[getComputedStyle(element, 'position')]) {
81-
element.style.position = 'relative';
71+
if (document.attachEvent) {
72+
//IE
73+
var checker = function() {
74+
if (!element.resizedAttached) {
75+
element.detachEvent('onresize', checker);
76+
return;
77+
}
78+
element.resizedAttached.call();
79+
};
80+
element.attachEvent('onresize', checker);
81+
82+
return;
8283
}
8384

84-
var expand = element.resizeSensor.childNodes[0];
85-
var expandChild = expand.childNodes[0];
86-
var shrink = element.resizeSensor.childNodes[1];
87-
var shrinkChild = shrink.childNodes[0];
88-
89-
var lastWidth, lastHeight;
90-
91-
var reset = function() {
92-
expandChild.style.width = expand.offsetWidth + 10 + 'px';
93-
expandChild.style.height = expand.offsetHeight + 10 + 'px';
94-
expand.scrollLeft = expand.scrollWidth;
95-
expand.scrollTop = expand.scrollHeight;
96-
shrink.scrollLeft = shrink.scrollWidth;
97-
shrink.scrollTop = shrink.scrollHeight;
98-
lastWidth = element.offsetWidth;
99-
lastHeight = element.offsetHeight;
100-
};
10185

102-
reset();
86+
var resizeSensor = document.createElement('object');
87+
resizeSensor.className = 'resize-sensor';
88+
resizeSensor.style =
89+
'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%;' +
90+
'transition: 0s; overflow: hidden; pointer-events: none; z-index: -1;';
91+
92+
if (getComputedStyle(element, 'position') == 'static') {
93+
element.style.position = 'relative';
94+
}
95+
96+
element.resizeSensor = resizeSensor;
10397

98+
var dirty = false;
10499
var changed = function() {
105-
if (element.resizedAttached) {
106-
element.resizedAttached.call();
100+
if (isFrameBasedUpdate) {
101+
dirty = true;
102+
} else {
103+
if (element.resizedAttached) {
104+
element.resizedAttached.call();
105+
}
107106
}
108107
};
109108

110-
var addEvent = function(el, name, cb) {
111-
if (el.attachEvent) {
112-
el.attachEvent('on' + name, cb);
113-
} else {
114-
el.addEventListener(name, cb);
109+
if (isFrameBasedUpdate) {
110+
function dirtyChecking() {
111+
if (dirty) {
112+
dirty = false;
113+
}
114+
115+
if (element.resizedAttached) {
116+
element.resizedAttached.call();
117+
}
118+
119+
window.requestAnimationFrame(dirtyChecking);
115120
}
116-
};
117121

118-
var onScroll = function() {
119-
if (element.offsetWidth != lastWidth || element.offsetHeight != lastHeight) {
120-
changed();
121-
}
122-
reset();
122+
window.requestAnimationFrame(dirtyChecking);
123+
}
124+
125+
resizeSensor.onload = function() {
126+
//this.contentDocument.defaultView.addEventListener('resize', changed);
123127
};
124128

125-
addEvent(expand, 'scroll', onScroll);
126-
addEvent(shrink, 'scroll', onScroll);
127-
}
129+
resizeSensor.type = 'text/html';
130+
if (isIE) element.appendChild(resizeSensor);
128131

129-
var elementType = Object.prototype.toString.call(element);
132+
resizeSensor.data = 'about:blank';
133+
if (!isIE) element.appendChild(resizeSensor);
134+
135+
}
130136
var isCollectionTyped = ('[object Array]' === elementType
131137
|| ('[object NodeList]' === elementType)
132138
|| ('[object HTMLCollection]' === elementType)

0 commit comments

Comments
 (0)