diff --git a/assets/js/build/public.js b/assets/js/build/public.js index 782317cc..02b1a939 100644 --- a/assets/js/build/public.js +++ b/assets/js/build/public.js @@ -2659,13 +2659,93 @@ tbquire.config({ } function getCurrentAuthorOnly() { - var url = new URL(window.location.href); - if (url.searchParams.get("aksrt_author_only") === "1") return true; var btn = document.querySelector("#comments .btn-only-author"); return !!(btn && btn.classList.contains("active") && btn.dataset.authorOnly === "0"); } - function applyFragmentPayload(commentsArea, data, urlState) { + /* ====== 全局无参数加载:评论状态仅保存在客户端,地址栏不携带 ? 参数 ====== */ + var COMMENT_URL_PARAMS = ["cpage", "aksrt_comment_order", "aksrt_author_only"]; + var commentUrlStateCleaned = false; + + function stripCommentUrlParams() { + if (commentUrlStateCleaned || !window.history || typeof window.history.replaceState !== "function") return; + commentUrlStateCleaned = true; + var url = new URL(window.location.href); + var changed = false; + COMMENT_URL_PARAMS.forEach(function (key) { + if (url.searchParams.has(key)) { + url.searchParams.delete(key); + changed = true; + } + }); + if (changed) { + // 服务端首屏已按参数渲染完毕,落地后地址栏回到无参干净链接。 + window.history.replaceState(null, "", url.toString()); + } + } + + function getMaxCommentPages() { + var pagenav = document.querySelector("#comments .pagenav[data-max-pages]"); + if (pagenav) { + var max = parseInt(pagenav.dataset.maxPages, 10); + if (max > 0) return max; + } + var jumpInput = document.querySelector("#comments .jump-input[max]"); + if (jumpInput) { + var maxAttr = parseInt(jumpInput.getAttribute("max"), 10); + if (maxAttr > 0) return maxAttr; + } + return 1; + } + + function parseCommentPageFromHref(href) { + if (!href || href === "#" || href.indexOf("javascript:") === 0) return 0; + try { + var url = new URL(href, window.location.href); + var cpage = parseInt(url.searchParams.get("cpage"), 10); + if (cpage > 0) return cpage; + var match = url.pathname.match(/\/comment-page-([0-9]{1,})\/?$/); + return match ? parseInt(match[1], 10) : 0; + } catch (e) { + return 0; + } + } + + function scrollCommentsIntoView() { + var commentsArea = document.getElementById("comments"); + if (!commentsArea || typeof commentsArea.scrollIntoView !== "function") return; + var rect = commentsArea.getBoundingClientRect(); + if (rect.top >= 0 && rect.top < window.innerHeight * 0.6) return; + commentsArea.scrollIntoView({ behavior: "smooth", block: "start" }); + } + + function loadCommentPage(page, opts) { + opts = opts || {}; + var commentsArea = document.getElementById("comments"); + if (!commentsArea) { + return Promise.reject(new Error("comments area missing")); + } + var maxPages = getMaxCommentPages(); + page = parseInt(page, 10) || 1; + page = Math.max(1, page); + if (maxPages > 1) page = Math.min(page, maxPages); + + showListLoading(commentsArea); + return fetchCommentFragment({ + order: getCurrentCommentOrder(), + authorOnly: getCurrentAuthorOnly(), + page: page + }).then(function (json) { + if (json && json.success && json.data) { + applyFragmentPayload(commentsArea, json.data); + if (!opts.noScroll) scrollCommentsIntoView(); + return true; + } + throw new Error("comment fragment failed"); + }); + } + + function applyFragmentPayload(commentsArea, data) { if (!commentsArea || !data || !data.html) return; // data.html 是完整的