Javascript className 属性仅更新备用列表项

标签 javascript

我尝试了以下代码:

var a = document.getElementsByClassName("cc");
for (var i = 0; i < a.length; i++) {
  a[i].className = "cd";
}
.cc {
  background-color: blue;
}

.cd {
  background-color: chartreuse;
}
<ul>
  <li class="cc">A</li>
  <li class="cc">B</li>
  <li class="cc">C</li>
  <li class="cd">D</li>
</ul>

这只会更新备用列表项,并非所有项都具有相同的类。我想知道这不起作用的原因。

最佳答案

问题.getElementsByClassName()导致问题。见下文。

var a = document.getElementsByClassName("cc");
for (var i = 0; i < a.length; i++) {
  console.log(`----- Loop ${i} -----`);
  // Current HTML collection
  console.log(a);
  // Target element
  console.log(`Target: ${a[i].textContent}`);
  a[i].className = "cd"; 
}
<ul>
  <li class="cc">A</li>
  <li class="cc">B</li>
  <li class="cc">C</li>
  <li class="cd">D</li>
</ul>

你的 for 循环是如何工作的:
  • a = [A, B ,C]
  • a[0] = A -> A.className = 'cd'
  • a = [B, C]
  • a[1] = C -> C.className = 'cd'
  • a = [B]
  • a[2] = undefined -> 循环结束

  • 解决方案
    使用.querySelectorAll()而不是 .getElementsByClassName() .
    前者产生一个静态集合,后者是 dynamic (这意味着当您更新 DOM 时,集合本身也会更新)。

    var a = document.querySelectorAll(".cc");
    for (var i = 0; i < a.length; i++) {
      a[i].className = "cd";
    }
    .cc {
      background-color: blue;
    }
    
    .cd {
      background-color: chartreuse;
    }
    <ul>
      <li class="cc">A</li>
      <li class="cc">B</li>
      <li class="cc">C</li>
      <li class="cd">D</li>
    </ul>

    现代解决方案
    使用.forEach()而不是 for环形。

    const a = document.querySelectorAll('.cc');
    a.forEach(element => element.className = 'cd');
    .cc {
      background-color: blue;
    }
    
    .cd {
      background-color: chartreuse;
    }
    <ul>
      <li class="cc">A</li>
      <li class="cc">B</li>
      <li class="cc">C</li>
      <li class="cd">D</li>
    </ul>

    关于Javascript className 属性仅更新备用列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66719080/

    相关文章:

    javascript - 如何使用 Dropzone.js 按文件类型更改上传目的地?

    javascript - 多个 redux-sagas

    javascript - 搜索后打开 URL

    javascript - 单击按钮后如何从iframe启动音频流

    javascript - 将自定义背景图像添加到世界地图的传单

    javascript - 将普通旧 JavaScript 对象转换为 Require.js 模块

    javascript - 将 QWERTY 条码扫描仪输入转换为 AZERTY

    javascript - HTML, CSS, JavaScript

    javascript - 将数组值推送到第一个索引

    javascript - JSON 对象数组的一个元素的增量值