javascript - 更新显示的数字以匹配其在纯 javascript 中的元素顺序中的位置

标签 javascript

我有代码允许我拖放以重新排列项目并将它们从容器移动到容器,但我还想更新 span 标签内的数字以按顺序匹配它的位置。
例如,“科罗拉多”在 0 位置,但是当我在“犹他”之后拖动它时,我想更新“蒙大拿”使其旁边有“0”,“犹他”为“1”,“科罗拉多”为“2”,但我不知道该怎么做。
这是 JS fiddle :https://jsfiddle.net/benschnell/0wbfoqk9/

const draggables = document.querySelectorAll('.draggable')
const containers = document.querySelectorAll('.container')

draggables.forEach(draggable => {
  draggable.addEventListener('dragstart', () => {
    draggable.classList.add('dragging')
  })

  draggable.addEventListener('dragend', () => {
    draggable.classList.remove('dragging')
  })
})

containers.forEach(container => {
  container.addEventListener('dragover', dragOver);
})

function dragOver(e) {
   e.preventDefault()
    const afterElement = getDragAfterElement(this, e.clientY)
    const draggable = document.querySelector('.dragging')
    if (afterElement == null) {
      this.appendChild(draggable)
    } else {
      this.insertBefore(draggable, afterElement)
    }
}

function getDragAfterElement(container, y) {
  const draggableElements = [...container.querySelectorAll('.draggable:not(.dragging)')]

  return draggableElements.reduce((closest, child) => {
    const box = child.getBoundingClientRect()
    const offset = y - box.top - box.height / 2
    if (offset < 0 && offset > closest.offset) {
      return { offset: offset, element: child }
    } else {
      return closest
    }
  }, { offset: Number.NEGATIVE_INFINITY }).element
}
<ul class="container">
  <li class="draggable" draggable="true"><span>0</span> Colorado</li>
  <li class="draggable" draggable="true"><span>1</span> Montana</li>
  <li class="draggable" draggable="true"><span>2</span> Utah</li>
  <li class="draggable" draggable="true"><span>3</span> Montana</li>
  <li class="draggable" draggable="true"><span>4</span> Wyoming</li>
</ul>

<ul class="container">
  <li class="draggable" draggable="true"><span>0</span> Maine</li>
  <li class="draggable" draggable="true"><span>1</span> North Carolina</li>
  <li class="draggable" draggable="true"><span>2</span> Florida</li>
  <li class="draggable" draggable="true"><span>3</span> Virginia</li>
  <li class="draggable" draggable="true"><span>4</span> New York</li>
</ul>

最佳答案

您可以循环每个容器中的列表元素并根据它们的索引重新编号:

const draggables = document.querySelectorAll('.draggable')
const containers = document.querySelectorAll('.container')

draggables.forEach(draggable => {
  draggable.addEventListener('dragstart', () => {
    draggable.classList.add('dragging')
  })

  draggable.addEventListener('dragend', () => {
    draggable.classList.remove('dragging')
  })
})

containers.forEach(container => {
  container.addEventListener('dragover', dragOver);
})

function dragOver(e) {
  e.preventDefault()
  const afterElement = getDragAfterElement(this, e.clientY)
  const draggable = document.querySelector('.dragging')
  if (afterElement == null) {
    this.appendChild(draggable)
  } else {
    this.insertBefore(draggable, afterElement)
  }
  
  document.querySelectorAll('.container').forEach(c => {
    c.querySelectorAll('li.draggable').forEach((r, i) => {
      r.querySelector('span').innerHTML = i
    })
  })
}

function getDragAfterElement(container, y) {
  const draggableElements = [...container.querySelectorAll('.draggable:not(.dragging)')]

  return draggableElements.reduce((closest, child) => {
    const box = child.getBoundingClientRect()
    const offset = y - box.top - box.height / 2
    if (offset < 0 && offset > closest.offset) {
      return {
        offset: offset,
        element: child
      }
    } else {
      return closest
    }
  }, {
    offset: Number.NEGATIVE_INFINITY
  }).element
}
<ul class="container">
  <li class="draggable" draggable="true"><span>0</span> Colorado</li>
  <li class="draggable" draggable="true"><span>1</span> Montana</li>
  <li class="draggable" draggable="true"><span>2</span> Utah</li>
  <li class="draggable" draggable="true"><span>3</span> Montana</li>
  <li class="draggable" draggable="true"><span>4</span> Wyoming</li>
</ul>

<ul class="container">
  <li class="draggable" draggable="true"><span>0</span> Maine</li>
  <li class="draggable" draggable="true"><span>1</span> North Carolina</li>
  <li class="draggable" draggable="true"><span>2</span> Florida</li>
  <li class="draggable" draggable="true"><span>3</span> Virginia</li>
  <li class="draggable" draggable="true"><span>4</span> New York</li>
</ul>

关于javascript - 更新显示的数字以匹配其在纯 javascript 中的元素顺序中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63511742/

相关文章:

javascript - emergent react-autosuggest 列表中不监听 event click

javascript - d3 图有客户的时区而不是数据的

javascript - 如何访问内容类型字段内的字段?

javascript - js子菜单效果外观

javascript - 如何为 Splunk 日志手动设置时间戳?

javascript - 动态工厂方法 - 通过字符串实例化类收到错误 TS2322 : Type 'Util' is not assignable to type 'void'

javascript - JavaScript 或 JQuery 中 NumberFormat 的等价物是什么?

javascript - 通过 JS Laravel 访问存储目录

javascript - 延迟加载破坏了灯箱

javascript - 加载 JavaScript 或 CSS 而不执行它们的方法有哪些?