localStorage 更合适,因其关闭浏览器后仍保留搜索词;sessionStorage 会清空,不满足历史需求;需注意容量限制、同源共享、JSON 解析容错、条数限制及去重逻辑。
实际操作时建议:
localStorage.setItem('searchHistory', JSON.stringify(historyArray)) 写入try...catch,防止 JSON 解析失败(比如用户手动篡改了 localStorage)historyArray.unshift(newTerm) + historyArray.splice(10)
fetch 成功回调里写入,导致网络失败时漏掉记录。推荐做法:
inputElement.addEventListener('submit', handler)(表单场景)或 button.addEventListener('click', handler)
inputElement.value.trim(),非空才存historyArray[0] !== newTerm,或去重后保留原始顺序(用 Array.from(new Set([...historyArray, newTerm])).slice(-10))innerHTML += ... 拼接,容易 XSS(如果历史词含 <script> 类内容)。应该用 document.createElement 或 textContent 确保安全。实操要点:
span 元素,设 textContent 而非 innerHTML
span 绑定 click 事件,触发搜索(例如 inputElement.value = term; form.submit())search-history-item)方便样式控制,避免用行内 style"react" 和 "React " 被当成两条;还有跨页面路径问题——如果 index.html 和 /search/index.html 是不同路径,localStorage 仍能共享,但若用了 iframe 或 Service Worker 缓存旧 JS,可能读到过期数据。排查方向:
searchHistory 的值是否符合预期localStorage.clear()(尤其某些 UI 框架的“重置状态”逻辑)localStorage 会抛出 QuotaExceededError,需兜底 try/catch 并降级为内存存储