You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:01:00