-
Notifications
You must be signed in to change notification settings - Fork 3
/
infinitus.jquery.js
71 lines (60 loc) · 1.99 KB
/
infinitus.jquery.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
* Project: Infinitus Scroll
* Description: A super tiny jQuery plugin to implement infinite scrolling.
* Author: Rick Pastoor ([email protected])
* License: MIT
*/
;(function ($, window, document, undefined) {
"use strict";
// Set up defaults
var pluginName = "infinitus";
var defaults = {
trigger: $.noop,
onStart: $.noop,
onEnd: $.noop
};
/**
* Construct Infinitus
*/
function Infinitus(element, options) {
this.element = $(element);
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.window = $(window);
this.working = false;
this.init();
}
Infinitus.prototype = {
init: function() {
var self = this;
self.window.on('scroll', function() {
if (!self.working && self.isAtBottom()) {
// Start working
self.working = true;
// Call onStart
$.proxy(self.options.onStart, self.element)();
$.proxy(self.options.trigger, self.element, function() {
// End working
self.working = false;
// Call onEnd
$.proxy(self.options.onEnd, self.element)();
})();
}
});
},
isAtBottom: function() {
var contentOffset = this.element.offset(),
elementBottom = this.element.height() + contentOffset.top,
scrollBottom = this.window.scrollTop() + this.window.height();
return scrollBottom >= elementBottom;
}
};
$.fn[pluginName] = function(options) {
return this.each(function () {
if (!$.data(this, "plugin_" + pluginName)) {
$.data(this, "plugin_" + pluginName, new Infinitus(this, options));
}
});
};
})(jQuery, window, document);