javascript - HTML + Javascript : can't get all instances from two elements at once?

标签 javascript html css arrays dom

我想将 CSS 样式类添加到一组选定元素的所有实例:例如,所有 p 元素以及所有 h4 元素。

我定义了两个 JS 变量,它们获取上述标签的所有元素,并将它们插入一个数组中,这样我就可以创建一个函数,理论上应该将所选类应用于所选元素/标签的所有实例.

但是,当我运行代码时,该函数似乎只将类分配给数组的第一项。

Code and test

<html>
  <head>
    <meta charset="utf-8">
    <title>JS Bin</title>
    <style>
      .italic { font-style: italic; }
    </style>
  </head>
    <body>
      <h4>Text goes in here</h4>
      <p>Text goes in here</p>

      <script>
        function styleTxt() {
          let h4Elems = document.getElementsByTagName("H4");
          let pElems = document.getElementsByTagName("P");
          const elemArray = [pElems, h4Elems];

          for (eachElem in elemArray) {
            let elemInsts = elemArray[eachElem];
            for (eachInst in elemInsts) {
              let givenInst = elemInsts[eachInst];
              givenInst.classList.add("italic");
            }
          }
        }
        styleTxt();
      </script>

    </body>
</html>

如果我颠倒数组中元素标签的顺序,那么 h4 元素将获得 .italic 类,但 p元素不会。

也许不可能两次使用“文档”指令?是否有替代方法自动将同一类添加到一组多个(但不是全部)html 标签?

最佳答案

您正在遍历 HTMLCollection 的每个属性,包括像 length 这样的属性,导致 givenInst 成为一个数字。由于它没有 classList 属性,因此在 undefined 上调用 add 会产生错误并终止循环。

为了解决这个问题,您可以使用isNaN 来检查属性是否为数字:

.italic {
  font-style: italics;
}
<html>

<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .italic {
      font-style: italic;
    }
  </style>
</head>

<body>
  <h4>Text goes in here</h4>
  <p>Text goes in here</p>

  <script>
    function styleTxt() {
      let h4Elems = document.getElementsByTagName("H4");
      let pElems = document.getElementsByTagName("P");
      const elemArray = [pElems, h4Elems];

      for (eachElem in elemArray) {
        let elemInsts = elemArray[eachElem];
        for (eachInst in elemInsts) {
          if (!isNaN(eachInst)) {
            let givenInst = elemInsts[eachInst];
            givenInst.classList.add("italic");
          }
        }
      }
    }
    styleTxt();
  </script>

</body>

</html>

但是,更好的方法是使用 for...of 循环:

.italic {
  font-style: italics;
}
<html>

<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .italic {
      font-style: italic;
    }
  </style>
</head>

<body>
  <h4>Text goes in here</h4>
  <p>Text goes in here</p>

  <script>
    function styleTxt() {
      let h4Elems = document.getElementsByTagName("H4");
      let pElems = document.getElementsByTagName("P");
      const elemArray = [pElems, h4Elems];

      for (eachElem of elemArray) {
        for (eachInst of eachElem) {
          eachInst.classList.add("italic");
        }
      }
    }
    styleTxt();
  </script>

</body>

</html>

关于javascript - HTML + Javascript : can't get all instances from two elements at once?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69339070/

相关文章:

html - 如何让div随着它的内容增长?

javascript - 使用 jQuery 动态插入 MathML

javascript - Backbone.js 与非 RE​​STful 应用程序? (Backbone.js 适合我当前的项目吗?)

html - 按百分比分配单元格空间时水平滚动不起作用

Javascript 在某些类中更改 HTML

javascript - 检测打开的下拉菜单是否在视口(viewport)中,如果不在则使用react

javascript - 使用curl 获取Service Worker 数据

javascript - Angularjs 与 SEO 与 pushState

javascript - 在 iOS 中滚动锁定

javascript - 覆盖 carouFredSel 中的默认包装器名称