X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/998977e74882d0c12413d7bc08c8475a78afbf18..1f39bd871ce30406dc771a6faffba68db635d2ed:/project/static/js/jquery.lazyload.js diff --git a/project/static/js/jquery.lazyload.js b/project/static/js/jquery.lazyload.js index 98a74c13..c15167bd 100644 --- a/project/static/js/jquery.lazyload.js +++ b/project/static/js/jquery.lazyload.js @@ -1,141 +1,52 @@ -/* - * Lazy Load - jQuery plugin for lazy loading images - * - * Copyright (c) 2007-2009 Mika Tuupola - * - * Licensed under the MIT license: - * http://www.opensource.org/licenses/mit-license.php - * - * Project home: - * http://www.appelsiini.net/projects/lazyload - * - * Version: 1.3.2 - * - */ (function($) { - - $.fn.lazyload = function(options) { + jQuery.fn.lazyload = function(pattern, options) { var settings = { - threshold : 0, - failurelimit : 0, - event : "scroll", - effect : "show", - container : window + threshold: 0, + scrollThreshold: 300, + placeholder: 'loading...', + checkInterval: 2000 }; - - if(options) { + + if (options) { $.extend(settings, options); } - - /* Fire one scroll event per scroll. Not one scroll event per image. */ - var elements = this; - if ("scroll" == settings.event) { - $(settings.container).bind("scroll", function(event) { - var counter = 0; - elements.each(function() { - if (!$.belowthefold(this, settings) && - !$.rightoffold(this, settings)) { - $(this).trigger("appear"); - } else { - if (counter++ > settings.failurelimit) { - return false; - } - } - }); - /* Remove image from array so it is not looped next time. */ - var temp = $.grep(elements, function(element) { - return !element.loaded; - }); - elements = $(temp); - }); + + var container = this; + container.data('lazyload:lastCheckedScrollTop', -10000); + + function aboveViewport(container, element, threshold) { + return $(container).offset().top >= $(element).offset().top + $(element).height() + threshold; + } + + function belowViewport(container, element, threshold) { + return $(container).offset().top + $(container).height() + threshold <= $(element).offset().top; } - return this.each(function() { - var self = this; - /* TODO: use .data() instead of .attr() */ - $(self).attr("original", $(self).attr("src")); - if ("scroll" != settings.event - || $.belowthefold(self, settings) - || $.rightoffold(self, settings)) { - if (settings.placeholder) { - $(self).attr("src", settings.placeholder); - } else { - $(self).removeAttr("src"); - } - self.loaded = false; - } else { - self.loaded = true; + function checkScroll() { + if (container.data('lazyload:lastCheckedScrollTop') == undefined) { + return; } - - /* When appear is triggered load original image. */ - $(self).one("appear", function() { - if (!this.loaded) { - $("") - .bind("load", function() { - $(self) - .hide() - .attr("src", $(self).attr("original")) - [settings.effect](settings.effectspeed); - self.loaded = true; - }) - .attr("src", $(self).attr("original")); - }; - }); - - /* When wanted event is triggered load original image */ - /* by triggering appear. */ - if ("scroll" != settings.event) { - $(self).bind(settings.event, function(event) { - if (!self.loaded) { - $(self).trigger("appear"); + if (Math.abs(container.scrollTop() - container.data('lazyload:lastCheckedScrollTop')) > settings.scrollThreshold) { + container.data('lazyload:lastCheckedScrollTop', container.scrollTop()); + + $(pattern, container).each(function() { + if (aboveViewport(container, this, settings.threshold) + || belowViewport(container, this, settings.threshold)) { + $(this).html(settings.placeholder); + } else { + $(this).html(''); + var self = this; + $('').load(function() { + if ($(this).height() > $(self).height()) { + $(self).height($(this).height()); + } + }).appendTo(this); } - }); + }) } - }); - - }; - - /* Convenience methods in jQuery namespace. */ - /* Use as $.belowthefold(element, {threshold : 100, container : window}) */ - - $.belowthefold = function(element, settings) { - if (settings.container === undefined || settings.container === window) { - var fold = $(window).height() + $(window).scrollTop(); - } - else { - var fold = $(settings.container).offset().top + $(settings.container).height(); - } - return fold <= $(element).offset().top - settings.threshold; - }; - - $.rightoffold = function(element, settings) { - if (settings.container === undefined || settings.container === window) { - var fold = $(window).width() + $(window).scrollLeft(); - } - else { - var fold = $(settings.container).offset().left + $(settings.container).width(); + setTimeout(checkScroll, settings.checkInterval); } - return fold <= $(element).offset().left - settings.threshold; - }; - - $.aboveViewport = function(element, settings) { - if (settings.container === undefined || settings.container === window) { - var top = $(window).scrollTop(); - } - else { - var top = $(settings.container).offset().top; - } - return top >= $(element).offset().bottom - settings.threshold; + + checkScroll(); }; - - /* Custom selectors for your convenience. */ - /* Use as $("img:below-the-fold").something() */ - - $.extend($.expr[':'], { - "below-the-fold" : "$.belowthefold(a, {threshold : 0, container: window})", - "above-the-fold" : "!$.belowthefold(a, {threshold : 0, container: window})", - "right-of-fold" : "$.rightoffold(a, {threshold : 0, container: window})", - "left-of-fold" : "!$.rightoffold(a, {threshold : 0, container: window})" - }); - })(jQuery);