diff --git a/blazy.js b/blazy.js index 00af78d..94a5101 100644 --- a/blazy.js +++ b/blazy.js @@ -200,7 +200,7 @@ rect.top <= viewport.bottom; } - function loadElement(ele, force, options) { + function loadElement(ele, force, options, parentCallback) { // if element is visible, not loaded or forced if (!hasClass(ele, options.successClass) && (force || options.loadInvisible || (ele.offsetWidth > 0 && ele.offsetHeight > 0))) { var dataSrc = getAttr(ele, _source) || getAttr(ele, options.src); // fallback to default 'data-src' @@ -218,7 +218,11 @@ // due to bug introduced in chrome v50 // (https://productforums.google.com/forum/#!topic/chrome/p51Lk7vnP2o) var onErrorHandler = function() { - if (options.error) options.error(ele, "invalid"); + if(parentCallback) { + parentCallback(true); + } else { + if (options.error) options.error(ele, "invalid"); + } addClass(ele, options.errorClass); unbindEvent(img, 'error', onErrorHandler); unbindEvent(img, 'load', onLoadHandler); @@ -233,7 +237,8 @@ } else { ele.style.backgroundImage = 'url("' + src + '")'; } - itemLoaded(ele, options); + itemLoaded(ele, options, !parentCallback); + if(parentCallback) parentCallback(false); unbindEvent(img, 'load', onLoadHandler); unbindEvent(img, 'error', onErrorHandler); }; @@ -251,16 +256,34 @@ } else { // An item with src like iframe, unity games, simpel video etc ele.src = src; - itemLoaded(ele, options); + if(equal(ele, 'source')) { + parent.load(); + } + itemLoaded(ele, options, !parentCallback); + if(parentCallback) parentCallback(false); } - } else { - // video with child source - if (equal(ele, 'video')) { - each(ele.getElementsByTagName('source'), function(source) { - handleSource(source, _attrSrc, options.src); - }); - ele.load(); - itemLoaded(ele, options); + } else { // a wrapper with tags inside that should be loaded at once + var childElements = ele.querySelectorAll('[data-src]'); + if(childElements) { + var counter = 0; + var errorFlag = false; + var childElementLoaded = function(failure) { + counter++; + if(failure) errorFlag = failure; + if(counter == childElements.length) { + //if single elements couldn't be loaded and an error handling is specified, raise an error + //otherwise proceed with success + if(errorFlag == true && options.error) { + options.error(ele, "invalid"); + addClass(ele, options.errorClass); + } else { + itemLoaded(ele, options, true, !errorFlag); + } + } + }; + for(var i = 0; i < childElements.length; i++) { + loadElement(childElements[i], force, options, childElementLoaded); + } } else { if (options.error) options.error(ele, "missing"); addClass(ele, options.errorClass); @@ -269,9 +292,9 @@ } } - function itemLoaded(ele, options) { + function itemLoaded(ele, options, finishedLoading, allElementsSucceeded) { addClass(ele, options.successClass); - if (options.success) options.success(ele); + if (options.success && finishedLoading) options.success(ele, allElementsSucceeded); // cleanup markup, remove data source attributes removeAttr(ele, options.src); removeAttr(ele, options.srcset); @@ -367,4 +390,4 @@ fn.apply(scope, arguments); }; } -}); +}); \ No newline at end of file diff --git a/blazy.min.js b/blazy.min.js index 649abfd..0c74a10 100644 --- a/blazy.min.js +++ b/blazy.min.js @@ -1,6 +1,6 @@ -/*! - hey, [be]Lazy.js - v1.8.2 - 2016.10.25 +/* + hey, [be]Lazy.js - v1.8.2 - 2016.10.25 A fast, small and dependency free lazy load script (https://github.com/dinbror/blazy) (c) Bjoern Klinggaard - @bklinggaard - http://dinbror.dk/blazy */ - (function(q,m){"function"===typeof define&&define.amd?define(m):"object"===typeof exports?module.exports=m():q.Blazy=m()})(this,function(){function q(b){var c=b._util;c.elements=E(b.options);c.count=c.elements.length;c.destroyed&&(c.destroyed=!1,b.options.container&&l(b.options.container,function(a){n(a,"scroll",c.validateT)}),n(window,"resize",c.saveViewportOffsetT),n(window,"resize",c.validateT),n(window,"scroll",c.validateT));m(b)}function m(b){for(var c=b._util,a=0;a=c.left&&b.bottom>=c.top&&b.left<=c.right&&b.top<=c.bottom}function z(b,c,a){if(!t(b,a.successClass)&&(c||a.loadInvisible||0=window.screen.width)return u=a.src,!1});setTimeout(function(){q(a)})}}); \ No newline at end of file +(function(m,g){"function"===typeof define&&define.amd?define(g):"object"===typeof exports?module.exports=g():m.Blazy=g()})(this,function(){function m(b){var c=b._util;c.elements=I(b.options);c.count=c.elements.length;c.destroyed&&(c.destroyed=!1,b.options.container&&p(b.options.container,function(a){q(a,"scroll",c.validateT)}),q(window,"resize",c.saveViewportOffsetT),q(window,"resize",c.validateT),q(window,"scroll",c.validateT));g(b)}function g(b){for(var c=b._util,a=0;ae.top?h:e.top,right:ue.left?k:e.left})}else f=!1;break a}f=r(f,e)}if(f||x(d,b.options.successClass))b.load(d),c.elements.splice(a,1),c.count--,a--}0===c.count&&b.destroy()}function r(b,c){return b.right>=c.left&&b.bottom>=c.top&&b.left<=c.right&&b.top<=c.bottom}function y(b,c,a,d){if(!x(b,a.successClass)&&(c||a.loadInvisible||0=window.screen.width)return z=a.src,!1});setTimeout(function(){m(a)})}}); \ No newline at end of file