PageSourceSearch

https://wpteq.org/wp-content/plugins/ewww-image-optimizer/includes/lazysizes.js?ver=877

js wpteq.org collected 2026-09-24 18:11:23 UTC 19,050 bytes, 760 lines download raw bytes

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.