|
83 | 83 | * @constructor
|
84 | 84 | */
|
85 | 85 | var ResizeSensor = function(element, callback) {
|
86 |
| - |
87 |
| - var observer; |
88 |
| - |
89 | 86 | /**
|
90 | 87 | *
|
91 | 88 | * @constructor
|
|
156 | 153 | var expand = element.resizeSensor.childNodes[0];
|
157 | 154 | var expandChild = expand.childNodes[0];
|
158 | 155 | var shrink = element.resizeSensor.childNodes[1];
|
159 |
| - |
160 |
| - var dirty, rafId; |
| 156 | + var dirty, rafId, newWidth, newHeight; |
161 | 157 | var size = getElementSize(element);
|
162 | 158 | var lastWidth = size.width;
|
163 | 159 | var lastHeight = size.height;
|
164 | 160 | var initialHiddenCheck = true, resetRAF_id;
|
165 | 161 |
|
| 162 | + var reset = function() { |
| 163 | + //set display to block, necessary otherwise hidden elements won't ever work |
| 164 | + var invisible = element.offsetWidth === 0 && element.offsetHeight === 0; |
| 165 | + |
| 166 | + if (invisible) { |
| 167 | + var saveDisplay = element.style.display; |
| 168 | + element.style.display = 'block'; |
| 169 | + } |
166 | 170 |
|
167 |
| - var resetExpandShrink = function () { |
168 | 171 | expandChild.style.width = '100000px';
|
169 | 172 | expandChild.style.height = '100000px';
|
170 | 173 |
|
|
173 | 176 |
|
174 | 177 | shrink.scrollLeft = 100000;
|
175 | 178 | shrink.scrollTop = 100000;
|
176 |
| - }; |
177 | 179 |
|
178 |
| - var reset = function() { |
179 |
| - // Check if element is hidden |
180 |
| - if (initialHiddenCheck) { |
181 |
| - if (!expand.scrollTop && !expand.scrollLeft) { |
182 |
| - |
183 |
| - // reset |
184 |
| - resetExpandShrink(); |
185 |
| - |
186 |
| - // Check in next frame |
187 |
| - if (!resetRAF_id){ |
188 |
| - resetRAF_id = requestAnimationFrame(function(){ |
189 |
| - resetRAF_id = 0; |
190 |
| - |
191 |
| - reset(); |
192 |
| - }); |
193 |
| - } |
194 |
| - |
195 |
| - return; |
196 |
| - } else { |
197 |
| - // Stop checking |
198 |
| - initialHiddenCheck = false; |
199 |
| - } |
| 180 | + if (invisible) { |
| 181 | + element.style.display = saveDisplay; |
200 | 182 | }
|
201 |
| - |
202 |
| - resetExpandShrink(); |
203 | 183 | };
|
204 | 184 | element.resizeSensor.resetSensor = reset;
|
205 | 185 |
|
|
208 | 188 |
|
209 | 189 | if (!dirty) return;
|
210 | 190 |
|
211 |
| - lastWidth = size.width; |
212 |
| - lastHeight = size.height; |
| 191 | + lastWidth = newWidth; |
| 192 | + lastHeight = newHeight; |
213 | 193 |
|
214 | 194 | if (element.resizedAttached) {
|
215 | 195 | element.resizedAttached.call(size);
|
216 | 196 | }
|
217 | 197 | };
|
218 | 198 |
|
219 | 199 | var onScroll = function() {
|
220 |
| - size = getElementSize(element); |
221 |
| - dirty = size.width !== lastWidth || size.height !== lastHeight; |
| 200 | + var size = getElementSize(element); |
| 201 | + var newWidth = size.width; |
| 202 | + var newHeight = size.height; |
| 203 | + dirty = newWidth !== lastWidth || newHeight !== lastHeight; |
222 | 204 |
|
223 | 205 | if (dirty && !rafId) {
|
224 | 206 | rafId = requestAnimationFrame(onResized);
|
|
242 | 224 | requestAnimationFrame(reset);
|
243 | 225 | }
|
244 | 226 |
|
245 |
| - if (typeof ResizeObserver !== "undefined") { |
246 |
| - observer = new ResizeObserver(function(element){ |
247 |
| - forEachElement(element, function (elem) { |
248 |
| - callback.call( |
249 |
| - this, |
250 |
| - { |
251 |
| - width: elem.contentRect.width, |
252 |
| - height: elem.contentRect.height |
253 |
| - } |
254 |
| - ); |
255 |
| - }); |
256 |
| - }); |
257 |
| - if (element !== undefined) { |
258 |
| - forEachElement(element, function(elem){ |
259 |
| - observer.observe(elem); |
260 |
| - }); |
261 |
| - } |
262 |
| - } |
263 |
| - else { |
264 |
| - forEachElement(element, function(elem){ |
265 |
| - attachResizeEvent(elem, callback); |
266 |
| - }); |
267 |
| - } |
| 227 | + forEachElement(element, function(elem){ |
| 228 | + attachResizeEvent(elem, callback); |
| 229 | + }); |
268 | 230 |
|
269 | 231 | this.detach = function(ev) {
|
270 |
| - if (typeof ResizeObserver != "undefined") { |
271 |
| - forEachElement(element, function(elem){ |
272 |
| - observer.unobserve(elem); |
273 |
| - }); |
274 |
| - } |
275 |
| - else { |
276 |
| - ResizeSensor.detach(element, ev); |
277 |
| - } |
| 232 | + ResizeSensor.detach(element, ev); |
278 | 233 | };
|
279 | 234 |
|
280 | 235 | this.reset = function() {
|
|
0 commit comments