【问题标题】:JavaScript - How to retrieve new Index of class element after reordering using InsertBefore()JavaScript - 如何在使用 InsertBefore() 重新排序后检索类元素的新索引
【发布时间】:2021-06-26 07:42:43
【问题描述】:

注意:我不知道 JQuery,只知道 Vanilla JavaScript。

晚上好,

使用 insertBefore() 函数重新排序类元素后,我无法检索类元素的更新索引。

示例:元素 A、B、C 的索引为 0、1、2 重新排列后:C、A、B 的索引为 2、0、1,而不是 0、1、2。

这是我用于测试的代码。您可以单击单个元素,按钮重新排序会将最后一个元素移到第一个之前,并且可以在控制台日志中查看索引结果:

let container = document.getElementById('container');

let items = document.querySelectorAll('.items');

items.forEach((row, index) => {
  row.addEventListener('click', () => {
    console.log(index);
  });
});

let reorder = document.getElementById('reorder').addEventListener('click', () => {
  container.insertBefore(container.children[4], container.children[0]);
});
#container {
  border: 2px solid black;
  display: inline-block;
  position: relative;
}

.items {
  border: 2px solid red;
  margin: 2px;
  width: 20px;
}
<div id="container">

  <div class="items">0</div>
  <div class="items">1</div>
  <div class="items">2</div>
  <div class="items">3</div>
  <div class="items">4</div>

</div>

<button id="reorder">ReOrder</button>

【问题讨论】:

    标签: javascript indexing


    【解决方案1】:

    您当前的解决方案不起作用,因为 index 是在您的 for 循环首先添加事件侦听器时最初设置的闭包的一部分。您可以使用.indexOf() 在children 中搜索您单击的元素的索引。您首先需要将孩子转换为一个数组(这在下面使用spread syntax ... 完成),因为它是一个HTMLCollection,它没有 indexOf 方法:

    let container = document.getElementById('container');
    
    let items = document.querySelectorAll('.items');
    
    items.forEach((row, index) => {
      row.addEventListener('click', (event) => {
        console.log([...container.children].indexOf(row));
      });
    });
    
    let reorder = document.getElementById('reorder').addEventListener('click', () => {
      container.insertBefore(container.children[4], container.children[0]);
    });
    #container {
      border: 2px solid black;
      display: inline-block;
      position: relative;
    }
    
    .items {
      border: 2px solid red;
      margin: 2px;
      width: 20px;
    }
    <div id="container">
      <div class="items">0</div>
      <div class="items">1</div>
      <div class="items">2</div>
      <div class="items">3</div>
      <div class="items">4</div>
    </div>
    
    <button id="reorder">ReOrder</button>

    【讨论】:

    • 谢谢。这工作得很好,虽然我不明白为什么会这样。我从未听说过传播语法。我将不得不对其进行审查,以便了解何时以及如何正确使用它。再次感谢您的帮助。
    • @GracionIgnasiver 不用担心,传播语法是一个非常强大的工具,可以在很多地方使用,所以它绝对值得研究。如果您觉得此答案足以回答您的问题,您可以考虑通过单击答案左上角的灰色复选标记来接受它(请参阅:stackoverflow.com/help/someone-answers)。
    • 哦,好的。我单击了将您的答案标记为有用的箭头。对于那个很抱歉。这只是我第二次在这个网站上提问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多