Image lazy loader
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
4.1 KiB

11 years ago
/*! Echo v1.5.0 | (c) 2014 @toddmotto | MIT license | github.com/toddmotto/echo */
window.Echo = (function (global, document, undefined) {
11 years ago
'use strict';
11 years ago
/**
* toBeLoaded
11 years ago
* @type {Array}
*/
var toBeLoaded = [];
11 years ago
/**
* toBeUnloaded
* @type {Array}
*/
var toBeUnloaded = [];
11 years ago
/**
* callback - initialized to a no-op so that no validations on it's presence need to be made
* @type {Function}
*/
var callback = function(){};
/**
* offsetBot, offsetTop throttle, poll, unload vars
11 years ago
*/
var offsetBot, offsetTop, throttle, poll, unload;
11 years ago
/**
* _inView
* @private
* @param {Element} element Image element
* @returns {Boolean} Is element in viewport
*/
var _inView = function (element) {
var coords = element.getBoundingClientRect();
var topInView = coords.top >= 0 && coords.left >= 0 && coords.top <= (window.innerHeight || document.documentElement.clientHeight) + offsetBot && coords.top >= -1 * offsetTop;
var botInView = coords.bottom >= -1 * offsetTop && coords.left >= 0 && coords.bottom <= (window.innerHeight || document.documentElement.clientHeight) + offsetBot;
return topInView || botInView;
11 years ago
};
11 years ago
/**
* _pollImages Loop through the images if present
* or remove all event listeners
* @private
*/
11 years ago
var _pollImages = function () {
var loadingLength = toBeLoaded.length,
unloadingLength,
i,
self;
if (loadingLength > 0) {
for (i = 0; i < loadingLength; i++) {
self = toBeLoaded[i];
11 years ago
if (self && _inView(self)) {
if(unload) {
self.setAttribute('data-echo-placeholder', self.src);
toBeUnloaded.push(self);
}
11 years ago
self.src = self.getAttribute('data-echo');
callback(self, 'load');
toBeLoaded.splice(i, 1);
loadingLength = toBeLoaded.length;
11 years ago
i--;
}
}
}
unloadingLength = toBeUnloaded.length;
if (unloadingLength > 0) {
for(i = 0; i < unloadingLength; i++) {
self = toBeUnloaded[i];
if (self && !_inView(self)) {
self.src = self.getAttribute('data-echo-placeholder');
callback(self, 'unload');
toBeUnloaded.splice(i, 1);
unloadingLength = toBeUnloaded.length;
i--;
toBeLoaded.push(self);
}
11 years ago
}
}
if(unloadingLength === 0 && loadingLength === 0) {
detach();
11 years ago
}
};
11 years ago
/**
* _throttle Sensible event firing
* @private
*/
var _throttle = function () {
clearTimeout(poll);
poll = setTimeout(_pollImages, throttle);
};
11 years ago
/**
* init Module init function
* @param {Object} [obj] Passed in Object with options
* @param {Number|String} [obj.throttle]
* @param {Number|String} [obj.offset]
* @param {Number|String} [obj.offsetBot]
* @param {Number|String} [obj.offsetTop]
* @param {Boolean} [obj.unload]
* @param {Function} [obj.callback]
11 years ago
*/
var init = function (obj) {
11 years ago
var nodes = document.querySelectorAll('[data-echo]');
var opts = obj || {};
var offset = parseInt(opts.offset || 0);
offsetBot = parseInt(opts.offsetBot || offset);
offsetTop = parseInt(opts.offsetTop || offset);
11 years ago
throttle = parseInt(opts.throttle || 250);
unload = !!opts.unload;
callback = opts.callback || callback;
toBeLoaded = [];
toBeUnloaded = [];
for (var i = 0; i < nodes.length; i++) {
toBeLoaded.push(nodes[i]);
}
11 years ago
_pollImages();
11 years ago
if (document.addEventListener) {
11 years ago
global.addEventListener('scroll', _throttle, false);
global.addEventListener('load', _throttle, false);
} else {
11 years ago
global.attachEvent('onscroll', _throttle);
global.attachEvent('onload', _throttle);
}
11 years ago
11 years ago
};
/**
* detach remove listeners
*/
var detach = function() {
if (document.removeEventListener) {
global.removeEventListener('scroll', _throttle);
} else {
global.detachEvent('onscroll', _throttle);
}
clearTimeout(poll);
};
11 years ago
/**
* return Public methods
* @returns {Object}
*/
11 years ago
return {
init: init,
detach: detach,
11 years ago
render: _pollImages
11 years ago
};
11 years ago
})(this, document);