/** * 花镇案例 · 栏目列表页 * 服务端下发全部案例卡片;hz-tabs 按问答场景(data-case-category)前端筛选 + 分页加载。 * 咨询师模块按 data-consultant-cat 前端筛选。 * 延迟半屏匹配 Sheet:tabs / 查看详情 / 停留 15s 触发,localStorage 只展示一次。 */ (function () { "use strict"; var root = document.getElementById("hz-case-list-mobile"); if (!root) return; var PAGE = 6; var current = "all"; var pageShown = PAGE; var cards = Array.prototype.slice.call(root.querySelectorAll(".hz-case-card")); var tabs = Array.prototype.slice.call(root.querySelectorAll(".hz-tab[data-case-cat]")); var moreBtn = root.querySelector('[data-act="more-cases"]'); var wechatUrl = root.getAttribute("data-wechat") || ""; var consultantCat = "marriage"; var SHEET_STORAGE_KEY = "hz_case_match_sheet_shown"; var sheetEl = document.getElementById("hz-match-sheet"); var scrimEl = document.getElementById("hz-match-scrim"); var sheetShown = false; try { sheetShown = window.localStorage.getItem(SHEET_STORAGE_KEY) === "1"; } catch (e) { sheetShown = false; } function report(eventName, source, extra) { if (window.add_burial_point_log) { window.add_burial_point_log(2, { event: "case_" + eventName, source: source, props: extra || {} }); } } function matchedCards() { if (current === "all") return cards.slice(); return cards.filter(function (c) { return c.getAttribute("data-case-category") === current; }); } function setCardVisible(card, visible) { if (visible) { card.removeAttribute("hidden"); card.style.display = ""; } else { card.setAttribute("hidden", "hidden"); card.style.display = "none"; } } function render() { var match = matchedCards(); var limit = Math.min(pageShown, match.length); var visibleIds = {}; match.slice(0, limit).forEach(function (c) { visibleIds[c.getAttribute("data-case-id")] = true; }); cards.forEach(function (c) { setCardVisible(c, !!visibleIds[c.getAttribute("data-case-id")]); }); if (moreBtn) { moreBtn.style.display = (pageShown >= match.length || match.length === 0) ? "none" : ""; if (pageShown >= match.length || match.length === 0) { moreBtn.setAttribute("hidden", "hidden"); } else { moreBtn.removeAttribute("hidden"); } } } function renderConsultants(category) { consultantCat = category || "marriage"; var rows = root.querySelectorAll("#hz-consultant-list .hz-consultant-row"); for (var i = 0; i < rows.length; i++) { var row = rows[i]; var match = row.getAttribute("data-consultant-cat") === consultantCat; if (match) { row.removeAttribute("hidden"); } else { row.setAttribute("hidden", "hidden"); } } var cTabs = root.querySelectorAll(".hz-consultant-tab[data-consultant-cat]"); for (var j = 0; j < cTabs.length; j++) { var active = cTabs[j].getAttribute("data-consultant-cat") === consultantCat; cTabs[j].setAttribute("aria-selected", active ? "true" : "false"); } } function markSheetShown() { sheetShown = true; try { window.localStorage.setItem(SHEET_STORAGE_KEY, "1"); } catch (e) { /* ignore quota / private mode */ } } function isSheetOpen() { return !!(sheetEl && sheetEl.classList.contains("is-open")); } /** @returns {boolean} true = 本次成功打开;false = 已展示过或不满足条件 */ function openMatchSheet(reason) { if (!sheetEl || !scrimEl) return false; if (sheetShown || isSheetOpen()) return false; markSheetShown(); sheetEl.hidden = false; scrimEl.hidden = false; // 强制回流后再加 is-open,保证滑入动画 void sheetEl.offsetWidth; sheetEl.classList.add("is-open"); scrimEl.classList.add("is-open"); report("match_sheet_exposure", reason || ""); return true; } function closeMatchSheet() { if (!sheetEl || !scrimEl) return; sheetEl.classList.remove("is-open"); scrimEl.classList.remove("is-open"); sheetEl.hidden = true; scrimEl.hidden = true; } function bindMatchSheet() { if (!sheetEl || !scrimEl) return; var closeBtn = document.getElementById("hz-match-sheet-close"); if (closeBtn) closeBtn.addEventListener("click", closeMatchSheet); scrimEl.addEventListener("click", closeMatchSheet); var sheetCta = sheetEl.querySelector('[data-act="sheet-wecom"]'); if (sheetCta) { sheetCta.addEventListener("click", function () { report("match_sheet_click", "list_match_sheet"); }); } if (!sheetShown) { window.setTimeout(function () { openMatchSheet("15s"); }, 15000); } } function bindTabs() { tabs.forEach(function (tab) { tab.addEventListener("click", function () { current = tab.getAttribute("data-case-cat") || "all"; tabs.forEach(function (t) { t.setAttribute("aria-selected", String(t === tab)); }); pageShown = PAGE; render(); report("tab_switch", current); openMatchSheet("tab_switch"); }); }); } function bindConsultantTabs() { var cTabs = root.querySelectorAll(".hz-consultant-tab[data-consultant-cat]"); for (var i = 0; i < cTabs.length; i++) { cTabs[i].addEventListener("click", function () { renderConsultants(this.getAttribute("data-consultant-cat")); report("consultant_tab", this.getAttribute("data-consultant-cat") || ""); }); } } function bindMore() { if (!moreBtn) return; moreBtn.addEventListener("click", function () { pageShown += PAGE; render(); report("load_more", current, { shown: pageShown }); }); } function bindCards() { var list = document.getElementById("hz-case-list"); if (!list) return; list.addEventListener("click", function (e) { var target = e.target; var card = null; while (target && target !== list) { if (target.classList && target.classList.contains("hz-case-card")) { card = target; break; } target = target.parentNode; } if (!card) return; var url = card.getAttribute("data-url"); report("open_case", card.getAttribute("data-case-category") || "", { id: card.getAttribute("data-case-id") || "" }); // 首次点击「查看详情」:弹 sheet,拦截跳转;已展示过则正常跳转 if (!sheetShown) { openMatchSheet("case_detail"); return; } if (url) { window.location.href = url; } }); } function bindCert() { document.addEventListener("click", function (e) { var target = e.target; var btn = null; while (target && target !== document.body) { if (target.getAttribute && target.getAttribute("data-act") === "show-cert") { btn = target; break; } target = target.parentNode; } if (!btn) return; e.preventDefault(); e.stopPropagation(); var img = btn.getAttribute("data-certify-image") || ""; if (!img || !window.ExpertCertViewer || typeof window.ExpertCertViewer.open !== "function") { return; } window.ExpertCertViewer.open(img); }); } function bindBottomNav() { var nav = document.querySelector(".hz-global-bottom-nav"); if (!nav) return; nav.addEventListener("click", function (e) { var btn = e.target; while (btn && btn !== nav && !(btn.tagName === "BUTTON" && btn.getAttribute("data-act"))) { btn = btn.parentNode; } if (!btn || btn === nav) return; var act = btn.getAttribute("data-act"); if (act === "similar") { var expertHref = btn.getAttribute("data-href") || "//qinggan.anslib.com/huazhen/zj/"; report("similar_click", "list_bottom"); window.location.href = expertHref; } else if (act === "wecom") { var href = btn.getAttribute("data-href") || wechatUrl; report("wechat_cta", "list_bottom"); if (href) window.location.href = href; } }); } function bindMatchCard() { var cta = root.querySelector('[data-act="match-wecom"]'); if (!cta) return; cta.addEventListener("click", function () { report("match_inline_click", "list_match_card"); }); } bindTabs(); bindConsultantTabs(); bindMore(); bindCards(); bindCert(); bindBottomNav(); bindMatchCard(); bindMatchSheet(); render(); renderConsultants(consultantCat); })();