feat(frontend): replace lazy loading with zibll lazysizes

This commit is contained in:
kate522 committed 2026-08-18 01:33:38 +08:00
1 parent 02571eecd6
commit 435ee1daa7
78 files changed
+1515 -909

No files matched your search

+26 -120
View File
@@ -31,9 +31,10 @@
var failed = false;
var loadMoreBtn = container.querySelector(".aksrt-load-more-btn, .ajax-next");
var indicator = container.querySelector(".aksrt-loading-indicator");
var observer = null;
var iasEnabled = false;
var successfulAutoLoads = 0;
var iasMax = isComment
? ((window.aksrtData && typeof aksrtData.commentIasMax !== "undefined") ? parseInt(aksrtData.commentIasMax, 10) : 0)
: ((window.aksrtData && typeof aksrtData.iasMax !== "undefined") ? parseInt(aksrtData.iasMax, 10) : 0);
var homepagePanel = container.closest("[data-home-tab-panel]");
var target = homepagePanel || container.previousElementSibling;
if (!homepagePanel && target && target.classList && target.classList.contains("content-stream__footer")) {
@@ -65,11 +66,6 @@
}
function stopInfinite(markNomore) {
if (observer) {
observer.disconnect();
observer = null;
}
iasEnabled = false;
container.classList.remove("ias-pending");
if (markNomore && loadMoreBtn) {
loadMoreBtn.textContent = nomoreText;
@@ -177,8 +173,6 @@
successfulAutoLoads++;
}
if (typeof initLazyLoad === "function") initLazyLoad(target);
if (nextPage > maxPages || !res.data.has_more) {
stopInfinite(true);
if (!loadMoreBtn) {
@@ -198,6 +192,17 @@
if (loadMoreBtn && !loadMoreBtn.classList.contains("ajax-nomore") && !failed) {
loadMoreBtn.classList.remove("is-loading");
loadMoreBtn.textContent = triggerText;
if (mode === "infinite") {
if (iasMax > 0 && successfulAutoLoads >= iasMax) {
stopInfinite(true);
} else {
loadMoreBtn.classList.remove("lazyloaded", "lazyloading");
loadMoreBtn.classList.add("lazyload");
if (window.lazySizes && lazySizes.loader) {
lazySizes.loader.checkElems();
}
}
}
}
});
}
@@ -227,127 +232,28 @@
window.location.href = archiveUrl.toString();
return;
}
var fromAuto = loadMoreBtn.dataset.lazyAuto === "1";
delete loadMoreBtn.dataset.lazyAuto;
if (fromAuto && iasMax > 0 && successfulAutoLoads >= iasMax) {
stopInfinite(true);
return;
}
// Manual click can recover from a previous auto-load failure.
failed = false;
loadNextPage(false);
loadNextPage(fromAuto);
});
}
if (mode === "infinite" && "IntersectionObserver" in window) {
if (isComment && window.aksrtData && aksrtData.commentIasAuto === false) {
if (mode === "infinite") {
if ((isComment && window.aksrtData && aksrtData.commentIasAuto === false) || !hasAjaxConfig()) {
loadMoreBtn.classList.remove("lazyload");
loadMoreBtn.removeAttribute("lazyload-action");
return;
}
if (!hasAjaxConfig()) {
return;
}
var sentinel = document.createElement("div");
sentinel.className = "aksrt-scroll-sentinel";
container.appendChild(sentinel);
var lazyloadAction = container.dataset.lazyloadAction || "";
var iasMax = isComment
? ((window.aksrtData && typeof aksrtData.commentIasMax !== "undefined") ? parseInt(aksrtData.commentIasMax, 10) : 0)
: ((window.aksrtData && typeof aksrtData.iasMax !== "undefined") ? parseInt(aksrtData.iasMax, 10) : 0);
observer = new IntersectionObserver(
function (entries) {
if (!iasEnabled || failed) return;
if (!(entries[0] && entries[0].isIntersecting) || loading) return;
if (iasMax > 0 && successfulAutoLoads >= iasMax) {
stopInfinite(true);
return;
}
loadNextPage(true);
},
{ rootMargin: "200px" }
);
if (lazyloadAction === "ias") {
container.classList.add("ias-pending");
}
// Policy A: do not auto-fire on first paint; wait for real user scroll.
var enableOnScroll = function () {
if (iasEnabled || failed) return;
iasEnabled = true;
container.classList.remove("ias-pending");
observer.observe(sentinel);
};
window.addEventListener("scroll", enableOnScroll, { passive: true, once: true });
window.addEventListener("touchmove", enableOnScroll, { passive: true, once: true });
window.addEventListener("wheel", enableOnScroll, { passive: true, once: true });
container.classList.add("ias-pending");
}
});
}
function activateLazyEl(el) {
var src = el.dataset.src;
if (!src) return;
var tag = (el.tagName || "").toLowerCase();
if (tag === "iframe" || tag === "video") {
el.src = src;
el.classList.remove("aksrt-lazy", "lazyload");
el.classList.add("aksrt-loaded", "lazyloaded");
return;
}
// img path with optional skeleton + decode
var tempImg = new Image();
tempImg.onload = function () {
el.src = src;
el.classList.remove("aksrt-lazy", "lazyload");
el.classList.add("aksrt-loaded", "lazyloaded");
var skeleton = el.previousElementSibling;
if (skeleton && skeleton.classList.contains("aksrt-skeleton")) {
skeleton.remove();
}
};
tempImg.onerror = function () {
el.classList.remove("aksrt-lazy", "lazyload");
el.classList.add("aksrt-error");
var skeleton = el.previousElementSibling;
if (skeleton && skeleton.classList.contains("aksrt-skeleton")) {
skeleton.remove();
}
};
tempImg.src = src;
}
function initLazyLoad(root) {
var scope = root || document;
// Images + iframes/videos that use data-src (zibll lazyload / aksrt-lazy).
var lazyEls = scope.querySelectorAll(
"img.aksrt-lazy, iframe.aksrt-lazy, iframe.lazyload, video.aksrt-lazy, video.lazyload"
);
if (!lazyEls.length) return;
if (!("IntersectionObserver" in window)) {
lazyEls.forEach(function (el) {
activateLazyEl(el);
});
return;
}
var observer = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
if (!entry.isIntersecting) return;
var el = entry.target;
if (!el.dataset.src) {
observer.unobserve(el);
return;
}
activateLazyEl(el);
observer.unobserve(el);
});
}, {
rootMargin: "200px 0px",
threshold: 0.01
});
lazyEls.forEach(function (el) {
observer.observe(el);
});
}
window.AksrtFrontend.register("aksrt-ajax-pagination", function (root) { initAjaxPagination(root); });
window.AksrtFrontend.register("aksrt-lazy-load", function (root) { initLazyLoad(root); });
})();
+2 -6
View File
@@ -191,7 +191,6 @@
spaceBetween: spaceBetween,
parallax: parallax,
effect: effect,
lazy: { loadPrevNext: true },
autoplay: autoplay,
speed: speed,
pagination: pagination,
@@ -199,9 +198,6 @@
keyboard: keyboard,
a11y: { prevSlideMessage: "上一张", nextSlideMessage: "下一张" },
on: {
lazyImageReady: function (slideEl, imageEl) {
if (imageEl) imageEl.classList.add("lazyloaded");
},
slideChange: function () {
el.querySelectorAll(".aksrt-dplayer, video").forEach(function (media) {
if (media.pause) media.pause();
@@ -238,7 +234,7 @@
var img = slide.querySelector("img");
var src = img ? (img.dataset.src || img.src) : "";
if (src) {
return '<div class="' + className + '"><img class="aksrt-tilt-thumb" src="' + src + '"></div>';
return '<div class="' + className + '"><img' + window.aksrtGetLazyImageAttr('lazy_sider', src, 'aksrt-tilt-thumb') + ' alt=""></div>';
}
return "";
};
@@ -379,4 +375,4 @@
}
window.AksrtFrontend.register("aksrt-hero-slider", function () { initHeroSlider(); });
})();
})();