diff options
Diffstat (limited to 'resources/lib/jquery/jquery.appear.js')
-rw-r--r-- | resources/lib/jquery/jquery.appear.js | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/resources/lib/jquery/jquery.appear.js b/resources/lib/jquery/jquery.appear.js new file mode 100644 index 00000000..4f77886c --- /dev/null +++ b/resources/lib/jquery/jquery.appear.js @@ -0,0 +1,138 @@ +/* + * jQuery.appear + * http://code.google.com/p/jquery-appear/ + * + * Copyright (c) 2009 Michael Hixson + * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +*/ +(function($) { + + $.fn.appear = function(fn, options) { + + var settings = $.extend({ + + //arbitrary data to pass to fn + data: undefined, + + //call fn only on the first appear? + one: true + + }, options); + + return this.each(function() { + + var t = $(this); + + //whether the element is currently visible + t.appeared = false; + + if (!fn) { + + //trigger the custom event + t.trigger('appear', settings.data); + return; + } + + var w = $(window); + + //fires the appear event when appropriate + var check = function() { + + //is the element hidden? + if (!t.is(':visible')) { + + //it became hidden + t.appeared = false; + return; + } + + //is the element inside the visible window? + var a = w.scrollLeft(); + var b = w.scrollTop(); + var o = t.offset(); + var x = o.left; + var y = o.top; + + if (y + t.height() >= b && + y <= b + w.height() && + x + t.width() >= a && + x <= a + w.width()) { + + //trigger the custom event + if (!t.appeared) t.trigger('appear', settings.data); + + } else { + + //it scrolled out of view + t.appeared = false; + } + }; + + //create a modified fn with some additional logic + var modifiedFn = function() { + + //mark the element as visible + t.appeared = true; + + //is this supposed to happen only once? + if (settings.one) { + + //remove the check + w.unbind('scroll', check); + var i = $.inArray(check, $.fn.appear.checks); + if (i >= 0) $.fn.appear.checks.splice(i, 1); + } + + //trigger the original fn + fn.apply(this, arguments); + }; + + //bind the modified fn to the element + if (settings.one) t.one('appear', settings.data, modifiedFn); + else t.bind('appear', settings.data, modifiedFn); + + //check whenever the window scrolls + w.scroll(check); + + //check whenever the dom changes + $.fn.appear.checks.push(check); + + //check now + (check)(); + }); + }; + + //keep a queue of appearance checks + $.extend($.fn.appear, { + + checks: [], + timeout: null, + + //process the queue + checkAll: function() { + var length = $.fn.appear.checks.length; + if (length > 0) while (length--) ($.fn.appear.checks[length])(); + }, + + //check the queue asynchronously + run: function() { + if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout); + $.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20); + } + }); + + //run checks when these methods are called + $.each(['append', 'prepend', 'after', 'before', 'attr', + 'removeAttr', 'addClass', 'removeClass', 'toggleClass', + 'remove', 'css', 'show', 'hide'], function(i, n) { + var old = $.fn[n]; + if (old) { + $.fn[n] = function() { + var r = old.apply(this, arguments); + $.fn.appear.run(); + return r; + } + } + }); + +})(jQuery);
\ No newline at end of file |