From 32280cd6716aabe86e61c0cb233ab4384af6f2cc Mon Sep 17 00:00:00 2001 From: ZxR <3193291180@qq.com> Date: Wed, 13 May 2026 17:01:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=90=9C=E7=B4=A2=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=80=BB=E8=BE=91=EF=BC=9A=E9=99=90=E5=AE=9Anavbar?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E5=B9=B6=E4=BC=98=E5=85=88=E6=8E=92=E9=99=A4?= =?UTF-8?q?=E6=97=A0=E7=BB=93=E6=9E=9C=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/search-no-result.js | 91 ++++++++++++++++------------------- 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/static/js/search-no-result.js b/static/js/search-no-result.js index 87d0e7c..661345e 100644 --- a/static/js/search-no-result.js +++ b/static/js/search-no-result.js @@ -4,8 +4,6 @@ var GUIDE_ID = 'search-no-result-guide'; var timer = null; var pollTimer = null; - var checkCount = 0; - var MAX_CHECKS = 6; function getLang() { return (document.documentElement.lang || 'zh-CN').startsWith('en') ? 'en' : 'zh'; @@ -52,37 +50,49 @@ if (pollTimer) { clearInterval(pollTimer); pollTimer = null; } } - // 用 getBoundingClientRect 判断可见性,不受 position:absolute/fixed 影响 function isVisible(el) { if (!el) return false; var r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0; } + // 只检查 navbar 搜索区域内,有可见子项才算有结果 function hasVisibleResults() { - // 全局搜索(搜索结果可能渲染在 portal 中,不一定在 .navbar__search 内) - var listbox = document.querySelector('[role="listbox"]'); - if (listbox && isVisible(listbox)) { - var text = (listbox.textContent || '').trim(); - // 如果内容不为空且不是无结果提示 - if (text.length > 0 && - !text.includes('没有结果') && - !text.includes('No results') && - !text.includes('未找到')) { - return true; - } + var searchEl = document.querySelector('.navbar__search'); + if (!searchEl) return false; + + var listbox = searchEl.querySelector('[role="listbox"]'); + if (!listbox || !isVisible(listbox)) return false; + + var text = (listbox.textContent || '').trim(); + + // 明确的无结果提示 → 没有结果 + if (text === '没有结果' || text === '没有结果:' || + text === 'No results' || text === '未找到结果') { + return false; } - // 检查所有可见的结果条目 - var items = document.querySelectorAll('[role="option"], [role="listbox"] li, [role="listbox"] a'); - for (var i = 0; i < items.length; i++) { - if (isVisible(items[i])) return true; + // 有可见子元素(li/a/按钮/div)→ 有结果 + var children = listbox.children; + for (var i = 0; i < children.length; i++) { + if (isVisible(children[i])) return true; + } + + // 没有可见子元素但有一行文字且不是无结果提示 → 可能是有结果 + if (text.length > 0 && !text.startsWith('没有结果') && !text.startsWith('No results')) { + return true; } return false; } - function startPolling() { + function showGuide() { + if (document.getElementById(GUIDE_ID)) return; + var container = document.querySelector('.navbar__search'); + if (!container) return; + container.appendChild(createGuide()); + + // 轮询:结果出现时自动清除引导 if (pollTimer) clearInterval(pollTimer); pollTimer = setInterval(function () { var input = document.querySelector('.navbar__search input'); @@ -96,7 +106,7 @@ }, 300); } - function showGuideIfNeeded() { + function checkAndShow() { var input = document.querySelector('.navbar__search input'); if (!input) return; if (input.value.trim().length === 0) { @@ -104,44 +114,27 @@ return; } - if (hasVisibleResults()) { - removeGuide(); - return; - } - - if (!document.getElementById(GUIDE_ID)) { - var container = document.querySelector('.navbar__search'); - if (container) { - container.appendChild(createGuide()); + // 延迟一小会等搜索渲染完再判断 + setTimeout(function () { + var curInput = document.querySelector('.navbar__search input'); + if (!curInput || curInput.value.trim().length === 0) { + removeGuide(); + return; } - startPolling(); - } - } - function checkWithRetry() { - checkCount = 0; - removeGuide(); - - function doCheck() { - var input = document.querySelector('.navbar__search input'); - if (!input || input.value.trim().length === 0) { removeGuide(); return; } - if (hasVisibleResults()) { return; } - - checkCount++; - if (checkCount >= MAX_CHECKS) { - showGuideIfNeeded(); + if (!hasVisibleResults()) { + showGuide(); } else { - setTimeout(doCheck, 200); + removeGuide(); } - } - - doCheck(); + }, 500); } function onInput(e) { if (!e.target.closest('.navbar__search')) return; + removeGuide(); clearTimeout(timer); - timer = setTimeout(checkWithRetry, 300); + timer = setTimeout(checkAndShow, 300); } function onClickOutside(e) {