下面这事儿,本质上是一个“小而顽固”的 SPA 路由+状态管理问题:
你在“文章列表页”里输入了搜索词(如“看网页”),DOM 被过滤后仍留在内存;点开文章进入“详情页”时,我们只是隐藏了列表的那一块(display: none),并没有销毁或重绘它。
当你点“返回列表”,脚本只是把哈希设为 #/ 并把“列表区”重新显示出来,结果是:上一次的搜索状态还在,于是你又看到了带搜索词的那一页(这和你截图 2、4 的现象完全一致)。
LIST_RENDERED,进一步阻止了返回时的重绘。给“返回列表”两层保险:
input 事件(借用现有的过滤逻辑把列表恢复为全量)。#/(列表视图)时,再次做一次同样的清空动作,防止用户用浏览器前进/后退或其他方式回到列表而绕过按钮。仅需修改:personalblog9.1/scripts/script.js
我已将修复后的文件与补丁打包好;你也可以单独下载修改后的 script.js。下面给出修改前后对比要点与完整文件内容。
1)返回按钮:清空搜索并触发重绘
// 原来是:
backBtn?.addEventListener("click", () => { location.hash = "#/"; });
// 修改为:
backBtn?.addEventListener("click", () => {
const input = document.getElementById("site-search");
if (input) { input.value = ""; input.dispatchEvent(new Event("input", { bubbles: true })); }
location.hash = "#/";
});
2)切到列表路由时的兜底:
// 原来是:
default: await renderList(); toList();
// 修改为:
default: await renderList(); (function(){
const input = document.getElementById("site-search");
if (input && input.value){
input.value="";
input.dispatchEvent(new Event("input", {bubbles:true}));
}
})();
toList();
这样无论是点“返回列表”、还是通过浏览器后退回到 #/,都会自动清空搜索与提示文本,恢复完整文章列表。