jquery-ias-es6
Version:
A jQuery plugin that turns your server-side pagination into an infinite scrolling one using AJAX
166 lines (135 loc) • 3.35 kB
JavaScript
/**
* IASCallbacks v2.3.1
* https://infiniteajaxscroll.com
*
* This file is part of the Infinite AJAX Scroll package
*
* Copyright 2014-2018 Webcreate (Jeroen Fiege)
*/
var IASCallbacks = function (aJquery) {
this.list = [];
this.fireStack = [];
this.isFiring = false;
this.isDisabled = false;
this.Deferred = aJquery.Deferred;
/**
* Calls all added callbacks
*
* @private
* @param args
*/
this.fire = function (args) {
var context = args[0],
deferred = args[1],
callbackArguments = args[2];
this.isFiring = true;
for (var i = 0, l = this.list.length; i < l; i++) {
if (this.list[i] != undefined) {
if (false === this.list[i].fn.apply(context, callbackArguments)) {
deferred.reject();
break;
}
}
}
this.isFiring = false;
deferred.resolve();
if (this.fireStack.length) {
this.fire(this.fireStack.shift());
}
};
/**
* Returns index of the callback in the list in a similar way as
* the indexOf function.
*
* @param callback
* @param {number} index index to start the search from
* @returns {number}
*/
this.inList = function (callback, index) {
index = index || 0;
for (var i = index, length = this.list.length; i < length; i++) {
if (this.list[i].fn === callback || (callback.guid && this.list[i].fn.guid && callback.guid === this.list[i].fn.guid)) {
return i;
}
}
return -1;
};
return this;
};
IASCallbacks.prototype = {
/**
* Adds a callback
*
* @param callback
* @returns {IASCallbacks}
* @param priority
*/
add: function (callback, priority) {
var callbackObject = {fn: callback, priority: priority};
priority = priority || 0;
for (var i = 0, length = this.list.length; i < length; i++) {
if (priority > this.list[i].priority) {
this.list.splice(i, 0, callbackObject);
return this;
}
}
this.list.push(callbackObject);
return this;
},
/**
* Removes a callback
*
* @param callback
* @returns {IASCallbacks}
*/
remove: function (callback) {
var index = 0;
while (( index = this.inList(callback, index) ) > -1) {
this.list.splice(index, 1);
}
return this;
},
/**
* Checks if callback is added
*
* @param callback
* @returns {*}
*/
has: function (callback) {
return (this.inList(callback) > -1);
},
/**
* Calls callbacks with a context
*
* @param context
* @param args
* @returns {object|void}
*/
fireWith: function (context, args) {
var deferred = this.Deferred();
if (this.isDisabled) {
return deferred.reject();
}
args = args || [];
args = [ context, deferred, args.slice ? args.slice() : args ];
if (this.isFiring) {
this.fireStack.push(args);
} else {
this.fire(args);
}
return deferred;
},
/**
* Disable firing of new events
*/
disable: function () {
this.isDisabled = true;
},
/**
* Enable firing of new events
*/
enable: function () {
this.isDisabled = false;
}
};
export default IASCallbacks;