123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /**
- * Endless Scroll plugin for jQuery
- *
- * v1.4.8
- *
- * Copyright (c) 2008 Fred Wu
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
- /**
- * Usage:
- *
- * // using default options
- * $(document).endlessScroll();
- *
- * // using some custom options
- * $(document).endlessScroll({
- * fireOnce: false,
- * fireDelay: false,
- * loader: "<div class=\"loading\"><div>",
- * callback: function(){
- * alert("test");
- * }
- * });
- *
- * Configuration options:
- *
- * bottomPixels integer the number of pixels from the bottom of the page that triggers the event
- * fireOnce boolean only fire once until the execution of the current event is completed
- * fireDelay integer delay the subsequent firing, in milliseconds, 0 or false to disable delay
- * loader string the HTML to be displayed during loading
- * data string|function plain HTML data, can be either a string or a function that returns a string,
- * when passed as a function it accepts one argument: fire sequence (the number
- * of times the event triggered during the current page session)
- * insertAfter string jQuery selector syntax: where to put the loader as well as the plain HTML data
- * callback function callback function, accepts one argument: fire sequence (the number of times
- * the event triggered during the current page session)
- * resetCounter function resets the fire sequence counter if the function returns true, this function
- * could also perform hook actions since it is applied at the start of the event
- * ceaseFire function stops the event (no more endless scrolling) if the function returns true
- *
- * Usage tips:
- *
- * The plugin is more useful when used with the callback function, which can then make AJAX calls to retrieve content.
- * The fire sequence argument (for the callback function) is useful for 'pagination'-like features.
- */
- (function($){
- $.fn.endlessScroll = function(options) {
- var defaults = {
- bottomPixels: 50,
- fireOnce: true,
- fireDelay: 150,
- loader: "<br />Loading...<br />",
- data: "",
- insertAfter: "div:last",
- resetCounter: function() { return false; },
- callback: function() { return true; },
- ceaseFire: function() { return false; }
- };
- var options = $.extend({}, defaults, options);
- var firing = true;
- var fired = false;
- var fireSequence = 0;
- if (options.ceaseFire.apply(this) === true) {
- firing = false;
- }
- if (firing === true) {
- $(this).scroll(function() {
- if (options.ceaseFire.apply(this) === true) {
- firing = false;
- return; // Scroll will still get called, but nothing will happen
- }
- if (this == document || this == window) {
- var is_scrollable = $(document).height() - $(window).height() <= $(window).scrollTop() + options.bottomPixels;
- } else {
- // calculates the actual height of the scrolling container
- var inner_wrap = $(".endless_scroll_inner_wrap", this);
- if (inner_wrap.length == 0) {
- inner_wrap = $(this).wrapInner("<div class=\"endless_scroll_inner_wrap\" />").find(".endless_scroll_inner_wrap");
- }
- var is_scrollable = inner_wrap.length > 0 &&
- (inner_wrap.height() - $(this).height() <= $(this).scrollTop() + options.bottomPixels);
- }
- if (is_scrollable && (options.fireOnce == false || (options.fireOnce == true && fired != true))) {
- if (options.resetCounter.apply(this) === true) fireSequence = 0;
- fired = true;
- fireSequence++;
- $(options.insertAfter).after("<div id=\"endless_scroll_loader\">" + options.loader + "</div>");
- data = typeof options.data == 'function' ? options.data.apply(this, [fireSequence]) : options.data;
- if (data !== false) {
- $(options.insertAfter).after("<div id=\"endless_scroll_data\">" + data + "</div>");
- $("div#endless_scroll_data").hide().fadeIn();
- $("div#endless_scroll_data").removeAttr("id");
- options.callback.apply(this, [fireSequence]);
- if (options.fireDelay !== false || options.fireDelay !== 0) {
- $("body").after("<div id=\"endless_scroll_marker\"></div>");
- // slight delay for preventing event firing twice
- $("div#endless_scroll_marker").fadeTo(options.fireDelay, 1, function() {
- $(this).remove();
- fired = false;
- });
- }
- else {
- fired = false;
- }
- }
- $("div#endless_scroll_loader").remove();
- }
- });
- }
- };
- })(jQuery);
|