You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Web Storage分页搜索异常求助:页面2搜索结果无法更新

问题分析与修复方案

嘿,我一眼就看出问题出在哪了!咱们一步步来梳理清楚:

问题根源

  • 页面2的mystorage()函数只读取不更新:当你在页面2输入新内容点击Filter时,这个函数只是从sessionStorage里拿旧值,根本没把新输入的内容存进去,自然用的还是之前的过滤条件。
  • 点击Filter后没触发过滤逻辑:页面2的Filter按钮只调用了mystorage(),但负责渲染过滤结果的myfilter()函数没被触发,就算更新了存储,页面也不会重新渲染结果。

修复后的代码

页面1(Index)代码(这部分逻辑没问题,保持原样即可)

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
</style>
</head>
<body>
<h2>My Phonebook</h2>
<input type="text" id="autocomplete" placeholder="Search for names.." title="Type in a name">
<button onclick="mystorage(); location.href = './searchresults.html';">Filter</button>
<hr>
<script>
// Check browser support
function mystorage() {
  if (typeof(Storage) !== "undefined") {
    // Store
    sessionStorage.setItem("lastname", document.getElementById("autocomplete").value);
  } else {
    document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Storage...";
  }
}
</script>
</body>
</html>

页面2(Searchresults)修复后的代码

<body onload="initPage();">
<h2>My Phonebook</h2>
<input type="text" id="autocomplete" value="" placeholder="Search for names.." title="Type in a name">
<p> Search results for "<span id="result"></span>" </p>
<button onclick="handleFilter();"> Filter </button>
<hr>
<ul id="myUL">
<li><a href="#">Adele</a></li>
<li><a href="#">Agnes</a></li>
<li><a href="#">Billy</a></li>
<li><a href="#">Bob</a></li>
<li><a href="#">Calvin</a></li>
<li><a href="#">Christina</a></li>
<li><a href="#">Cindy</a></li>
</ul>
<script>
// 页面初始化统一处理
function initPage() {
  if (typeof(Storage) !== "undefined") {
    const savedValue = sessionStorage.getItem("lastname");
    document.getElementById("autocomplete").value = savedValue;
    document.getElementById("result").innerHTML = savedValue;
    // 初始化时就执行过滤,确保跳转过来直接显示对应结果
    myfilter();
  } else {
    document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Storage...";
  }
}

// 处理过滤按钮点击逻辑
function handleFilter() {
  if (typeof(Storage) !== "undefined") {
    const inputVal = document.getElementById("autocomplete").value;
    // 先把新的输入值存入sessionStorage
    sessionStorage.setItem("lastname", inputVal);
    // 更新页面上显示的搜索关键词
    document.getElementById("result").innerHTML = inputVal;
    // 立即执行过滤逻辑,更新结果
    myfilter();
  } else {
    document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Storage...";
  }
}

function myfilter() {
  var input, filter, ul, li, a, i;
  input = document.getElementById("autocomplete");
  filter = input.value.toUpperCase();
  ul = document.getElementById("myUL");
  li = ul.getElementsByTagName("li");
  for (i = 0; i < li.length; i++) {
    a = li[i].getElementsByTagName("a")[0];
    if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
      li[i].style.display = "";
    } else {
      li[i].style.display = "none";
    }
  }
}
</script>
</body>

关键修改点

  1. 把页面初始化的多个零散函数合并成initPage(),逻辑更清晰,确保先加载存储的搜索值,再执行过滤渲染。
  2. 新增handleFilter()函数替代原来的mystorage(),现在点击Filter时会完整执行:
    • 获取当前输入框的新值
    • 更新sessionStorage里的存储内容
    • 更新页面上显示的搜索关键词
    • 立即调用myfilter()重新过滤并渲染结果
  3. 去掉了冗余的判断逻辑,让代码更简洁易维护。

现在再测试一下,不管是从页面1跳转过来,还是在页面2直接修改搜索内容点击Filter,结果都会正确更新啦!

内容的提问来源于stack exchange,提问作者Reginald1234

火山引擎 最新活动