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

JavaScript多元素拖拽实现求教:如何获取拖拽对象ID

多元素拖拽到指定区域的实现方案

问题背景

现有单元素拖拽代码,无法扩展为多元素拖拽,核心难点是在drop_handler中获取被拖拽对象的ID。

原代码

let offsetX;
let offsetY;

onDragStart = function(ev) {
  const rect = ev.target.getBoundingClientRect();

  offsetX = ev.clientX - rect.x;
  offsetY = ev.clientY - rect.y;
};

drop_handler = function(ev) {
  ev.preventDefault();

  const left = parseInt(id2.style.left);
  const top = parseInt(id2.style.top);

  id1.style.position = 'absolute';
  id1.style.left = ev.clientX - left - offsetX + 'px';
  id1.style.top = ev.clientY - top - offsetY + 'px';
  id2.appendChild(document.getElementById("id1"));
};

dragover_handler = function(ev) {
  ev.preventDefault();
  ev.dataTransfer.dropEffect = "move";
};
<div id="id1" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid green; cursor:pointer;width:100px;height:50px;">Dragged Div</div>

<div id="id2" style="position:absolute;left:200px;top:50px;border:2px solid red; cursor:pointer;width:200px;height:200px;" ondrop="drop_handler(event)" ondragover="dragover_handler(event)">Drop Div
</div>

修改方案

要支持多元素拖拽,核心是在拖拽开始时把被拖拽元素的ID存入dataTransfer对象,放置时再取出该ID操作对应元素:

1. 更新onDragStart函数

在拖拽启动时,将被拖拽元素的ID存入dataTransfer:

let offsetX;
let offsetY;

onDragStart = function(ev) {
  const rect = ev.target.getBoundingClientRect();
  offsetX = ev.clientX - rect.x;
  offsetY = ev.clientY - rect.y;
  // 存储被拖拽元素的ID
  ev.dataTransfer.setData("text/plain", ev.target.id);
};

2. 重构drop_handler函数

在放置事件中,取出存储的ID,动态定位被拖拽元素:

drop_handler = function(ev) {
  ev.preventDefault();
  // 获取被拖拽元素的ID
  const draggedId = ev.dataTransfer.getData("text/plain");
  const draggedElement = document.getElementById(draggedId);
  if (!draggedElement) return;

  const dropZone = ev.target;
  const left = parseInt(dropZone.style.left);
  const top = parseInt(dropZone.style.top);

  draggedElement.style.position = 'absolute';
  draggedElement.style.left = ev.clientX - left - offsetX + 'px';
  draggedElement.style.top = ev.clientY - top - offsetY + 'px';
  dropZone.appendChild(draggedElement);
};

3. 扩展HTML支持多拖拽元素

添加多个带唯一ID的可拖拽元素即可:

<div id="id1" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid green; cursor:pointer;width:100px;height:50px;">Dragged Div 1</div>
<div id="id3" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid blue; cursor:pointer;width:100px;height:50px; margin-top:10px;">Dragged Div 2</div>
<div id="id4" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid orange; cursor:pointer;width:100px;height:50px; margin-top:10px;">Dragged Div 3</div>

<div id="id2" style="position:absolute;left:200px;top:50px;border:2px solid red; cursor:pointer;width:200px;height:200px;" ondrop="drop_handler(event)" ondragover="dragover_handler(event)">Drop Div
</div>

关键说明

  • dataTransfer是拖拽事件的内置数据传递对象,用setData存储、getData读取,这里选择text/plain格式存储ID最简便。
  • 修改后的代码不再依赖硬编码的元素ID,而是动态获取被拖拽元素,自然适配多元素拖拽场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:55:27