jquery-ias-es6
Version:
A jQuery plugin that turns your server-side pagination into an infinite scrolling one using AJAX
225 lines (180 loc) • 4.78 kB
JavaScript
/**
* IAS History Extension
* An IAS extension to enable browser history
* https://infiniteajaxscroll.com
*
* This file is part of the Infinite AJAX Scroll package
*
* Copyright 2014-2018 Webcreate (Jeroen Fiege)
*/
import IASCallbacks from '../callbacks';
var IASHistoryExtension = function (options) {
options = jQuery.extend({}, this.defaults, options);
this.ias = null;
this.prevSelector = options.prev;
this.prevUrl = null;
this.listeners = {
prev: new IASCallbacks(jQuery)
};
/**
* @private
* @param pageNum
* @param scrollOffset
* @param url
*/
this.onPageChange = function (pageNum, scrollOffset, url) {
if (!window.history || !window.history.replaceState) {
return;
}
var state = history.state;
history.replaceState(state, document.title, url);
};
/**
* @private
* @param currentScrollOffset
* @param scrollThreshold
*/
this.onScroll = function (currentScrollOffset, scrollThreshold) {
var firstItemScrollThreshold = this.getScrollThresholdFirstItem();
if (!this.prevUrl) {
return;
}
currentScrollOffset -= this.ias.$scrollContainer.height();
if (currentScrollOffset <= firstItemScrollThreshold) {
this.prev();
}
};
this.onReady = function () {
var currentScrollOffset = this.ias.getCurrentScrollOffset(this.ias.$scrollContainer),
firstItemScrollThreshold = this.getScrollThresholdFirstItem();
currentScrollOffset -= this.ias.$scrollContainer.height();
if (currentScrollOffset <= firstItemScrollThreshold) {
this.prev();
}
};
/**
* Returns the url for the next page
*
* @private
*/
this.getPrevUrl = function (container) {
if (!container) {
container = this.ias.$container;
}
// always take the last matching item
return jQuery(this.prevSelector, container).last().attr('href');
};
/**
* Returns scroll threshold. This threshold marks the line from where
* IAS should start loading the next page.
*
* @private
* @return {number}
*/
this.getScrollThresholdFirstItem = function () {
var $firstElement;
$firstElement = this.ias.getFirstItem();
// if the don't have a first element, the DOM might not have been loaded,
// or the selector is invalid
if (0 === $firstElement.length) {
return -1;
}
return ($firstElement.offset().top);
};
/**
* Renders items
*
* @private
* @param items
* @param callback
*/
this.renderBefore = function (items, callback) {
var ias = this.ias,
$firstItem = ias.getFirstItem(),
count = 0;
ias.fire('render', [items]);
jQuery(items).hide(); // at first, hide it so we can fade it in later
$firstItem.before(items);
jQuery(items).fadeIn(400, function () {
if (++count < items.length) {
return;
}
ias.fire('rendered', [items]);
if (callback) {
callback();
}
});
};
return this;
};
/**
* @public
*/
IASHistoryExtension.prototype.initialize = function (ias) {
var self = this;
this.ias = ias;
// expose the extensions listeners
jQuery.extend(ias.listeners, this.listeners);
// expose prev method
ias.prev = function() {
return self.prev();
};
this.prevUrl = this.getPrevUrl();
};
/**
* Bind to events
*
* @public
* @param ias
*/
IASHistoryExtension.prototype.bind = function (ias) {
ias.on('pageChange', jQuery.proxy(this.onPageChange, this));
ias.on('scroll', jQuery.proxy(this.onScroll, this));
ias.on('ready', jQuery.proxy(this.onReady, this));
};
/**
* @public
* @param {object} ias
*/
IASHistoryExtension.prototype.unbind = function(ias) {
ias.off('pageChange', this.onPageChange);
ias.off('scroll', this.onScroll);
ias.off('ready', this.onReady);
};
/**
* Load the prev page
*
* @public
*/
IASHistoryExtension.prototype.prev = function () {
var url = this.prevUrl,
self = this,
ias = this.ias;
if (!url) {
return false;
}
ias.pause();
var promise = ias.fire('prev', [url]);
promise.done(function () {
ias.load(url, function (data, items) {
self.renderBefore(items, function () {
self.prevUrl = self.getPrevUrl(data);
ias.resume();
if (self.prevUrl) {
self.prev();
}
});
});
});
promise.fail(function () {
ias.resume();
});
return true;
};
/**
* @public
*/
IASHistoryExtension.prototype.defaults = {
prev: ".prev"
};
export default IASHistoryExtension;