From eda258cc6530f83323e3b4e8c1b5a3c3dc4cc040 Mon Sep 17 00:00:00 2001 From: Tim Oxley Date: Sat, 16 Apr 2011 22:58:09 +1000 Subject: [PATCH] New elements optionally fade in, instead of appearing abruptly --- README.rdoc | 3 ++ jquery.infinitescroll.js | 114 +++++++++++++++++++++------------------ 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/README.rdoc b/README.rdoc index ca92b25..dc3b6ad 100644 --- a/README.rdoc +++ b/README.rdoc @@ -48,6 +48,9 @@ This is determined by handing back an empty response from the server. Once this container: default: document This is the container used to measure scrolling, and then trigger a load + fade: + default: 'none' + Speed at which new data will smoothly fade in after appending. eg 'fast', 'slow', 250, 1000 (numbers in milliseconds). Set to 'none' or 0 to have results appear without a fade. === Events diff --git a/jquery.infinitescroll.js b/jquery.infinitescroll.js index 4908871..0fc7233 100644 --- a/jquery.infinitescroll.js +++ b/jquery.infinitescroll.js @@ -1,59 +1,69 @@ // Infinite Scroll (function($) { - $.fn.infinitescroll = function(options) { - return $(this).each(function() { - var el = $(this); - var settings = $.extend({ - url: null, - triggerAt: 300, - page: 2, - appendTo: '.list tbody', - container: $(document) - }, options); - var req = null; - var maxReached = false; + $.fn.infinitescroll = function(options) { + return $(this).each(function() { + var el = $(this); + var settings = $.extend({ + url: null, + triggerAt: 300, + page: 2, + appendTo: '.list tbody', + fade: 'none', + container: $(document) + }, options); + var req = null; + var maxReached = false; - var infinityRunner = function() { - if (settings.url !== null) { - if (settings.force || (settings.triggerAt >= (settings.container.height() - el.height() - el.scrollTop()))) { - settings.force = false; - // if the request is in progress, exit and wait for it to finish - if (req && req.readyState < 4 && req.readyState > 0) { - return; - } - $(settings.appendTo).trigger('infinitescroll.beforesend'); - req = $.get(settings.url, 'page='+settings.page, function(data) { - if (data !== '') { - if (settings.page > 1) { - $(settings.appendTo).append(data); - } else { - $(settings.appendTo).html(data); - } - settings.page++; - $(settings.appendTo).trigger('infinitescroll.finish'); - } else { - maxReached = true; - $(settings.appendTo).trigger('infinitescroll.maxreached'); - } - }, 'html'); - } + var infinityRunner = function() { + if (settings.url !== null) { + if (settings.force || (settings.triggerAt >= (settings.container.height() - el.height() - el.scrollTop()))) { + settings.force = false; + // if the request is in progress, exit and wait for it to finish + if (req && req.readyState < 4 && req.readyState > 0) { + return; + } + $(settings.appendTo).trigger('infinitescroll.beforesend'); + req = $.get(settings.url, 'page='+settings.page, function(data) { + if (data !== '') { + + var elements = $(data); + if (settings.page > 1) { + $(settings.appendTo).append(elements); + } else { + $(settings.appendTo).html(elements); } - }; - - el.bind('infinitescroll.scrollpage', function(e, page) { - settings.page = page; - settings.force = true; - infinityRunner(); - }); - - el.scroll(function(e) { - if (!maxReached) { - infinityRunner(); + + // hide, then fade in elements if fade is configured + if (settings.fade !== 'none' || settings.fade !== null) { + elements.css('display', 'none'); // hide() throws an error :/ ? + elements.fadeIn(settings.fade); } - }); + + settings.page++; + $(settings.appendTo).trigger('infinitescroll.finish'); + } else { + maxReached = true; + $(settings.appendTo).trigger('infinitescroll.maxreached'); + } + }, 'html'); + } + } + }; + + el.bind('infinitescroll.scrollpage', function(e, page) { + settings.page = page; + settings.force = true; + infinityRunner(); + }); + + el.scroll(function(e) { + if (!maxReached) { + infinityRunner(); + } + }); - // Test initial page layout for trigger - infinityRunner(); - }); - }; + // Test initial page layout for trigger + infinityRunner(); + }); + }; })(jQuery); \ No newline at end of file