不明白为什么它只把第一个 int 放入数组 javaScript

Don't understand why it only put the first int into array in javaScript

我想用Js制作一个进度条。我正在关注 Cassidy Williams 于 2018 年 9 月 13 日制作的在线演示。 Link: https://codepen.io/cassidoo/pen/wEXQaG

我在步骤 div 元素中添加了更多步骤:

  <div class="steps">
    <div class="step" id="0"></div>
    <div class="step" id="1"></div>
    <div class="step" id="2"></div>
    <div class="step" id="3"></div>
    <div class="step" id="4"></div>
    <div class="step" id="5"></div>
    <div class="step" id="6"></div>
    <div class="step" id="7"></div>
    <div class="step" id="8"></div>
    <div class="step" id="9"></div>
    <div class="step" id="10"></div>
  </div>

但是当我点击第三步时最后一步的状态是点击。 这个错误有什么问题?另外,这个错误的解决方案是什么?

在JS代码的第6行,作者有以下内容:

progress(x.target.id);

替换为:

progress(+x.target.id);

在第 14、18 和 21 行,执行相同的操作。

steps.forEach((e) => {
    if (+e.id === stepNum) { // <-- here
      e.classList.add('selected');
      e.classList.remove('completed');
    }
    if (+e.id < stepNum) { // <-- here
      e.classList.add('completed');
    }
    if (+e.id > stepNum) { // <-- and here
      e.classList.remove('selected', 'completed');
    }
});

HTML id 是一个字符串,所以需要强制转换。条件行为不正常是因为使用了字符串比较而不是数字比较。通过将字符串转换为数字,它按预期工作。

David Fontes 的回答只对了一部分。您还需要 e.id 的类型转换才能使其正常运行。

所以替换

steps.forEach((e) => {
  if (e.id === stepNum) {
    e.classList.add('selected');
    e.classList.remove('completed');
  }
  if (e.id < stepNum) {
    e.classList.add('completed');
  }
  if (e.id > stepNum) {
    e.classList.remove('selected', 'completed');
  }
});

steps.forEach((e) => {
  let t = e.id * 1;
  if (t === stepNum) {
    e.classList.add('selected');
    e.classList.remove('completed');
  }
  if (t < stepNum) {
    e.classList.add('completed');
  }
  if (t > stepNum) {
    e.classList.remove('selected', 'completed');
  }
});

这并没有解决线条问题(蓝线超出最后一个圆圈),这似乎比 JavaScript 更 CSS 相关。

编辑:

David Fontes 在我进行更正后更新了他的答案,因此他的答案现在修复了所有类型转换。

对于蓝线问题:

let p = stepNum * 30; 更改为 let p = stepNum * 10;,其中 10 是移动条的百分比 (11 div,因此 10 步使10%).

如果您的代码不是 'hardcoded',那么修复行将无济于事,我的意思是:

let p = stepNum * 10;

所以,这里更好的解决方案是用另一个 div 包装 .progress 和 .steps 并给那个 div 相对位置。