forked from sam/fedifeed
1012 lines
34 KiB
JavaScript
1012 lines
34 KiB
JavaScript
/*!
|
|
* Infinite Scroll PACKAGED v4.0.1
|
|
* Automatically add next page
|
|
*
|
|
* Licensed GPLv3 for open source use
|
|
* or Infinite Scroll Commercial License for commercial use
|
|
*
|
|
* https://infinite-scroll.com
|
|
* Copyright 2018-2020 Metafizzy
|
|
*/
|
|
!(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("jquery")))
|
|
: (t.jQueryBridget = e(t, t.jQuery));
|
|
})(window, function (t, e) {
|
|
let i = t.console,
|
|
n =
|
|
void 0 === i
|
|
? function () {}
|
|
: function (t) {
|
|
i.error(t);
|
|
};
|
|
return function (i, o, s) {
|
|
(s = s || e || t.jQuery) &&
|
|
(o.prototype.option ||
|
|
(o.prototype.option = function (t) {
|
|
t && (this.options = Object.assign(this.options || {}, t));
|
|
}),
|
|
(s.fn[i] = function (t, ...e) {
|
|
return "string" == typeof t
|
|
? (function (t, e, o) {
|
|
let r,
|
|
l = `$().${i}("${e}")`;
|
|
return (
|
|
t.each(function (t, h) {
|
|
let a = s.data(h, i);
|
|
if (!a)
|
|
return void n(
|
|
`${i} not initialized. Cannot call method ${l}`
|
|
);
|
|
let c = a[e];
|
|
if (!c || "_" == e.charAt(0))
|
|
return void n(`${l} is not a valid method`);
|
|
let u = c.apply(a, o);
|
|
r = void 0 === r ? u : r;
|
|
}),
|
|
void 0 !== r ? r : t
|
|
);
|
|
})(this, t, e)
|
|
: ((r = t),
|
|
this.each(function (t, e) {
|
|
let n = s.data(e, i);
|
|
n
|
|
? (n.option(r), n._init())
|
|
: ((n = new o(e, r)), s.data(e, i, n));
|
|
}),
|
|
this);
|
|
var r;
|
|
}));
|
|
};
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e())
|
|
: (t.EvEmitter = e());
|
|
})("undefined" != typeof window ? window : this, function () {
|
|
function t() {}
|
|
let e = t.prototype;
|
|
return (
|
|
(e.on = function (t, e) {
|
|
if (!t || !e) return this;
|
|
let i = (this._events = this._events || {}),
|
|
n = (i[t] = i[t] || []);
|
|
return n.includes(e) || n.push(e), this;
|
|
}),
|
|
(e.once = function (t, e) {
|
|
if (!t || !e) return this;
|
|
this.on(t, e);
|
|
let i = (this._onceEvents = this._onceEvents || {});
|
|
return ((i[t] = i[t] || {})[e] = !0), this;
|
|
}),
|
|
(e.off = function (t, e) {
|
|
let i = this._events && this._events[t];
|
|
if (!i || !i.length) return this;
|
|
let n = i.indexOf(e);
|
|
return -1 != n && i.splice(n, 1), this;
|
|
}),
|
|
(e.emitEvent = function (t, e) {
|
|
let i = this._events && this._events[t];
|
|
if (!i || !i.length) return this;
|
|
(i = i.slice(0)), (e = e || []);
|
|
let n = this._onceEvents && this._onceEvents[t];
|
|
for (let o of i) {
|
|
n && n[o] && (this.off(t, o), delete n[o]), o.apply(this, e);
|
|
}
|
|
return this;
|
|
}),
|
|
(e.allOff = function () {
|
|
return delete this._events, delete this._onceEvents, this;
|
|
}),
|
|
t
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t))
|
|
: (t.fizzyUIUtils = e(t));
|
|
})(this, function (t) {
|
|
let e = {
|
|
extend: function (t, e) {
|
|
return Object.assign(t, e);
|
|
},
|
|
modulo: function (t, e) {
|
|
return ((t % e) + e) % e;
|
|
},
|
|
makeArray: function (t) {
|
|
if (Array.isArray(t)) return t;
|
|
if (null == t) return [];
|
|
return "object" == typeof t && "number" == typeof t.length
|
|
? [...t]
|
|
: [t];
|
|
},
|
|
removeFrom: function (t, e) {
|
|
let i = t.indexOf(e);
|
|
-1 != i && t.splice(i, 1);
|
|
},
|
|
getParent: function (t, e) {
|
|
for (; t.parentNode && t != document.body; )
|
|
if ((t = t.parentNode).matches(e)) return t;
|
|
},
|
|
getQueryElement: function (t) {
|
|
return "string" == typeof t ? document.querySelector(t) : t;
|
|
},
|
|
handleEvent: function (t) {
|
|
let e = "on" + t.type;
|
|
this[e] && this[e](t);
|
|
},
|
|
filterFindElements: function (t, i) {
|
|
return (t = e.makeArray(t))
|
|
.filter((t) => t instanceof HTMLElement)
|
|
.reduce((t, e) => {
|
|
if (!i) return t.push(e), t;
|
|
e.matches(i) && t.push(e);
|
|
let n = e.querySelectorAll(i);
|
|
return (t = t.concat(...n));
|
|
}, []);
|
|
},
|
|
debounceMethod: function (t, e, i) {
|
|
i = i || 100;
|
|
let n = t.prototype[e],
|
|
o = e + "Timeout";
|
|
t.prototype[e] = function () {
|
|
clearTimeout(this[o]);
|
|
let t = arguments;
|
|
this[o] = setTimeout(() => {
|
|
n.apply(this, t), delete this[o];
|
|
}, i);
|
|
};
|
|
},
|
|
docReady: function (t) {
|
|
let e = document.readyState;
|
|
"complete" == e || "interactive" == e
|
|
? setTimeout(t)
|
|
: document.addEventListener("DOMContentLoaded", t);
|
|
},
|
|
toDashed: function (t) {
|
|
return t
|
|
.replace(/(.)([A-Z])/g, function (t, e, i) {
|
|
return e + "-" + i;
|
|
})
|
|
.toLowerCase();
|
|
},
|
|
},
|
|
i = t.console;
|
|
return (
|
|
(e.htmlInit = function (n, o) {
|
|
e.docReady(function () {
|
|
let s = "data-" + e.toDashed(o),
|
|
r = document.querySelectorAll(`[${s}]`),
|
|
l = t.jQuery;
|
|
[...r].forEach((t) => {
|
|
let e,
|
|
r = t.getAttribute(s);
|
|
try {
|
|
e = r && JSON.parse(r);
|
|
} catch (e) {
|
|
return void (
|
|
i && i.error(`Error parsing ${s} on ${t.className}: ${e}`)
|
|
);
|
|
}
|
|
let h = new n(t, e);
|
|
l && l.data(t, o, h);
|
|
});
|
|
});
|
|
}),
|
|
e
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(
|
|
t,
|
|
require("ev-emitter"),
|
|
require("fizzy-ui-utils")
|
|
))
|
|
: (t.InfiniteScroll = e(t, t.EvEmitter, t.fizzyUIUtils));
|
|
})(window, function (t, e, i) {
|
|
let n = t.jQuery,
|
|
o = {};
|
|
function s(t, e) {
|
|
let r = i.getQueryElement(t);
|
|
if (r) {
|
|
if ((t = r).infiniteScrollGUID) {
|
|
let i = o[t.infiniteScrollGUID];
|
|
return i.option(e), i;
|
|
}
|
|
(this.element = t),
|
|
(this.options = { ...s.defaults }),
|
|
this.option(e),
|
|
n && (this.$element = n(this.element)),
|
|
this.create();
|
|
} else console.error("Bad element for InfiniteScroll: " + (r || t));
|
|
}
|
|
(s.defaults = {}), (s.create = {}), (s.destroy = {});
|
|
let r = s.prototype;
|
|
Object.assign(r, e.prototype);
|
|
let l = 0;
|
|
(r.create = function () {
|
|
let t = (this.guid = ++l);
|
|
if (
|
|
((this.element.infiniteScrollGUID = t),
|
|
(o[t] = this),
|
|
(this.pageIndex = 1),
|
|
(this.loadCount = 0),
|
|
this.updateGetPath(),
|
|
this.getPath && this.getPath())
|
|
) {
|
|
this.updateGetAbsolutePath(),
|
|
this.log("initialized", [this.element.className]),
|
|
this.callOnInit();
|
|
for (let t in s.create) s.create[t].call(this);
|
|
} else console.error("Disabling InfiniteScroll");
|
|
}),
|
|
(r.option = function (t) {
|
|
Object.assign(this.options, t);
|
|
}),
|
|
(r.callOnInit = function () {
|
|
let t = this.options.onInit;
|
|
t && t.call(this, this);
|
|
}),
|
|
(r.dispatchEvent = function (t, e, i) {
|
|
this.log(t, i);
|
|
let o = e ? [e].concat(i) : i;
|
|
if ((this.emitEvent(t, o), !n || !this.$element)) return;
|
|
let s = (t += ".infiniteScroll");
|
|
if (e) {
|
|
let i = n.Event(e);
|
|
(i.type = t), (s = i);
|
|
}
|
|
this.$element.trigger(s, i);
|
|
});
|
|
let h = {
|
|
initialized: (t) => `on ${t}`,
|
|
request: (t) => `URL: ${t}`,
|
|
load: (t, e) => `${t.title || ""}. URL: ${e}`,
|
|
error: (t, e) => `${t}. URL: ${e}`,
|
|
append: (t, e, i) => `${i.length} items. URL: ${e}`,
|
|
last: (t, e) => `URL: ${e}`,
|
|
history: (t, e) => `URL: ${e}`,
|
|
pageIndex: function (t, e) {
|
|
return `current page determined to be: ${t} from ${e}`;
|
|
},
|
|
};
|
|
(r.log = function (t, e) {
|
|
if (!this.options.debug) return;
|
|
let i = `[InfiniteScroll] ${t}`,
|
|
n = h[t];
|
|
n && (i += ". " + n.apply(this, e)), console.log(i);
|
|
}),
|
|
(r.updateMeasurements = function () {
|
|
this.windowHeight = t.innerHeight;
|
|
let e = this.element.getBoundingClientRect();
|
|
this.top = e.top + t.scrollY;
|
|
}),
|
|
(r.updateScroller = function () {
|
|
let e = this.options.elementScroll;
|
|
if (e) {
|
|
if (
|
|
((this.scroller = !0 === e ? this.element : i.getQueryElement(e)),
|
|
!this.scroller)
|
|
)
|
|
throw new Error(`Unable to find elementScroll: ${e}`);
|
|
} else this.scroller = t;
|
|
}),
|
|
(r.updateGetPath = function () {
|
|
let t = this.options.path;
|
|
if (!t)
|
|
return void console.error(
|
|
`InfiniteScroll path option required. Set as: ${t}`
|
|
);
|
|
let e = typeof t;
|
|
"function" != e
|
|
? "string" == e && t.match("{{#}}")
|
|
? this.updateGetPathTemplate(t)
|
|
: this.updateGetPathSelector(t)
|
|
: (this.getPath = t);
|
|
}),
|
|
(r.updateGetPathTemplate = function (t) {
|
|
this.getPath = () => {
|
|
let e = this.pageIndex + 1;
|
|
return t.replace("{{#}}", e);
|
|
};
|
|
let e = t.replace(/(\\\?|\?)/, "\\?").replace("{{#}}", "(\\d\\d?\\d?)"),
|
|
i = new RegExp(e),
|
|
n = location.href.match(i);
|
|
n &&
|
|
((this.pageIndex = parseInt(n[1], 10)),
|
|
this.log("pageIndex", [this.pageIndex, "template string"]));
|
|
});
|
|
let a = [
|
|
/^(.*?\/?page\/?)(\d\d?\d?)(.*?$)/,
|
|
/^(.*?\/?\?page=)(\d\d?\d?)(.*?$)/,
|
|
/(.*?)(\d\d?\d?)(?!.*\d)(.*?$)/,
|
|
],
|
|
c = (s.getPathParts = function (t) {
|
|
if (t)
|
|
for (let e of a) {
|
|
let i = t.match(e);
|
|
if (i) {
|
|
let [, t, e, n] = i;
|
|
return { begin: t, index: e, end: n };
|
|
}
|
|
}
|
|
});
|
|
(r.updateGetPathSelector = function (t) {
|
|
let e = document.querySelector(t);
|
|
if (!e)
|
|
return void console.error(
|
|
`Bad InfiniteScroll path option. Next link not found: ${t}`
|
|
);
|
|
let i = e.getAttribute("href"),
|
|
n = c(i);
|
|
if (!n)
|
|
return void console.error(
|
|
`InfiniteScroll unable to parse next link href: ${i}`
|
|
);
|
|
let { begin: o, index: s, end: r } = n;
|
|
(this.isPathSelector = !0),
|
|
(this.getPath = () => o + (this.pageIndex + 1) + r),
|
|
(this.pageIndex = parseInt(s, 10) - 1),
|
|
this.log("pageIndex", [this.pageIndex, "next link"]);
|
|
}),
|
|
(r.updateGetAbsolutePath = function () {
|
|
let t = this.getPath();
|
|
if (t.match(/^http/) || t.match(/^\//))
|
|
return void (this.getAbsolutePath = this.getPath);
|
|
let { pathname: e } = location,
|
|
i = t.match(/^\?/),
|
|
n = e.substring(0, e.lastIndexOf("/")),
|
|
o = i ? e : n + "/";
|
|
this.getAbsolutePath = () => o + this.getPath();
|
|
}),
|
|
(s.create.hideNav = function () {
|
|
let t = i.getQueryElement(this.options.hideNav);
|
|
t && ((t.style.display = "none"), (this.nav = t));
|
|
}),
|
|
(s.destroy.hideNav = function () {
|
|
this.nav && (this.nav.style.display = "");
|
|
}),
|
|
(r.destroy = function () {
|
|
this.allOff();
|
|
for (let t in s.destroy) s.destroy[t].call(this);
|
|
delete this.element.infiniteScrollGUID,
|
|
delete o[this.guid],
|
|
n && this.$element && n.removeData(this.element, "infiniteScroll");
|
|
}),
|
|
(s.throttle = function (t, e) {
|
|
let i, n;
|
|
return (
|
|
(e = e || 200),
|
|
function () {
|
|
let o = +new Date(),
|
|
s = arguments,
|
|
r = () => {
|
|
(i = o), t.apply(this, s);
|
|
};
|
|
i && o < i + e ? (clearTimeout(n), (n = setTimeout(r, e))) : r();
|
|
}
|
|
);
|
|
}),
|
|
(s.data = function (t) {
|
|
let e = (t = i.getQueryElement(t)) && t.infiniteScrollGUID;
|
|
return e && o[e];
|
|
}),
|
|
(s.setJQuery = function (t) {
|
|
n = t;
|
|
}),
|
|
i.htmlInit(s, "infinite-scroll"),
|
|
(r._init = function () {});
|
|
let { jQueryBridget: u } = t;
|
|
return n && u && u("infiniteScroll", s, n), s;
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("./core")))
|
|
: e(t, t.InfiniteScroll);
|
|
})(window, function (t, e) {
|
|
let i = e.prototype;
|
|
Object.assign(e.defaults, {
|
|
loadOnScroll: !0,
|
|
checkLastPage: !0,
|
|
responseBody: "text",
|
|
domParseResponse: !0,
|
|
}),
|
|
(e.create.pageLoad = function () {
|
|
(this.canLoad = !0),
|
|
this.on("scrollThreshold", this.onScrollThresholdLoad),
|
|
this.on("load", this.checkLastPage),
|
|
this.options.outlayer && this.on("append", this.onAppendOutlayer);
|
|
}),
|
|
(i.onScrollThresholdLoad = function () {
|
|
this.options.loadOnScroll && this.loadNextPage();
|
|
});
|
|
let n = new DOMParser();
|
|
function o(t) {
|
|
let e = document.createDocumentFragment();
|
|
return t && e.append(...t), e;
|
|
}
|
|
return (
|
|
(i.loadNextPage = function () {
|
|
if (this.isLoading || !this.canLoad) return;
|
|
let {
|
|
responseBody: t,
|
|
domParseResponse: e,
|
|
fetchOptions: i,
|
|
} = this.options,
|
|
o = this.getAbsolutePath();
|
|
(this.isLoading = !0), "function" == typeof i && (i = i());
|
|
let s = fetch(o, i)
|
|
.then((i) => {
|
|
if (!i.ok) {
|
|
let t = new Error(i.statusText);
|
|
return this.onPageError(t, o, i), { response: i };
|
|
}
|
|
return i[t]().then(
|
|
(s) => (
|
|
"text" == t && e && (s = n.parseFromString(s, "text/html")),
|
|
204 == i.status
|
|
? (this.lastPageReached(s, o), { body: s, response: i })
|
|
: this.onPageLoad(s, o, i)
|
|
)
|
|
);
|
|
})
|
|
.catch((t) => {
|
|
this.onPageError(t, o);
|
|
});
|
|
return this.dispatchEvent("request", null, [o, s]), s;
|
|
}),
|
|
(i.onPageLoad = function (t, e, i) {
|
|
return (
|
|
this.options.append || (this.isLoading = !1),
|
|
this.pageIndex++,
|
|
this.loadCount++,
|
|
this.dispatchEvent("load", null, [t, e, i]),
|
|
this.appendNextPage(t, e, i)
|
|
);
|
|
}),
|
|
(i.appendNextPage = function (t, e, i) {
|
|
let { append: n, responseBody: s, domParseResponse: r } = this.options;
|
|
if (!("text" == s && r) || !n) return { body: t, response: i };
|
|
let l = t.querySelectorAll(n),
|
|
h = { body: t, response: i, items: l };
|
|
if (!l || !l.length) return this.lastPageReached(t, e), h;
|
|
let a = o(l),
|
|
c = () => (
|
|
this.appendItems(l, a),
|
|
(this.isLoading = !1),
|
|
this.dispatchEvent("append", null, [t, e, l, i]),
|
|
h
|
|
);
|
|
return this.options.outlayer ? this.appendOutlayerItems(a, c) : c();
|
|
}),
|
|
(i.appendItems = function (t, e) {
|
|
t &&
|
|
t.length &&
|
|
((function (t) {
|
|
let e = t.querySelectorAll("script");
|
|
for (let t of e) {
|
|
let e = document.createElement("script"),
|
|
i = t.attributes;
|
|
for (let t of i) e.setAttribute(t.name, t.value);
|
|
(e.innerHTML = t.innerHTML), t.parentNode.replaceChild(e, t);
|
|
}
|
|
})((e = e || o(t))),
|
|
this.element.appendChild(e));
|
|
}),
|
|
(i.appendOutlayerItems = function (i, n) {
|
|
let o = e.imagesLoaded || t.imagesLoaded;
|
|
return o
|
|
? new Promise(function (t) {
|
|
o(i, function () {
|
|
let e = n();
|
|
t(e);
|
|
});
|
|
})
|
|
: (console.error(
|
|
"[InfiniteScroll] imagesLoaded required for outlayer option"
|
|
),
|
|
void (this.isLoading = !1));
|
|
}),
|
|
(i.onAppendOutlayer = function (t, e, i) {
|
|
this.options.outlayer.appended(i);
|
|
}),
|
|
(i.checkLastPage = function (t, e) {
|
|
let i,
|
|
{ checkLastPage: n, path: o } = this.options;
|
|
if (n) {
|
|
if ("function" == typeof o) {
|
|
if (!this.getPath()) return void this.lastPageReached(t, e);
|
|
}
|
|
"string" == typeof n ? (i = n) : this.isPathSelector && (i = o),
|
|
i &&
|
|
t.querySelector &&
|
|
(t.querySelector(i) || this.lastPageReached(t, e));
|
|
}
|
|
}),
|
|
(i.lastPageReached = function (t, e) {
|
|
(this.canLoad = !1), this.dispatchEvent("last", null, [t, e]);
|
|
}),
|
|
(i.onPageError = function (t, e, i) {
|
|
return (
|
|
(this.isLoading = !1),
|
|
(this.canLoad = !1),
|
|
this.dispatchEvent("error", null, [t, e, i]),
|
|
t
|
|
);
|
|
}),
|
|
(e.create.prefill = function () {
|
|
if (!this.options.prefill) return;
|
|
let t = this.options.append;
|
|
t
|
|
? (this.updateMeasurements(),
|
|
this.updateScroller(),
|
|
(this.isPrefilling = !0),
|
|
this.on("append", this.prefill),
|
|
this.once("error", this.stopPrefill),
|
|
this.once("last", this.stopPrefill),
|
|
this.prefill())
|
|
: console.error(`append option required for prefill. Set as :${t}`);
|
|
}),
|
|
(i.prefill = function () {
|
|
let t = this.getPrefillDistance();
|
|
(this.isPrefilling = t >= 0),
|
|
this.isPrefilling
|
|
? (this.log("prefill"), this.loadNextPage())
|
|
: this.stopPrefill();
|
|
}),
|
|
(i.getPrefillDistance = function () {
|
|
return this.options.elementScroll
|
|
? this.scroller.clientHeight - this.scroller.scrollHeight
|
|
: this.windowHeight - this.element.clientHeight;
|
|
}),
|
|
(i.stopPrefill = function () {
|
|
this.log("stopPrefill"), this.off("append", this.prefill);
|
|
}),
|
|
e
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("./core"), require("fizzy-ui-utils")))
|
|
: e(t, t.InfiniteScroll, t.fizzyUIUtils);
|
|
})(window, function (t, e, i) {
|
|
let n = e.prototype;
|
|
return (
|
|
Object.assign(e.defaults, { scrollThreshold: 400 }),
|
|
(e.create.scrollWatch = function () {
|
|
(this.pageScrollHandler = this.onPageScroll.bind(this)),
|
|
(this.resizeHandler = this.onResize.bind(this));
|
|
let t = this.options.scrollThreshold;
|
|
(t || 0 === t) && this.enableScrollWatch();
|
|
}),
|
|
(e.destroy.scrollWatch = function () {
|
|
this.disableScrollWatch();
|
|
}),
|
|
(n.enableScrollWatch = function () {
|
|
this.isScrollWatching ||
|
|
((this.isScrollWatching = !0),
|
|
this.updateMeasurements(),
|
|
this.updateScroller(),
|
|
this.on("last", this.disableScrollWatch),
|
|
this.bindScrollWatchEvents(!0));
|
|
}),
|
|
(n.disableScrollWatch = function () {
|
|
this.isScrollWatching &&
|
|
(this.bindScrollWatchEvents(!1), delete this.isScrollWatching);
|
|
}),
|
|
(n.bindScrollWatchEvents = function (e) {
|
|
let i = e ? "addEventListener" : "removeEventListener";
|
|
this.scroller[i]("scroll", this.pageScrollHandler),
|
|
t[i]("resize", this.resizeHandler);
|
|
}),
|
|
(n.onPageScroll = e.throttle(function () {
|
|
this.getBottomDistance() <= this.options.scrollThreshold &&
|
|
this.dispatchEvent("scrollThreshold");
|
|
})),
|
|
(n.getBottomDistance = function () {
|
|
let e, i;
|
|
return (
|
|
this.options.elementScroll
|
|
? ((e = this.scroller.scrollHeight),
|
|
(i = this.scroller.scrollTop + this.scroller.clientHeight))
|
|
: ((e = this.top + this.element.clientHeight),
|
|
(i = t.scrollY + this.windowHeight)),
|
|
e - i
|
|
);
|
|
}),
|
|
(n.onResize = function () {
|
|
this.updateMeasurements();
|
|
}),
|
|
i.debounceMethod(e, "onResize", 150),
|
|
e
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("./core"), require("fizzy-ui-utils")))
|
|
: e(t, t.InfiniteScroll, t.fizzyUIUtils);
|
|
})(window, function (t, e, i) {
|
|
let n = e.prototype;
|
|
Object.assign(e.defaults, { history: "replace" });
|
|
let o = document.createElement("a");
|
|
return (
|
|
(e.create.history = function () {
|
|
if (!this.options.history) return;
|
|
(o.href = this.getAbsolutePath()),
|
|
(o.origin || o.protocol + "//" + o.host) == location.origin
|
|
? this.options.append
|
|
? this.createHistoryAppend()
|
|
: this.createHistoryPageLoad()
|
|
: console.error(
|
|
`[InfiniteScroll] cannot set history with different origin: ${o.origin} on ${location.origin} . History behavior disabled.`
|
|
);
|
|
}),
|
|
(n.createHistoryAppend = function () {
|
|
this.updateMeasurements(),
|
|
this.updateScroller(),
|
|
(this.scrollPages = [
|
|
{ top: 0, path: location.href, title: document.title },
|
|
]),
|
|
(this.scrollPage = this.scrollPages[0]),
|
|
(this.scrollHistoryHandler = this.onScrollHistory.bind(this)),
|
|
(this.unloadHandler = this.onUnload.bind(this)),
|
|
this.scroller.addEventListener("scroll", this.scrollHistoryHandler),
|
|
this.on("append", this.onAppendHistory),
|
|
this.bindHistoryAppendEvents(!0);
|
|
}),
|
|
(n.bindHistoryAppendEvents = function (e) {
|
|
let i = e ? "addEventListener" : "removeEventListener";
|
|
this.scroller[i]("scroll", this.scrollHistoryHandler),
|
|
t[i]("unload", this.unloadHandler);
|
|
}),
|
|
(n.createHistoryPageLoad = function () {
|
|
this.on("load", this.onPageLoadHistory);
|
|
}),
|
|
(e.destroy.history = n.destroyHistory =
|
|
function () {
|
|
this.options.history &&
|
|
this.options.append &&
|
|
this.bindHistoryAppendEvents(!1);
|
|
}),
|
|
(n.onAppendHistory = function (t, e, i) {
|
|
if (!i || !i.length) return;
|
|
let n = i[0],
|
|
s = this.getElementScrollY(n);
|
|
(o.href = e),
|
|
this.scrollPages.push({ top: s, path: o.href, title: t.title });
|
|
}),
|
|
(n.getElementScrollY = function (e) {
|
|
if (this.options.elementScroll) return e.offsetTop - this.top;
|
|
return e.getBoundingClientRect().top + t.scrollY;
|
|
}),
|
|
(n.onScrollHistory = function () {
|
|
let t = this.getClosestScrollPage();
|
|
t != this.scrollPage &&
|
|
((this.scrollPage = t), this.setHistory(t.title, t.path));
|
|
}),
|
|
i.debounceMethod(e, "onScrollHistory", 150),
|
|
(n.getClosestScrollPage = function () {
|
|
let e, i;
|
|
e = this.options.elementScroll
|
|
? this.scroller.scrollTop + this.scroller.clientHeight / 2
|
|
: t.scrollY + this.windowHeight / 2;
|
|
for (let t of this.scrollPages) {
|
|
if (t.top >= e) break;
|
|
i = t;
|
|
}
|
|
return i;
|
|
}),
|
|
(n.setHistory = function (t, e) {
|
|
let i = this.options.history;
|
|
i &&
|
|
history[i + "State"] &&
|
|
(history[i + "State"](null, t, e),
|
|
this.options.historyTitle && (document.title = t),
|
|
this.dispatchEvent("history", null, [t, e]));
|
|
}),
|
|
(n.onUnload = function () {
|
|
if (0 === this.scrollPage.top) return;
|
|
let e = t.scrollY - this.scrollPage.top + this.top;
|
|
this.destroyHistory(), scrollTo(0, e);
|
|
}),
|
|
(n.onPageLoadHistory = function (t, e) {
|
|
this.setHistory(t.title, e);
|
|
}),
|
|
e
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("./core"), require("fizzy-ui-utils")))
|
|
: e(t, t.InfiniteScroll, t.fizzyUIUtils);
|
|
})(window, function (t, e, i) {
|
|
class n {
|
|
constructor(t, e) {
|
|
(this.element = t),
|
|
(this.infScroll = e),
|
|
(this.clickHandler = this.onClick.bind(this)),
|
|
this.element.addEventListener("click", this.clickHandler),
|
|
e.on("request", this.disable.bind(this)),
|
|
e.on("load", this.enable.bind(this)),
|
|
e.on("error", this.hide.bind(this)),
|
|
e.on("last", this.hide.bind(this));
|
|
}
|
|
onClick(t) {
|
|
t.preventDefault(), this.infScroll.loadNextPage();
|
|
}
|
|
enable() {
|
|
this.element.removeAttribute("disabled");
|
|
}
|
|
disable() {
|
|
this.element.disabled = "disabled";
|
|
}
|
|
hide() {
|
|
this.element.style.display = "none";
|
|
}
|
|
destroy() {
|
|
this.element.removeEventListener("click", this.clickHandler);
|
|
}
|
|
}
|
|
return (
|
|
(e.create.button = function () {
|
|
let t = i.getQueryElement(this.options.button);
|
|
t && (this.button = new n(t, this));
|
|
}),
|
|
(e.destroy.button = function () {
|
|
this.button && this.button.destroy();
|
|
}),
|
|
(e.Button = n),
|
|
e
|
|
);
|
|
}),
|
|
(function (t, e) {
|
|
"object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("./core"), require("fizzy-ui-utils")))
|
|
: e(t, t.InfiniteScroll, t.fizzyUIUtils);
|
|
})(window, function (t, e, i) {
|
|
let n = e.prototype;
|
|
function o(t) {
|
|
r(t, "none");
|
|
}
|
|
function s(t) {
|
|
r(t, "block");
|
|
}
|
|
function r(t, e) {
|
|
t && (t.style.display = e);
|
|
}
|
|
return (
|
|
(e.create.status = function () {
|
|
let t = i.getQueryElement(this.options.status);
|
|
t &&
|
|
((this.statusElement = t),
|
|
(this.statusEventElements = {
|
|
request: t.querySelector(".infinite-scroll-request"),
|
|
error: t.querySelector(".infinite-scroll-error"),
|
|
last: t.querySelector(".infinite-scroll-last"),
|
|
}),
|
|
this.on("request", this.showRequestStatus),
|
|
this.on("error", this.showErrorStatus),
|
|
this.on("last", this.showLastStatus),
|
|
this.bindHideStatus("on"));
|
|
}),
|
|
(n.bindHideStatus = function (t) {
|
|
let e = this.options.append ? "append" : "load";
|
|
this[t](e, this.hideAllStatus);
|
|
}),
|
|
(n.showRequestStatus = function () {
|
|
this.showStatus("request");
|
|
}),
|
|
(n.showErrorStatus = function () {
|
|
this.showStatus("error");
|
|
}),
|
|
(n.showLastStatus = function () {
|
|
this.showStatus("last"), this.bindHideStatus("off");
|
|
}),
|
|
(n.showStatus = function (t) {
|
|
s(this.statusElement),
|
|
this.hideStatusEventElements(),
|
|
s(this.statusEventElements[t]);
|
|
}),
|
|
(n.hideAllStatus = function () {
|
|
o(this.statusElement), this.hideStatusEventElements();
|
|
}),
|
|
(n.hideStatusEventElements = function () {
|
|
for (let t in this.statusEventElements) {
|
|
o(this.statusEventElements[t]);
|
|
}
|
|
}),
|
|
e
|
|
);
|
|
}),
|
|
/*!
|
|
* imagesLoaded v4.1.4
|
|
* JavaScript is all like "You images are done yet or what?"
|
|
* MIT License
|
|
*/
|
|
(function (t, e) {
|
|
"use strict";
|
|
"function" == typeof define && define.amd
|
|
? define(["ev-emitter/ev-emitter"], function (i) {
|
|
return e(t, i);
|
|
})
|
|
: "object" == typeof module && module.exports
|
|
? (module.exports = e(t, require("ev-emitter")))
|
|
: (t.imagesLoaded = e(t, t.EvEmitter));
|
|
})("undefined" != typeof window ? window : this, function (t, e) {
|
|
"use strict";
|
|
var i = t.jQuery,
|
|
n = t.console;
|
|
function o(t, e) {
|
|
for (var i in e) t[i] = e[i];
|
|
return t;
|
|
}
|
|
var s = Array.prototype.slice;
|
|
function r(t, e, l) {
|
|
if (!(this instanceof r)) return new r(t, e, l);
|
|
var h,
|
|
a = t;
|
|
("string" == typeof t && (a = document.querySelectorAll(t)), a)
|
|
? ((this.elements =
|
|
((h = a),
|
|
Array.isArray(h)
|
|
? h
|
|
: "object" == typeof h && "number" == typeof h.length
|
|
? s.call(h)
|
|
: [h])),
|
|
(this.options = o({}, this.options)),
|
|
"function" == typeof e ? (l = e) : o(this.options, e),
|
|
l && this.on("always", l),
|
|
this.getImages(),
|
|
i && (this.jqDeferred = new i.Deferred()),
|
|
setTimeout(this.check.bind(this)))
|
|
: n.error("Bad element for imagesLoaded " + (a || t));
|
|
}
|
|
(r.prototype = Object.create(e.prototype)),
|
|
(r.prototype.options = {}),
|
|
(r.prototype.getImages = function () {
|
|
(this.images = []), this.elements.forEach(this.addElementImages, this);
|
|
}),
|
|
(r.prototype.addElementImages = function (t) {
|
|
"IMG" == t.nodeName && this.addImage(t),
|
|
!0 === this.options.background && this.addElementBackgroundImages(t);
|
|
var e = t.nodeType;
|
|
if (e && l[e]) {
|
|
for (var i = t.querySelectorAll("img"), n = 0; n < i.length; n++) {
|
|
var o = i[n];
|
|
this.addImage(o);
|
|
}
|
|
if ("string" == typeof this.options.background) {
|
|
var s = t.querySelectorAll(this.options.background);
|
|
for (n = 0; n < s.length; n++) {
|
|
var r = s[n];
|
|
this.addElementBackgroundImages(r);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var l = { 1: !0, 9: !0, 11: !0 };
|
|
function h(t) {
|
|
this.img = t;
|
|
}
|
|
function a(t, e) {
|
|
(this.url = t), (this.element = e), (this.img = new Image());
|
|
}
|
|
return (
|
|
(r.prototype.addElementBackgroundImages = function (t) {
|
|
var e = getComputedStyle(t);
|
|
if (e)
|
|
for (
|
|
var i = /url\((['"])?(.*?)\1\)/gi, n = i.exec(e.backgroundImage);
|
|
null !== n;
|
|
|
|
) {
|
|
var o = n && n[2];
|
|
o && this.addBackground(o, t), (n = i.exec(e.backgroundImage));
|
|
}
|
|
}),
|
|
(r.prototype.addImage = function (t) {
|
|
var e = new h(t);
|
|
this.images.push(e);
|
|
}),
|
|
(r.prototype.addBackground = function (t, e) {
|
|
var i = new a(t, e);
|
|
this.images.push(i);
|
|
}),
|
|
(r.prototype.check = function () {
|
|
var t = this;
|
|
function e(e, i, n) {
|
|
setTimeout(function () {
|
|
t.progress(e, i, n);
|
|
});
|
|
}
|
|
(this.progressedCount = 0),
|
|
(this.hasAnyBroken = !1),
|
|
this.images.length
|
|
? this.images.forEach(function (t) {
|
|
t.once("progress", e), t.check();
|
|
})
|
|
: this.complete();
|
|
}),
|
|
(r.prototype.progress = function (t, e, i) {
|
|
this.progressedCount++,
|
|
(this.hasAnyBroken = this.hasAnyBroken || !t.isLoaded),
|
|
this.emitEvent("progress", [this, t, e]),
|
|
this.jqDeferred &&
|
|
this.jqDeferred.notify &&
|
|
this.jqDeferred.notify(this, t),
|
|
this.progressedCount == this.images.length && this.complete(),
|
|
this.options.debug && n && n.log("progress: " + i, t, e);
|
|
}),
|
|
(r.prototype.complete = function () {
|
|
var t = this.hasAnyBroken ? "fail" : "done";
|
|
if (
|
|
((this.isComplete = !0),
|
|
this.emitEvent(t, [this]),
|
|
this.emitEvent("always", [this]),
|
|
this.jqDeferred)
|
|
) {
|
|
var e = this.hasAnyBroken ? "reject" : "resolve";
|
|
this.jqDeferred[e](this);
|
|
}
|
|
}),
|
|
(h.prototype = Object.create(e.prototype)),
|
|
(h.prototype.check = function () {
|
|
this.getIsImageComplete()
|
|
? this.confirm(0 !== this.img.naturalWidth, "naturalWidth")
|
|
: ((this.proxyImage = new Image()),
|
|
this.proxyImage.addEventListener("load", this),
|
|
this.proxyImage.addEventListener("error", this),
|
|
this.img.addEventListener("load", this),
|
|
this.img.addEventListener("error", this),
|
|
(this.proxyImage.src = this.img.src));
|
|
}),
|
|
(h.prototype.getIsImageComplete = function () {
|
|
return this.img.complete && this.img.naturalWidth;
|
|
}),
|
|
(h.prototype.confirm = function (t, e) {
|
|
(this.isLoaded = t), this.emitEvent("progress", [this, this.img, e]);
|
|
}),
|
|
(h.prototype.handleEvent = function (t) {
|
|
var e = "on" + t.type;
|
|
this[e] && this[e](t);
|
|
}),
|
|
(h.prototype.onload = function () {
|
|
this.confirm(!0, "onload"), this.unbindEvents();
|
|
}),
|
|
(h.prototype.onerror = function () {
|
|
this.confirm(!1, "onerror"), this.unbindEvents();
|
|
}),
|
|
(h.prototype.unbindEvents = function () {
|
|
this.proxyImage.removeEventListener("load", this),
|
|
this.proxyImage.removeEventListener("error", this),
|
|
this.img.removeEventListener("load", this),
|
|
this.img.removeEventListener("error", this);
|
|
}),
|
|
(a.prototype = Object.create(h.prototype)),
|
|
(a.prototype.check = function () {
|
|
this.img.addEventListener("load", this),
|
|
this.img.addEventListener("error", this),
|
|
(this.img.src = this.url),
|
|
this.getIsImageComplete() &&
|
|
(this.confirm(0 !== this.img.naturalWidth, "naturalWidth"),
|
|
this.unbindEvents());
|
|
}),
|
|
(a.prototype.unbindEvents = function () {
|
|
this.img.removeEventListener("load", this),
|
|
this.img.removeEventListener("error", this);
|
|
}),
|
|
(a.prototype.confirm = function (t, e) {
|
|
(this.isLoaded = t),
|
|
this.emitEvent("progress", [this, this.element, e]);
|
|
}),
|
|
(r.makeJQueryPlugin = function (e) {
|
|
(e = e || t.jQuery) &&
|
|
((i = e).fn.imagesLoaded = function (t, e) {
|
|
return new r(this, t, e).jqDeferred.promise(i(this));
|
|
});
|
|
}),
|
|
r.makeJQueryPlugin(),
|
|
r
|
|
);
|
|
});
|