|
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