You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript拖拽功能问题:同UL列表放置元素如何不自动跳转至底部

解决方案

我们只需要新增两个变量记录拖拽元素的原始位置信息,再修改放置逻辑即可实现需求,修改后的完整代码如下:

var li = document.getElementsByTagName('li');
var ziel = document.getElementsByClassName('ziel');
var dragItem = null;
// 新增两个变量记录原始位置信息
var originParent = null;
var originIndex = null;

for (var i of li) {
  // 若HTML中li已设置draggable="true"可删除下一行
  i.setAttribute('draggable', true);
  i.addEventListener('dragstart', dragStart);
  i.addEventListener('dragend', dragEnd);
}

function dragStart() {
  dragItem = this;
  // 记录原始父容器和原始索引
  originParent = this.parentElement;
  originIndex = Array.from(originParent.children).indexOf(this);
  setTimeout(() => (this.style.display = 'none'), 0);
}

function dragEnd() {
  setTimeout(() => (this.style.display = 'block'), 0);
  // 重置所有记录变量
  dragItem = null;
  originParent = null;
  originIndex = null;
}

for (j of ziel) {
  j.addEventListener('dragover', dragOver);
  j.addEventListener('dragenter', dragEnter);
  j.addEventListener('drop', Drop);
}

function Drop() {
  // 判断当前放置的容器是否是原始父容器
  if (this === originParent) {
    // 是则插回原始位置
    this.insertBefore(dragItem, this.children[originIndex]);
  } else {
    // 不是则追加到末尾
    this.append(dragItem);
  }
}

function dragOver(e) {
  e.preventDefault();
}

function dragEnter(e) {
  e.preventDefault();
}

核心逻辑说明

  • 拖拽触发时记录拖拽元素的原始所属父容器、以及在父容器子节点中的索引位置
  • 元素放置时先判断目标容器是否为原始父容器:如果是则通过insertBefore方法将元素插回原始索引位置;如果是其他容器则保持追加到末尾的原有逻辑
  • 拖拽结束后重置所有记录变量,避免影响后续拖拽操作

内容的提问来源于stack exchange,提问作者Franziska Bengeldorf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:24:05