2018-10-23 01:05:09 +03:00
|
|
|
define(["require", "browser"], function(require, browser) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function LazyLoader(options) {
|
|
|
|
this.options = options
|
|
|
|
}
|
|
|
|
|
|
|
|
function unveilElements(elements, root, callback) {
|
|
|
|
if (elements.length) {
|
|
|
|
new LazyLoader({
|
|
|
|
callback: callback
|
|
|
|
}).addElements(elements)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return browser.edge && require(["css!./lazyedgehack"]), LazyLoader.prototype.createObserver = function() {
|
|
|
|
var observerOptions = {},
|
|
|
|
options = this.options,
|
|
|
|
loadedCount = 0,
|
|
|
|
callback = options.callback;
|
|
|
|
observerOptions.rootMargin = "50%";
|
|
|
|
var observerId = "obs" + (new Date).getTime(),
|
|
|
|
self = this,
|
|
|
|
observer = new IntersectionObserver(function(entries) {
|
|
|
|
for (var j = 0, length2 = entries.length; j < length2; j++) {
|
|
|
|
var entry = entries[j];
|
|
|
|
if (entry.intersectionRatio > 0) {
|
|
|
|
var target = entry.target;
|
|
|
|
observer.unobserve(target), target[observerId] || (target[observerId] = 1, callback(target), ++loadedCount >= self.elementCount && self.destroyObserver())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, observerOptions);
|
|
|
|
this.observer = observer
|
|
|
|
}, LazyLoader.prototype.addElements = function(elements) {
|
|
|
|
var observer = this.observer;
|
|
|
|
observer || (this.createObserver(), observer = this.observer), this.elementCount = (this.elementCount || 0) + elements.length;
|
|
|
|
for (var i = 0, length = elements.length; i < length; i++) observer.observe(elements[i])
|
|
|
|
}, LazyLoader.prototype.destroyObserver = function(elements) {
|
|
|
|
var observer = this.observer;
|
|
|
|
observer && (observer.disconnect(), this.observer = null)
|
|
|
|
}, LazyLoader.prototype.destroy = function(elements) {
|
|
|
|
this.destroyObserver(), this.options = null
|
|
|
|
}, LazyLoader.lazyChildren = function(elem, callback) {
|
|
|
|
unveilElements(elem.getElementsByClassName("lazy"), elem, callback)
|
|
|
|
}, LazyLoader
|
|
|
|
});
|