AddEventListener仅生效一次,输入框首次操作后无响应问题求助
问题分析与解决方案
问题根源
你的代码核心问题在于:searchPage函数将搜索栏设置为homeContainer的innerHTML,而当输入框触发keyup事件调用deafultView时,这个函数应该是把搜索结果直接覆盖了homeContainer的内容。这就导致首次输入后,原来的搜索输入框被完全移除,表现为“页面刷新、输入内容清空”;后续输入因为输入框已经不存在,自然没有任何响应。
解决方案
最合理的做法是拆分容器,将搜索栏和结果展示区分开,避免互相覆盖:
1. 修改searchPage函数,新增结果容器
function searchPage(){ // 添加搜索栏和独立的结果展示容器 let searchBar = `<div id="SearchBar" data-aos="zoom-in-up" class="container w-95"> <div class="row g-4 "> <h1 class="text-center text-white">Find Your Favorite meal!</h1> <div class="col-6"> <input id="searchname" type="text" class="form-control bg-black" placeholder="Search By Name"> </div> <div class="col-6"> <input id="searchletter" type="text" class="form-control bg-black" maxlength="1" placeholder="Search By First Letter"> </div> </div> </div> <!-- 新增结果展示容器 --> <div id="mealResults" class="container w-95 mt-4"></div>`; homeContainer.innerHTML = searchBar; let sName = document.querySelector("#searchname") let sletter = document.querySelector("#searchletter") sName.addEventListener("keyup", function() { console.log("check event1"); getMealsByName(this.value).then(function(data) { // 将结果渲染到独立的结果容器中 deafultView(data, document.getElementById('mealResults')); }) }) sletter.addEventListener("keyup", function() { console.log("check event2"); getMealsByLetter(this.value).then(function(data) { deafultView(data, document.getElementById('mealResults')); }) }) }
2. 修改deafultView函数,支持自定义目标容器
调整deafultView,让它接收一个容器参数,把搜索结果渲染到这个容器里,而不是覆盖整个homeContainer:
function deafultView(data, targetContainer) { // 原有的结果渲染逻辑,将内容插入到targetContainer中 // 示例: let resultsHTML = ''; // 遍历data生成结果HTML的逻辑... targetContainer.innerHTML = resultsHTML; }
替代方案(不推荐):事件委托
如果暂时不想拆分容器,可以用事件委托绑定事件,避免元素被移除后事件失效,但这种方式需要每次重新生成搜索栏,体验不如拆分容器:
function searchPage(){ const searchBarHTML = `<div id="SearchBar" data-aos="zoom-in-up" class="container w-95"> <div class="row g-4 "> <h1 class="text-center text-white">Find Your Favorite meal!</h1> <div class="col-6"> <input id="searchname" type="text" class="form-control bg-black" placeholder="Search By Name"> </div> <div class="col-6"> <input id="searchletter" type="text" class="form-control bg-black" maxlength="1" placeholder="Search By First Letter"> </div> </div> </div>`; homeContainer.innerHTML = searchBarHTML; // 用事件委托监听keyup事件 homeContainer.addEventListener('keyup', function(event) { const target = event.target; if (target.id === 'searchname') { getMealsByName(target.value).then(function(data) { // 重新渲染搜索栏 + 结果 homeContainer.innerHTML = searchBarHTML + generateResultsHTML(data); }); } else if (target.id === 'searchletter') { getMealsByLetter(target.value).then(function(data) { homeContainer.innerHTML = searchBarHTML + generateResultsHTML(data); }); } }); } // 新增生成结果HTML的函数 function generateResultsHTML(data) { // 生成结果HTML的逻辑... return '<div>...</div>'; }
内容的提问来源于stack exchange,提问作者Mohamed El-Haddad
相关产品推荐
相关产品推荐

