【问题标题】:Dynamic element in getElementsByClassNamegetElementsByClassName 中的动态元素
【发布时间】:2021-04-08 09:49:39
【问题描述】:

我有这个 getElementsByClassName 的代码

<div id="menu">My List</div>

<div id="menu">
  <div>Coffee</div>
  <div class="lala">Tea</div>
  <div class="lala">Tea</div>
  <div class="lala">Tea</div>
  <div class="lala">Tea</div>
</div>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction() {
    var num = document.getElementsByClassName('lala').length+1;
    document.getElementsByClassName("lala")[num].innerHTML = "etc";
}
</script>

但它只是不起作用。 它仅在我手动将数字代替变量时才有效

document.getElementsByClassName("lala")[2].innerHTML = "etc";

我需要在最后一个类之后插入它,它是动态生成的,所以我不知道确切的数字。我做错了什么?

【问题讨论】:

标签: javascript


【解决方案1】:

试试这个

document.getElementsByClassName("lala")[document.getElementsByClassName("lala").length - 2].innerHTML = "etc";

【讨论】:

    【解决方案2】:

    您可以执行以下操作:

    function myFunction() {
        var lalaElementsLength = document.getElementsByClassName('lala').length;
        document.getElementsByClassName("lala")[lalaElementsLength - 1].innerHTML = "etc";
    }
    

    通过将[lalaElementsLength - 1] 作为索引号,您可以确保始终获得列表中的最后一个元素。

    您甚至可以通过使用以下代码省略对 lala 元素的第二个查询来缩短代码:

    function myFunction() {
        var lalaElements = document.getElementsByClassName('lala');
        lalaElements[lalaElements.length - 1].innerHTML = "etc";
    }
    

    【讨论】:

      【解决方案3】:

      然后数组的索引从0开始。然后如果你有3个项目,它将是索引:0 1 2

      而 document.getElementsByClassName('lala').length 返回项目数:3。那么你应该更新:

      var last_index = document.getElementsByClassName('lala').length - 1;
      

      【讨论】:

      • document.getElementsByClassNameHTMLCollection 的实例,不要数组
      • 一个 HTMLCollection 对象是一个类似数组的 HTML 元素列表。 length 返回 HTMLCollection 中元素的数量
      • 你是对的,但你的回答会让js初学者感到困惑。
      【解决方案4】:

      我对你的问题有点困惑。

      我可以通过两种方式理解这个问题:

      方式一:

      你想通过lala类插入最后一个li标签,内容为“etc”

      你错了:

      var num = document.getElementsByClassName('lala').length+1;
      

      一定是:

      var num = document.getElementsByClassName('lala').length-1;
      

      你应该设置变量来包含选择器:

      var selectors = document.getElementsByClassName ('lala');
      var num = selectors.length - 1;
      selectors[num].innerHTML = "etc";
      

      方式 2:

      你想通过lala类自动创建一个新的li标签,它的内容是"etc"

      执行此操作的代码如下:

      function myFunction () {
          var selectors = document.getElementsByClassName('lala');
          var num = selectors.length - 1;
          var newDiv = document.createElement('div');
          newDiv.classList.add('lala');
          newDiv.innerHTML = "etc";
          selectors[0].parentNode.insertBefore(newDiv, selectors[num].nextSibling);
      }
      

      【讨论】:

      • 你为什么要创建&lt;li&gt;
      • @charlietfl :我试图回答我理解问题的两种方式。如果方式 1 正确,OP 应该跳过方式 2
      • 很好,但是&lt;li&gt;&lt;div&gt; 的无效子代
      • @charlietfl:啊,是的。当我写答案时,我看到 OP 的代码是 UL 和 LI,写完后我看到问题更新了。我将编辑我的答案。谢谢
      • 哦,我没有看到他们编辑标记。不幸的事
      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多