scroll-lazy
Version:
Event emitter for lazy scrolling.
627 lines (497 loc) • 14.6 kB
JavaScript
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
var Lazy = __webpack_require__(1)
document.addEventListener('DOMContentLoaded', function(event) {
Lazy
.on(function(next) {
console.log('lazy')
document.getElementById('loading').style.opacity = 1
setTimeout(function() {
var element = document.createElement('div')
element.style.background = '#ccc'
element.style.margin = 10
element.style.height = Math.random() * 2000
document.body.appendChild(element)
document.getElementById('loading').style.opacity = 0
next()
},1000)
})
.watch({
threshold:function() {
return 4
},
scroll:function() {
return document.body.scrollTop
},
body:function() {
var height = document.body.offsetHeight
var style = getComputedStyle(document.body)
height += parseInt(style.marginTop) + parseInt(style.marginBottom)
return height
},
container:function() {
return window.innerHeight
},
})
})
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
(function webpackUniversalModuleDefinition(root, factory) {
if(true)
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["index"] = factory();
else
root["index"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
var EventEmitter = __webpack_require__(1)
var ee = new EventEmitter()
var exports = {}
var THRESHOLD = 10
var defaultHandler = {
check:function(callback) {
callback(null,this.body()-this.container() < this.scroll()+this.threshold())
},
container:function() {
return window.innerHeight
},
scroll:function() {
return document.body.scrollTop
},
body:function() {
return outerHeight(document.body)
}
}
var outerHeight = function(el) {
var height = el.offsetHeight
var style = getComputedStyle(el)
height += parseInt(style.marginTop) + parseInt(style.marginBottom)
return height
}
var value = function(arg) {
if(typeof arg === 'undefined') {
return value.apply(value,Array.prototype.slice.call(arguments,1))
} else if(typeof arg === 'function') {
return arg
} else {
return function() {
return arg
}
}
}
var _loop = function() {
this.check(function(err,isLazy) {
if(err) {
ee.emit('error',err)
return
}
if(isLazy) {
window.removeEventListener('scroll',loop)
ee.emit('lazy',function(err) {
window.addEventListener('scroll',loop)
loop()
})
}
})
}
var loop = _loop.bind(exports)
var watch = function(opt) {
if(!opt) opt = {}
this.opt = opt
this.check = value(opt.check,defaultHandler.check.bind(this))
this.container = value(opt.container,defaultHandler.container.bind(this))
this.scroll = value(opt.scroll,defaultHandler.scroll.bind(this))
this.body = value(opt.body,defaultHandler.body.bind(this))
this.threshold = value(opt.threshold,THRESHOLD)
window.addEventListener('scroll',loop)
loop()
return this
}
var on = function(listener) {
this.listener = listener
ee.on('lazy',listener)
return this
}
var off = function(listener) {
ee.off('lazy',listener||this.listener)
return this
}
exports.watch = watch.bind(exports)
exports.on = on.bind(exports)
exports.off = off.bind(exports)
module.exports = exports
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var d = __webpack_require__(2)
, callable = __webpack_require__(15)
, apply = Function.prototype.apply, call = Function.prototype.call
, create = Object.create, defineProperty = Object.defineProperty
, defineProperties = Object.defineProperties
, hasOwnProperty = Object.prototype.hasOwnProperty
, descriptor = { configurable: true, enumerable: false, writable: true }
, on, once, off, emit, methods, descriptors, base;
on = function (type, listener) {
var data;
callable(listener);
if (!hasOwnProperty.call(this, '__ee__')) {
data = descriptor.value = create(null);
defineProperty(this, '__ee__', descriptor);
descriptor.value = null;
} else {
data = this.__ee__;
}
if (!data[type]) data[type] = listener;
else if (typeof data[type] === 'object') data[type].push(listener);
else data[type] = [data[type], listener];
return this;
};
once = function (type, listener) {
var once, self;
callable(listener);
self = this;
on.call(this, type, once = function () {
off.call(self, type, once);
apply.call(listener, this, arguments);
});
once.__eeOnceListener__ = listener;
return this;
};
off = function (type, listener) {
var data, listeners, candidate, i;
callable(listener);
if (!hasOwnProperty.call(this, '__ee__')) return this;
data = this.__ee__;
if (!data[type]) return this;
listeners = data[type];
if (typeof listeners === 'object') {
for (i = 0; (candidate = listeners[i]); ++i) {
if ((candidate === listener) ||
(candidate.__eeOnceListener__ === listener)) {
if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
else listeners.splice(i, 1);
}
}
} else {
if ((listeners === listener) ||
(listeners.__eeOnceListener__ === listener)) {
delete data[type];
}
}
return this;
};
emit = function (type) {
var i, l, listener, listeners, args;
if (!hasOwnProperty.call(this, '__ee__')) return;
listeners = this.__ee__[type];
if (!listeners) return;
if (typeof listeners === 'object') {
l = arguments.length;
args = new Array(l - 1);
for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
listeners = listeners.slice();
for (i = 0; (listener = listeners[i]); ++i) {
apply.call(listener, this, args);
}
} else {
switch (arguments.length) {
case 1:
call.call(listeners, this);
break;
case 2:
call.call(listeners, this, arguments[1]);
break;
case 3:
call.call(listeners, this, arguments[1], arguments[2]);
break;
default:
l = arguments.length;
args = new Array(l - 1);
for (i = 1; i < l; ++i) {
args[i - 1] = arguments[i];
}
apply.call(listeners, this, args);
}
}
};
methods = {
on: on,
once: once,
off: off,
emit: emit
};
descriptors = {
on: d(on),
once: d(once),
off: d(off),
emit: d(emit)
};
base = defineProperties({}, descriptors);
module.exports = exports = function (o) {
return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
};
exports.methods = methods;
/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var assign = __webpack_require__(3)
, normalizeOpts = __webpack_require__(10)
, isCallable = __webpack_require__(11)
, contains = __webpack_require__(12)
, d;
d = module.exports = function (dscr, value/*, options*/) {
var c, e, w, options, desc;
if ((arguments.length < 2) || (typeof dscr !== 'string')) {
options = value;
value = dscr;
dscr = null;
} else {
options = arguments[2];
}
if (dscr == null) {
c = w = true;
e = false;
} else {
c = contains.call(dscr, 'c');
e = contains.call(dscr, 'e');
w = contains.call(dscr, 'w');
}
desc = { value: value, configurable: c, enumerable: e, writable: w };
return !options ? desc : assign(normalizeOpts(options), desc);
};
d.gs = function (dscr, get, set/*, options*/) {
var c, e, options, desc;
if (typeof dscr !== 'string') {
options = set;
set = get;
get = dscr;
dscr = null;
} else {
options = arguments[3];
}
if (get == null) {
get = undefined;
} else if (!isCallable(get)) {
options = get;
get = set = undefined;
} else if (set == null) {
set = undefined;
} else if (!isCallable(set)) {
options = set;
set = undefined;
}
if (dscr == null) {
c = true;
e = false;
} else {
c = contains.call(dscr, 'c');
e = contains.call(dscr, 'e');
}
desc = { get: get, set: set, configurable: c, enumerable: e };
return !options ? desc : assign(normalizeOpts(options), desc);
};
/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
module.exports = __webpack_require__(4)()
? Object.assign
: __webpack_require__(5);
/***/ },
/* 4 */
/***/ function(module, exports) {
'use strict';
module.exports = function () {
var assign = Object.assign, obj;
if (typeof assign !== 'function') return false;
obj = { foo: 'raz' };
assign(obj, { bar: 'dwa' }, { trzy: 'trzy' });
return (obj.foo + obj.bar + obj.trzy) === 'razdwatrzy';
};
/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var keys = __webpack_require__(6)
, value = __webpack_require__(9)
, max = Math.max;
module.exports = function (dest, src/*, …srcn*/) {
var error, i, l = max(arguments.length, 2), assign;
dest = Object(value(dest));
assign = function (key) {
try { dest[key] = src[key]; } catch (e) {
if (!error) error = e;
}
};
for (i = 1; i < l; ++i) {
src = arguments[i];
keys(src).forEach(assign);
}
if (error !== undefined) throw error;
return dest;
};
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
module.exports = __webpack_require__(7)()
? Object.keys
: __webpack_require__(8);
/***/ },
/* 7 */
/***/ function(module, exports) {
'use strict';
module.exports = function () {
try {
Object.keys('primitive');
return true;
} catch (e) { return false; }
};
/***/ },
/* 8 */
/***/ function(module, exports) {
'use strict';
var keys = Object.keys;
module.exports = function (object) {
return keys(object == null ? object : Object(object));
};
/***/ },
/* 9 */
/***/ function(module, exports) {
'use strict';
module.exports = function (value) {
if (value == null) throw new TypeError("Cannot use null or undefined");
return value;
};
/***/ },
/* 10 */
/***/ function(module, exports) {
'use strict';
var forEach = Array.prototype.forEach, create = Object.create;
var process = function (src, obj) {
var key;
for (key in src) obj[key] = src[key];
};
module.exports = function (options/*, …options*/) {
var result = create(null);
forEach.call(arguments, function (options) {
if (options == null) return;
process(Object(options), result);
});
return result;
};
/***/ },
/* 11 */
/***/ function(module, exports) {
// Deprecated
'use strict';
module.exports = function (obj) { return typeof obj === 'function'; };
/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
module.exports = __webpack_require__(13)()
? String.prototype.contains
: __webpack_require__(14);
/***/ },
/* 13 */
/***/ function(module, exports) {
'use strict';
var str = 'razdwatrzy';
module.exports = function () {
if (typeof str.contains !== 'function') return false;
return ((str.contains('dwa') === true) && (str.contains('foo') === false));
};
/***/ },
/* 14 */
/***/ function(module, exports) {
'use strict';
var indexOf = String.prototype.indexOf;
module.exports = function (searchString/*, position*/) {
return indexOf.call(this, searchString, arguments[1]) > -1;
};
/***/ },
/* 15 */
/***/ function(module, exports) {
'use strict';
module.exports = function (fn) {
if (typeof fn !== 'function') throw new TypeError(fn + " is not a function");
return fn;
};
/***/ }
/******/ ])
});
;
/***/ }
/******/ ]);