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

实现标签点击删除功能控制台报TypeError,无法定位undefined值原因求助

问题原因定位

你遇到的TypeError核心来自两个问题:

  • removeArray函数仅在匹配到目标元素且result为true时返回数组,未匹配到目标时无返回值(即返回undefined),你在删除列表内容时直接对返回结果调用join方法,undefined没有对应方法就会抛出类型错误。
  • 每次新增标签都调用removeItem给所有已存在的标签重复绑定点击事件,后续点击一次标签会触发多次删除逻辑,也会引发异常。
修复方案

下面是修改后的完整代码,已解决所有报错和隐患:

const ingredientsInput = document.querySelector('#ingredients'),
      ingredientsContainer = document.querySelector('.ingredients__tag');
let ingredientsArray = [];

ingredientsInput.addEventListener('input', () => {
    if (ingredientsInput.value.includes(',')) {
        let v = ingredientsInput.value.replace(',', '').trim();
        // 修复原判断里的赋值错误,同时增加trim避免空内容标签
        if(v !== '' && v !== ',') {
            let s = document.createElement('span');
            s.setAttribute('class', 'tag__item');
            s.innerHTML = v;
            // 新增标签时直接绑定点击事件,不用全局遍历重复绑定
            s.addEventListener('click', () => {
                recipesInclude(v, false);
                removeArray(ingredientsArray, v, false);
                s.remove();
                console.log(ingredientsArray);
            });
            ingredientsContainer.appendChild(s);
            ingredientsArray.push(v);
            recipesInclude(v, true);
            ingredientsInput.value = "";    
        } else if(v === ',') {    
            ingredientsInput.value = "";
        }
        console.log(ingredientsArray);
    }
});

function removeArray(array, target, result) {
    for(let i = 0; i < array.length; i++){     
        if(array[i] === target) {     
            array.splice(i, 1); 
            break; // 匹配到就跳出,避免相同元素被多次删除
        }    
    }
    // 无论是否匹配到都返回数组,避免返回undefined
    if(result) return array;
}

function recipesInclude(ingredient, statement) {
    // 变量加声明,避免隐式全局变量
    const ingredientLead = document.querySelector('.list');
    if(statement) {
        if(ingredientLead.innerText.length > 0) {
            ingredientLead.innerHTML += ', ' + ingredient;
        } else {
            ingredientLead.innerHTML += ingredient;
        }
    } else {
        const ingredientSplit = ingredientLead.innerText.split(", ");        
        const processedArray = removeArray(ingredientSplit, ingredient, true);
        // 统一处理返回结果,不用分长度判断
        ingredientLead.innerHTML = processedArray.join(", ");
    }
}

原有HTML代码无需修改即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 13:36:05