vendor: 2,046 bytes, lines 1-85
1// version 5.3.0 2(function(window, factory) { 3 var lazySizes = factory(window, window.document, Date); 4 window.lazySizes = lazySizes; 5 if(typeof module == 'object' && module.exports){ 6 module.exports = lazySizes; 7 } 8}(typeof window != 'undefined' ? 9 window : {}, function l(window, document, Date) { // Pass in the windoe Date function also for SSR because the Date class can be lost 10 'use strict'; 11 /*jshint eqnull:true */ 12 13 var lazysizes, lazySizesCfg; 14 15 (function(){ 16 var prop; 17 18 var lazySizesDefaults = { 19 lazyClass: 'lazyload', 20 loadedClass: 'lazyloaded', 21 loadingClass: 'lazyloading', 22 preloadClass: 'lazypreload', 23 errorClass: 'lazyerror', 24 //strictClass: 'lazystrict', 25 autosizesClass: 'lazyautosizes', 26 fastLoadedClass: 'ls-is-cached', 27 iframeLoadMode: 0, 28 srcAttr: 'data-src', 29 srcsetAttr: 'data-srcset', 30 sizesAttr: 'data-sizes', 31 //preloadAfterLoad: false, 32 minSize: 40, 33 customMedia: {}, 34 init: true, 35 expFactor: 1.5, 36 hFac: 0.8, 37 loadMode: 2, 38 loadHidden: true, 39 ricTimeout: 0, 40 throttleDelay: 125, 41 }; 42 43 lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {}; 44 45 for(prop in lazySizesDefaults){ 46 if(!(prop in lazySizesCfg)){ 47 lazySizesCfg[prop] = lazySizesDefaults[prop]; 48 } 49 } 50 })(); 51 52 if (!document || !document.getElementsByClassName) { 53 return { 54 init: function () {}, 55 cfg: lazySizesCfg, 56 noSupport: true, 57 }; 58 } 59 60 var docElem = document.documentElement; 61 62 var supportPicture = window.HTMLPictureElement; 63 64 var _addEventListener = 'addEventListener'; 65 66 var _getAttribute = 'getAttribute'; 67 68 /** 69 * Update to bind to window because 'this' becomes null during SSR 70 * builds. 71 */ 72 var addEventListener = window[_addEventListener].bind(window); 73 74 var setTimeout = window.setTimeout; 75 76 var requestAnimationFrame = window.requestAnimationFrame || setTimeout; 77 78 var requestIdleCallback = window.requestIdleCallback; 79 80 var regPicture = /^picture$/i; 81 82 var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded']; 83 84 var regClassCache = {}; 85
vendor: 1,611 bytes, lines 86-149
86 var forEach = Array.prototype.forEach; 87 88 var hasClass = function(ele, cls) { 89 if(!regClassCache[cls]){ 90 regClassCache[cls] = new RegExp('(\\s|^)'+cls+'(\\s|$)'); 91 } 92 return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls]; 93 }; 94 95 var addClass = function(ele, cls) { 96 if (!hasClass(ele, cls)){ 97 ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls); 98 } 99 }; 100 101 var removeClass = function(ele, cls) { 102 var reg; 103 if ((reg = hasClass(ele,cls))) { 104 ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' ')); 105 } 106 }; 107 108 var addRemoveLoadEvents = function(dom, fn, add){ 109 var action = add ? _addEventListener : 'removeEventListener'; 110 if(add){ 111 addRemoveLoadEvents(dom, fn); 112 } 113 loadEvents.forEach(function(evt){ 114 dom[action](evt, fn); 115 }); 116 }; 117 118 var triggerEvent = function(elem, name, detail, noBubbles, noCancelable){ 119 var event = document.createEvent('Event'); 120 121 if(!detail){ 122 detail = {}; 123 } 124 125 detail.instance = lazysizes; 126 127 event.initEvent(name, !noBubbles, !noCancelable); 128 129 event.detail = detail; 130 131 elem.dispatchEvent(event); 132 return event; 133 }; 134 135 var updatePolyfill = function (el, full){ 136 var polyfill; 137 if( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){ 138 if(full && full.src && !el[_getAttribute]('srcset')){ 139 el.setAttribute('srcset', full.src); 140 } 141 polyfill({reevaluate: true, elements: [el]}); 142 } else if(full && full.src){ 143 el.src = full.src; 144 } 145 }; 146 147 var getCSS = function (elem, style){ 148 return (getComputedStyle(elem, null) || {})[style]; 149 };
vendor: 10,118 bytes, lines 150-550
150 151 var getWidth = function(elem, parent, width){ 152 width = width || elem.offsetWidth; 153 154 while(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){ 155 width = parent.offsetWidth; 156 parent = parent.parentNode; 157 } 158 159 return width; 160 }; 161 162 var rAF = (function(){ 163 var running, waiting; 164 var firstFns = []; 165 var secondFns = []; 166 var fns = firstFns; 167 168 var run = function(){ 169 var runFns = fns; 170 171 fns = firstFns.length ? secondFns : firstFns; 172 173 running = true; 174 waiting = false; 175 176 while(runFns.length){ 177 runFns.shift()(); 178 } 179 180 running = false; 181 }; 182 183 var rafBatch = function(fn, queue){ 184 if(running && !queue){ 185 fn.apply(this, arguments); 186 } else { 187 fns.push(fn); 188 189 if(!waiting){ 190 waiting = true; 191 (document.hidden ? setTimeout : requestAnimationFrame)(run); 192 } 193 } 194 }; 195 196 rafBatch._lsFlush = run; 197 198 return rafBatch; 199 })(); 200 201 var rAFIt = function(fn, simple){ 202 return simple ? 203 function() { 204 rAF(fn); 205 } : 206 function(){ 207 var that = this; 208 var args = arguments; 209 rAF(function(){ 210 fn.apply(that, args); 211 }); 212 } 213 ; 214 }; 215 216 var throttle = function(fn){ 217 var running; 218 var lastTime = 0; 219 var gDelay = lazySizesCfg.throttleDelay; 220 var rICTimeout = lazySizesCfg.ricTimeout; 221 var run = function(){ 222 running = false; 223 lastTime = Date.now(); 224 fn(); 225 }; 226 var idleCallback = requestIdleCallback && rICTimeout > 49 ? 227 function(){ 228 requestIdleCallback(run, {timeout: rICTimeout}); 229 230 if(rICTimeout !== lazySizesCfg.ricTimeout){ 231 rICTimeout = lazySizesCfg.ricTimeout; 232 } 233 } : 234 rAFIt(function(){ 235 setTimeout(run); 236 }, true) 237 ; 238 239 return function(isPriority){ 240 var delay; 241 242 if((isPriority = isPriority === true)){ 243 rICTimeout = 33; 244 } 245 246 if(running){ 247 return; 248 } 249 250 running = true; 251 252 delay = gDelay - (Date.now() - lastTime); 253 254 if(delay < 0){ 255 delay = 0; 256 } 257 258 if(isPriority || delay < 9){ 259 idleCallback(); 260 } else { 261 setTimeout(idleCallback, delay); 262 } 263 }; 264 }; 265 266 //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html 267 var debounce = function(func) { 268 var timeout, timestamp; 269 var wait = 99; 270 var run = function(){ 271 timeout = null; 272 func(); 273 }; 274 var later = function() { 275 var last = Date.now() - timestamp; 276 277 if (last < wait) { 278 setTimeout(later, wait - last); 279 } else { 280 (requestIdleCallback || run)(run); 281 } 282 }; 283 284 return function() { 285 timestamp = Date.now(); 286 287 if (!timeout) { 288 timeout = setTimeout(later, wait); 289 } 290 }; 291 }; 292 293 var loader = (function(){ 294 var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started; 295 296 var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden; 297 298 var regImg = /^img$/i; 299 var regIframe = /^iframe$/i; 300 301 var supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent)); 302 303 var shrinkExpand = 0; 304 var currentExpand = 0; 305 306 var isLoading = 0; 307 var lowRuns = -1; 308 309 var resetPreloading = function(e){ 310 isLoading--; 311 if(!e || isLoading < 0 || !e.target){ 312 isLoading = 0; 313 } 314 }; 315 316 var isVisible = function (elem) { 317 if (isBodyHidden == null) { 318 isBodyHidden = getCSS(document.body, 'visibility') == 'hidden'; 319 } 320 321 return isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden'); 322 }; 323 324 var isNestedVisible = function(elem, elemExpand){ 325 var outerRect; 326 var parent = elem; 327 var visible = isVisible(elem); 328 329 eLtop -= elemExpand; 330 eLbottom += elemExpand; 331 eLleft -= elemExpand; 332 eLright += elemExpand; 333 334 while(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){ 335 visible = ((getCSS(parent, 'opacity') || 1) > 0); 336 337 if(visible && getCSS(parent, 'overflow') != 'visible'){ 338 outerRect = parent.getBoundingClientRect(); 339 visible = eLright > outerRect.left && 340 eLleft < outerRect.right && 341 eLbottom > outerRect.top - 1 && 342 eLtop < outerRect.bottom + 1 343 ; 344 } 345 } 346 347 return visible; 348 }; 349 350 var checkElements = function() { 351 var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, 352 beforeExpandVal, defaultExpand, preloadExpand, hFac; 353 var lazyloadElems = lazysizes.elements; 354 355 if((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){ 356 357 i = 0; 358 359 lowRuns++; 360 361 for(; i < eLlen; i++){ 362 363 if(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;} 364 365 if(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;} 366 367 if(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){ 368 elemExpand = currentExpand; 369 } 370 371 if (!defaultExpand) { 372 defaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ? 373 docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 : 374 lazySizesCfg.expand; 375 376 lazysizes._defEx = defaultExpand; 377 378 preloadExpand = defaultExpand * lazySizesCfg.expFactor; 379 hFac = lazySizesCfg.hFac; 380 isBodyHidden = null; 381 382 if(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){ 383 currentExpand = preloadExpand; 384 lowRuns = 0; 385 } else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){ 386 currentExpand = defaultExpand; 387 } else { 388 currentExpand = shrinkExpand; 389 } 390 } 391 392 if(beforeExpandVal !== elemExpand){ 393 eLvW = innerWidth + (elemExpand * hFac); 394 elvH = innerHeight + elemExpand; 395 elemNegativeExpand = elemExpand * -1; 396 beforeExpandVal = elemExpand; 397 } 398 399 rect = lazyloadElems[i].getBoundingClientRect(); 400 401 if ((eLbottom = rect.bottom) >= elemNegativeExpand && 402 (eLtop = rect.top) <= elvH && 403 (eLright = rect.right) >= elemNegativeExpand * hFac && 404 (eLleft = rect.left) <= eLvW && 405 (eLbottom || eLright || eLleft || eLtop) && 406 (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) && 407 ((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){ 408 unveilElement(lazyloadElems[i]); 409 loadedSomething = true; 410 if(isLoading > 9){break;} 411 } else if(!loadedSomething && isCompleted && !autoLoadElem && 412 isLoading < 4 && lowRuns < 4 && loadMode > 2 && 413 (preloadElems[0] || lazySizesCfg.preloadAfterLoad) && 414 (preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){ 415 autoLoadElem = preloadElems[0] || lazyloadElems[i]; 416 } 417 } 418 419 if(autoLoadElem && !loadedSomething){ 420 unveilElement(autoLoadElem); 421 } 422 } 423 }; 424 425 var throttledCheckElements = throttle(checkElements); 426 427 var switchLoadingClass = function(e){ 428 var elem = e.target; 429 430 if (elem._lazyCache) { 431 delete elem._lazyCache; 432 return; 433 } 434 435 resetPreloading(e); 436 addClass(elem, lazySizesCfg.loadedClass); 437 removeClass(elem, lazySizesCfg.loadingClass); 438 addRemoveLoadEvents(elem, rafSwitchLoadingClass); 439 triggerEvent(elem, 'lazyloaded'); 440 }; 441 var rafedSwitchLoadingClass = rAFIt(switchLoadingClass); 442 var rafSwitchLoadingClass = function(e){ 443 rafedSwitchLoadingClass({target: e.target}); 444 }; 445 446 var changeIframeSrc = function(elem, src){ 447 var loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode; 448 449 // loadMode can be also a string! 450 if (loadMode == 0) { 451 elem.contentWindow.location.replace(src); 452 } else if (loadMode == 1) { 453 elem.src = src; 454 } 455 }; 456 457 var handleSources = function(source){ 458 var customMedia; 459 460 var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr); 461 462 if( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){ 463 source.setAttribute('media', customMedia); 464 } 465 466 if(sourceSrcset){ 467 source.setAttribute('srcset', sourceSrcset); 468 } 469 }; 470 471 var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){ 472 var src, srcset, parent, isPicture, event, firesLoad; 473 474 if(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){ 475 476 if(sizes){ 477 if(isAuto){ 478 addClass(elem, lazySizesCfg.autosizesClass); 479 } else { 480 elem.setAttribute('sizes', sizes); 481 } 482 } 483 484 srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr); 485 src = elem[_getAttribute](lazySizesCfg.srcAttr); 486 487 if(isImg) { 488 parent = elem.parentNode; 489 isPicture = parent && regPicture.test(parent.nodeName || ''); 490 } 491 492 firesLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture)); 493 494 event = {target: elem}; 495 496 addClass(elem, lazySizesCfg.loadingClass); 497 498 if(firesLoad){ 499 clearTimeout(resetPreloadingTimer); 500 resetPreloadingTimer = setTimeout(resetPreloading, 2500); 501 addRemoveLoadEvents(elem, rafSwitchLoadingClass, true); 502 } 503 504 if(isPicture){ 505 forEach.call(parent.getElementsByTagName('source'), handleSources); 506 } 507 508 if(srcset){ 509 elem.setAttribute('srcset', srcset); 510 } else if(src && !isPicture){ 511 if(regIframe.test(elem.nodeName)){ 512 changeIframeSrc(elem, src); 513 } else { 514 elem.src = src; 515 } 516 } 517 518 if(isImg && (srcset || isPicture)){ 519 updatePolyfill(elem, {src: src}); 520 } 521 } 522 523 if(elem._lazyRace){ 524 delete elem._lazyRace; 525 } 526 removeClass(elem, lazySizesCfg.lazyClass); 527 528 rAF(function(){ 529 // Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015) 530 var isLoaded = elem.complete && elem.naturalWidth > 1; 531 532 if( !firesLoad || isLoaded){ 533 if (isLoaded) { 534 addClass(elem, lazySizesCfg.fastLoadedClass); 535 } 536 switchLoadingClass(event); 537 elem._lazyCache = true; 538 setTimeout(function(){ 539 if ('_lazyCache' in elem) { 540 delete elem._lazyCache; 541 } 542 }, 9); 543 } 544 if (elem.loading == 'lazy') { 545 isLoading--; 546 } 547 }, true); 548 }); 549 550
vendor: 5,275 bytes, lines 550-760
550var unveilElement = function (elem){ 551 if (elem._lazyRace) {return;} 552 var detail; 553 554 var isImg = regImg.test(elem.nodeName); 555 556 //allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw") 557 var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes')); 558 var isAuto = sizes == 'auto'; 559 560 if( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;} 561 562 detail = triggerEvent(elem, 'lazyunveilread').detail; 563 564 if(isAuto){ 565 autoSizer.updateElem(elem, true, elem.offsetWidth); 566 } 567 568 elem._lazyRace = true; 569 isLoading++; 570 571 lazyUnveil(elem, detail, isAuto, sizes, isImg); 572 }; 573 574 var afterScroll = debounce(function(){ 575 lazySizesCfg.loadMode = 3; 576 throttledCheckElements(); 577 }); 578 579 var altLoadmodeScrollListner = function(){ 580 if(lazySizesCfg.loadMode == 3){ 581 lazySizesCfg.loadMode = 2; 582 } 583 afterScroll(); 584 }; 585 586 var onload = function(){ 587 if(isCompleted){return;} 588 if(Date.now() - started < 999){ 589 setTimeout(onload, 999); 590 return; 591 } 592 593 594 isCompleted = true; 595 596 lazySizesCfg.loadMode = 3; 597 598 throttledCheckElements(); 599 600 addEventListener('scroll', altLoadmodeScrollListner, true); 601 }; 602 603 return { 604 _: function(){ 605 started = Date.now(); 606 607 lazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass); 608 preloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass); 609 610 addEventListener('scroll', throttledCheckElements, true); 611 612 addEventListener('resize', throttledCheckElements, true); 613 614 addEventListener('pageshow', function (e) { 615 if (e.persisted) { 616 var loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass); 617 618 if (loadingElements.length && loadingElements.forEach) { 619 requestAnimationFrame(function () { 620 loadingElements.forEach( function (img) { 621 if (img.complete) { 622 unveilElement(img); 623 } 624 }); 625 }); 626 } 627 } 628 }); 629 630 if(window.MutationObserver){ 631 new MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} ); 632 } else { 633 docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true); 634 docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true); 635 setInterval(throttledCheckElements, 999); 636 } 637 638 addEventListener('hashchange', throttledCheckElements, true); 639 640 //, 'fullscreenchange' 641 ['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){ 642 document[_addEventListener](name, throttledCheckElements, true); 643 }); 644 645 if((/d$|^c/.test(document.readyState))){ 646 onload(); 647 } else { 648 addEventListener('load', onload); 649 document[_addEventListener]('DOMContentLoaded', throttledCheckElements); 650 setTimeout(onload, 20000); 651 } 652 653 if(lazysizes.elements.length){ 654 checkElements(); 655 rAF._lsFlush(); 656 } else { 657 throttledCheckElements(); 658 } 659 }, 660 checkElems: throttledCheckElements, 661 unveil: unveilElement, 662 _aLSL: altLoadmodeScrollListner, 663 }; 664 })(); 665 666 667 var autoSizer = (function(){ 668 var autosizesElems; 669 670 var sizeElement = rAFIt(function(elem, parent, event, width){ 671 var sources, i, len; 672 elem._lazysizesWidth = width; 673 width += 'px'; 674 675 elem.setAttribute('sizes', width); 676 677 if(regPicture.test(parent.nodeName || '')){ 678 sources = parent.getElementsByTagName('source'); 679 for(i = 0, len = sources.length; i < len; i++){ 680 sources[i].setAttribute('sizes', width); 681 } 682 } 683 684 if(!event.detail.dataAttr){ 685 updatePolyfill(elem, event.detail); 686 } 687 }); 688 var getSizeElement = function (elem, dataAttr, width){ 689 var event; 690 var parent = elem.parentNode; 691 692 if(parent){ 693 width = getWidth(elem, parent, width); 694 event = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr}); 695 696 if(!event.defaultPrevented){ 697 width = event.detail.width; 698 699 if(width && width !== elem._lazysizesWidth){ 700 sizeElement(elem, parent, event, width); 701 } 702 } 703 } 704 }; 705 706 var updateElementsSizes = function(){ 707 var i; 708 var len = autosizesElems.length; 709 if(len){ 710 i = 0; 711 712 for(; i < len; i++){ 713 getSizeElement(autosizesElems[i]); 714 } 715 } 716 }; 717 718 var debouncedUpdateElementsSizes = debounce(updateElementsSizes); 719 720 return { 721 _: function(){ 722 autosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass); 723 addEventListener('resize', debouncedUpdateElementsSizes); 724 }, 725 checkElems: debouncedUpdateElementsSizes, 726 updateElem: getSizeElement 727 }; 728 })(); 729 730 var init = function(){ 731 if(!init.i && document.getElementsByClassName){ 732 init.i = true; 733 autoSizer._(); 734 loader._(); 735 } 736 }; 737 738 setTimeout(function(){ 739 if(lazySizesCfg.init){ 740 init(); 741 } 742 }); 743 744 lazysizes = { 745 cfg: lazySizesCfg, 746 autoSizer: autoSizer, 747 loader: loader, 748 init: init, 749 uP: updatePolyfill, 750 aC: addClass, 751 rC: removeClass, 752 hC: hasClass, 753 fire: triggerEvent, 754 gW: getWidth, 755 rAF: rAF, 756 }; 757 758 return lazysizes; 759} 760));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.