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

如何实现点击按钮逐个切换li元素颜色,上一个恢复绿色?

问题修正:点击按钮逐个切换li元素颜色

原代码存在两个核心问题:

  • 循环中给按钮绑定了等同于li数量的点击事件,点击一次会触发多轮逻辑,导致状态混乱
  • 仅给目标元素添加red类,但未清除上一个元素的red类,也未确保所有元素的green类正常生效

修正方案

首先确保CSS样式正确(控制颜色显示):

.green { color: green; }
.red { color: red; }

修改JavaScript代码,只绑定一次点击事件,维护当前选中的索引,每次点击时重置状态再切换目标元素样式:

const lis = document.querySelectorAll('li');
const btn = document.querySelector('button');
let currentIndex = 0;

// 仅绑定一次点击事件,避免重复触发
btn.addEventListener('click', () => {
    // 先将所有li恢复为绿色样式
    lis.forEach(li => {
        li.classList.add('green');
        li.classList.remove('red');
    });
    // 给当前索引对应的li设置红色样式
    lis[currentIndex].classList.remove('green');
    lis[currentIndex].classList.add('red');
    // 更新索引,到达末尾后重置为0
    currentIndex = (currentIndex + 1) % lis.length;
});

简化优化版(仅修改必要元素,提升性能)

通过维护上一个选中的元素,只操作两个元素的样式,避免遍历所有li:

const lis = document.querySelectorAll('li');
const btn = document.querySelector('button');
let prevSelectedLi = lis[0]; // 初始选中第一个li

btn.addEventListener('click', () => {
    // 恢复上一个选中元素的绿色样式
    prevSelectedLi.classList.remove('red');
    prevSelectedLi.classList.add('green');
    
    // 计算当前要选中的元素索引
    const currentIndex = (Array.from(lis).indexOf(prevSelectedLi) + 1) % lis.length;
    const currentSelectedLi = lis[currentIndex];
    
    // 设置当前元素的红色样式
    currentSelectedLi.classList.remove('green');
    currentSelectedLi.classList.add('red');
    
    // 更新上一个选中元素的记录
    prevSelectedLi = currentSelectedLi;
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:55:39