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

JavaScript轮播切换异常求助:索引计算错误致功能失效

问题分析与修复方案

核心问题

  1. 全局索引重复修改导致逻辑混乱:showSlide和showOtherSlide都直接修改全局index变量,调用顺序会覆盖索引状态,引发不可预期的行为。
  2. 边界处理逻辑错误:
    • showSlide中i<0时设置index = slideCount + 1,超出数组最大索引(数组长度为3,最大索引是2),会导致取到undefined。
    • i>=slideCount时设置index = slideCount - 2,不符合循环轮播预期,导致右侧箭头点击后索引被强制拉回,出现"随机失效"。
  3. 侧边轮播索引越界:当主索引是最后一个元素(index=2)时,index+1=3超出数组范围,sideSlide变为undefined,触发报错。

修复后的代码

JavaScript

var models = [
  {
    name: "Project 0",
    image: "/My Web Site/prj1.png",
  },
  {
    name: "Project 1",
    image: "/My Web Site/prj2.png",
  },
  {
    name: "Project 2",
    image: "/My Web Site/prj3.png",
  },
];

var index = 0;
var slideCount = models.length;

// 初始化渲染
showSlide(index);
showOtherSlide(index);

// 左箭头点击事件
document.querySelector("#arrowLeft").addEventListener("click", function () {
  index--;
  // 处理左边界,循环到最后一个元素
  if (index < 0) {
    index = slideCount - 1;
  }
  showSlide(index);
  showOtherSlide(index);
});

// 右箭头点击事件
document.querySelector("#arrowRight").addEventListener("click", function () {
  index++;
  // 处理右边界,循环到第一个元素
  if (index >= slideCount) {
    index = 0;
  }
  showSlide(index);
  showOtherSlide(index);
});

// 渲染主轮播,仅负责渲染,不修改全局index
function showSlide(i) {
  var currentSlide = models[i];
  document.querySelector(".card-text1").textContent = currentSlide.name;
  document.querySelector(".card-img-top1").setAttribute("src", currentSlide.image);
}

// 渲染侧边轮播,处理循环逻辑,避免越界
function showOtherSlide(i) {
  // 计算侧边索引:如果是最后一个元素,侧边显示第一个;否则显示下一个
  var sideIndex = i === slideCount - 1 ? 0 : i + 1;
  var sideSlide = models[sideIndex];
  document.querySelector(".card-text2").textContent = sideSlide.name;
  document.querySelector(".card-img-top2").setAttribute("src", sideSlide.image);
}

CSS(保留原代码)

.projects {
  margin-top: 3em;
}
#arrowLeft {
  margin-bottom: 6%;
  color: #6b757d;
  cursor: pointer;
}
#arrowLeft:hover {
  color: black;
}

#arrowRight {
  cursor: pointer;
  margin-bottom: 6%;
  color: #6b757d;
}
#arrowRight:hover {
  color: black;
}
p {
  color: #a2a2a2;
  text-align: center;
  margin-top: 10px;
}

#card1 {
  display: inline-block;
}

#card2 {
  display: inline-block;
}
#card3 {
  display: none;
}
.card-img-top2 {
  width: 100%;
  height: 25vh;
}
.card-img-top1 {
  width: 100%;
  height: 25vh;
}

HTML(保留原代码)

<div class="projects">
    <h3>MY PROJECTS</h3>
    <svg
      xmlns="http://www.w3.org/2000/svg"
      width="25"
      height="25"
      fill="currentColor"
      id="arrowLeft"
      class="bi bi-arrow-left-short"
      viewBox="0 0 16 16"
    >
      <path
        fill-rule="evenodd"
        d="M12 8a.5.5 0 0 1-.5.5H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H11.5a.5.5 0 0 1 .5.5z"
      />
    </svg>
    <div class="card" id="card1">
      <img class="card-img-top1" alt="Project 1" />
      <div class="card-body1">
        <p class="card-text1">kart1</p>
      </div>
    </div>
    <div class="card" id="card2">
      <img class="card-img-top2" alt="Project 2" />
      <div class="card-body2">
        <p class="card-text2">kart2</p>
      </div>
    </div>

    <svg
      xmlns="http://www.w3.org/2000/svg"
      width="25"
      height="25"
      fill="currentColor"
      id="arrowRight"
      class="bi bi-arrow-right-short"
      viewBox="0 0 16 16"
    >
      <path
        fill-rule="evenodd"
        d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8z"
      />
    </svg>
  </div>

关键修改说明

  1. 将索引边界处理移到点击事件中:全局index的修改和边界判断统一在箭头点击事件里完成,避免两个渲染函数修改索引导致冲突。
  2. 修复循环轮播逻辑:左箭头点击到index<0时,自动切换到最后一个元素;右箭头点击到index>=slideCount时,自动切换到第一个元素,实现无缝循环。
  3. 解决侧边轮播越界问题:通过三元判断,当主索引是最后一个元素时,侧边轮播显示第一个元素,否则显示下一个,彻底避免index+1越界的情况。
  4. 渲染函数仅负责渲染:showSlide和showOtherSlide只根据传入的索引渲染内容,不再修改全局index,逻辑更清晰,减少副作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:15:58