|
18 | 18 | var regScript = /^script$/i;
|
19 | 19 | var regImg = /^img$/i;
|
20 | 20 | var noDataTouch = {sizes: 1, src: 1, srcset: 1};
|
21 |
| - var inViewTreshhold = 99; |
| 21 | + var inViewTreshhold = 66; |
22 | 22 | var lazyloadElems = document.getElementsByClassName('lazyload');
|
23 | 23 | var autosizesElems = document.getElementsByClassName('lazyautosizes');
|
24 | 24 | var setImmediate = window.setImmediate || window.setTimeout;
|
|
57 | 57 | };
|
58 | 58 | }
|
59 | 59 |
|
60 |
| - |
61 |
| - |
62 |
| - function inView(el) { |
63 |
| - var rect = el.getBoundingClientRect(); |
64 |
| - var bottom, right, left, top; |
65 |
| - |
66 |
| - return !!( |
67 |
| - (bottom = rect.bottom) >= (inViewTreshhold * -1) && |
68 |
| - (top = rect.top) <= window.innerHeight + inViewTreshhold && |
69 |
| - (right = rect.right) >= (inViewTreshhold * -1) && |
70 |
| - (left = rect.left) <= window.innerWidth + inViewTreshhold && |
71 |
| - (bottom || right || left || top) |
72 |
| - ); |
73 |
| - } |
74 |
| - |
75 | 60 | function updatePolyfill(el, full){
|
76 | 61 | var imageData;
|
77 | 62 | if(window.picturefill){
|
|
108 | 93 | if(!running){
|
109 | 94 | running = true;
|
110 | 95 | clearTimeout(timer);
|
111 |
| - timer = setTimeout(run, 66); |
| 96 | + timer = setTimeout(run, 99); |
112 | 97 | }
|
113 | 98 | }
|
114 | 99 | };
|
115 | 100 | })();
|
116 | 101 |
|
117 | 102 | var evalLazyElements = function (){
|
118 |
| - var now, i, checkTime; |
| 103 | + var now, i, checkTime, vW, vH, rect, top, left, right, bottom, negativeTreshhold; |
119 | 104 | var len = lazyloadElems.length;
|
120 | 105 | if(len){
|
121 | 106 | now = Date.now();
|
122 | 107 | checkTime = 0;
|
| 108 | + vW = window.innerWidth + inViewTreshhold; |
| 109 | + vH = window.innerHeight + inViewTreshhold; |
| 110 | + negativeTreshhold = inViewTreshhold * -1; |
123 | 111 |
|
124 | 112 | i = globalLazyIndex || 0;
|
125 | 113 |
|
126 | 114 | clearLazyTimer();
|
127 | 115 |
|
128 | 116 | for(; i < len; i++){
|
129 |
| - if (inView(lazyloadElems[i])){ |
| 117 | + rect = lazyloadElems[i].getBoundingClientRect(); |
| 118 | + |
| 119 | + if ((bottom = rect.bottom) >= negativeTreshhold && |
| 120 | + (top = rect.top) <= vH && |
| 121 | + (right = rect.right) >= negativeTreshhold && |
| 122 | + (left = rect.left) <= vW && |
| 123 | + (bottom || right || left || top)){ |
130 | 124 | unveilLazy(lazyloadElems[i]);
|
131 | 125 | } else {
|
132 | 126 | checkTime++;
|
133 | 127 | if(2 < checkTime && i < len - 1 && Date.now() - now > 9){
|
134 | 128 | globalLazyIndex = i + 1;
|
| 129 | + |
135 | 130 | globalLazyTimer = setTimeout(evalLazyElements, 20);
|
136 | 131 | break;
|
137 | 132 | }
|
|
285 | 280 |
|
286 | 281 | if(i > checkTime && i < len - 1 && Date.now() - now > 9){
|
287 | 282 | globalSizesIndex = i + 1;
|
| 283 | + |
288 | 284 | globalSizesTimer = setTimeout(evalSizesElements, 20);
|
289 | 285 | break;
|
290 | 286 | }
|
|
308 | 304 | elemWidth :
|
309 | 305 | parentWidth;
|
310 | 306 |
|
311 |
| - if(width){ |
| 307 | + if(width && (!elem._lazysizesWidth || width > elem._lazysizesWidth)){ |
| 308 | + elem._lazysizesWidth = width; |
312 | 309 | width += 'px';
|
313 | 310 | elem.setAttribute('sizes', width);
|
314 | 311 |
|
|
326 | 323 | }
|
327 | 324 | }
|
328 | 325 |
|
| 326 | + // bind to all possible events ;-) This might look like a performance disaster, but it isn't. |
| 327 | + // The main check functions are written to run extreme fast without consuming memory. |
329 | 328 | var onload = function(){
|
330 | 329 | inViewTreshhold *= 3;
|
331 | 330 | clearTimeout(globalInitialTimer);
|
| 331 | + |
| 332 | + document.addEventListener('load', lazyEvalLazy.throttled, true); |
| 333 | + }; |
| 334 | + var onready = function(){ |
332 | 335 | if(window.MutationObserver){
|
333 |
| - new MutationObserver( lazyEvalLazy.debounce ).observe( document.body || document.documentElement, {childList: true, subtree: true} ); |
| 336 | + new MutationObserver( lazyEvalLazy.throttled ).observe( document.body || document.documentElement, {childList: true, subtree: true, attributes: true} ); |
334 | 337 | } else {
|
335 |
| - (document.body || document.documentElement).addEventListener( "DOMNodeInserted", lazyEvalLazy.debounce, true); |
| 338 | + (document.body || document.documentElement).addEventListener( "DOMNodeInserted", lazyEvalLazy.throttled, true); |
| 339 | + (document.body || document.documentElement).addEventListener( "DOMAttrModified", lazyEvalLazy.throttled, true); |
336 | 340 | }
|
337 |
| - document.body.addEventListener('scroll', lazyEvalLazy.throttled, true); |
338 | 341 | };
|
339 | 342 |
|
340 |
| - window.addEventListener('scroll', lazyEvalLazy.throttled, false); |
341 | 343 |
|
342 |
| - window.addEventListener('resize', lazyEvalLazy.debounce, false); |
343 |
| - document.addEventListener('load', lazyEvalLazy.debounce, true); |
| 344 | + window.addEventListener('scroll', lazyEvalLazy.throttled, false); |
| 345 | + (document.body || document.documentElement).addEventListener('scroll', lazyEvalLazy.throttled, true); |
344 | 346 |
|
345 |
| - document.addEventListener('touchmove', lazyEvalLazy.debounce, true); |
346 |
| - document.addEventListener('readystatechange', lazyEvalLazy.debounce, false); |
| 347 | + document.addEventListener('touchmove', lazyEvalLazy.throttled, false); |
347 | 348 |
|
| 349 | + window.addEventListener('resize', lazyEvalLazy.debounce, false); |
348 | 350 | window.addEventListener('resize', lazyEvalSizes, false);
|
349 | 351 |
|
| 352 | + if( /^i|^loade|c/.test(document.readyState) ){ |
| 353 | + onready(); |
| 354 | + } else { |
| 355 | + document.addEventListener('DOMContentLoaded', onready, false); |
| 356 | + } |
| 357 | + |
350 | 358 | if(document.readyState == 'complete'){
|
351 | 359 | onload();
|
352 | 360 | } else {
|
353 | 361 | window.addEventListener('load', onload, false);
|
| 362 | + document.addEventListener('readystatechange', lazyEvalLazy.throttled, false); |
354 | 363 | }
|
355 |
| - lazyEvalLazy.debounce(); |
| 364 | + lazyEvalLazy.throttled(); |
356 | 365 |
|
357 | 366 | return {
|
358 | 367 | updateAllSizes: lazyEvalSizes,
|
|
0 commit comments