下面这事儿,本质上是一个“小而顽固”的 SPA 路由+状态管理问题: 你在“文章列表页”里输入了搜索词(如“看网页”),DOM 被过滤后仍留在内存;点开文章进入“详情页”时,我们只是隐藏了列表的那一块(display: none),并没有销毁或重绘它。 当你点“返回列表”,脚本只是把哈希设为 #/ 并把“列表区”重新显示出来,结果是:上一次的搜索状态还在,于是你又看到了带搜索词的那一页(这和你截图 2、4 的现象完全一致)。

发生原因(一句话版)

修改思路

给“返回列表”两层保险:

  1. 点击“返回列表”时,清空搜索框并主动触发一次 input 事件(借用现有的过滤逻辑把列表恢复为全量)。
  2. 在路由解析到 #/(列表视图)时,再次做一次同样的清空动作,防止用户用浏览器前进/后退或其他方式回到列表而绕过按钮。

改动文件

仅需修改: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();

这样无论是点“返回列表”、还是通过浏览器后退回到 #/,都会自动清空搜索与提示文本,恢复完整文章列表。