-
-
Notifications
You must be signed in to change notification settings - Fork 675
/
lazyload.js
92 lines (81 loc) · 2.6 KB
/
lazyload.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { getExtendedSettings } from "./defaults";
import { autoInitialize } from "./autoInitialize";
import { load } from "./load";
import { setObserver, updateObserver } from "./intersectionObserver";
import { isBot, runningOnBrowser } from "./environment";
import { loadAllNative, shouldUseNative } from "./native";
import { resetOnlineCheck, setOnlineCheck } from "./online";
import { getElementsToLoad, queryElements } from "./dom";
import { resetStatus } from "./data";
import { setToLoadCount } from "./counters";
import { unobserve } from "./unobserve";
import { restore } from "./restore";
import { deleteOriginalAttrs } from "./originalAttributes";
const LazyLoad = function(customSettings, elements) {
const settings = getExtendedSettings(customSettings);
this._settings = settings;
this.loadingCount = 0;
setObserver(settings, this);
setOnlineCheck(settings, this);
this.update(elements);
};
LazyLoad.prototype = {
update: function(givenNodeset) {
const settings = this._settings;
const elementsToLoad = getElementsToLoad(givenNodeset, settings);
setToLoadCount(this, elementsToLoad.length);
if (isBot) {
this.loadAll(elementsToLoad);
return;
}
if (shouldUseNative(settings)) {
loadAllNative(elementsToLoad, settings, this);
return;
}
updateObserver(this._observer, elementsToLoad);
},
destroy: function() {
// Observer
if (this._observer) {
this._observer.disconnect();
}
// Clean handlers
resetOnlineCheck(this);
// Clean custom attributes on elements
queryElements(this._settings).forEach((element) => {
deleteOriginalAttrs(element);
});
// Delete all internal props
delete this._observer;
delete this._settings;
delete this._onlineHandler;
delete this.loadingCount;
delete this.toLoadCount;
},
loadAll: function(elements) {
const settings = this._settings;
const elementsToLoad = getElementsToLoad(elements, settings);
elementsToLoad.forEach((element) => {
unobserve(element, this);
load(element, settings, this);
});
},
restoreAll: function() {
const settings = this._settings;
queryElements(settings).forEach((element) => {
restore(element, settings);
});
}
};
LazyLoad.load = (element, customSettings) => {
const settings = getExtendedSettings(customSettings);
load(element, settings);
};
LazyLoad.resetStatus = (element) => {
resetStatus(element);
};
// Automatic instances creation if required (useful for async script loading)
if (runningOnBrowser) {
autoInitialize(LazyLoad, window.lazyLoadOptions);
}
export default LazyLoad;