JavaScript 拖放功能依赖原生 Drag and Drop API,需设 draggable=”true”、在 dragstart 中用 setData 存数据、dragover 中 preventDefault 允许投放、drop 中 getData 执行操作。

JavaScript 实现拖放功能主要依靠原生的拖放事件(Drag and Drop API),不需要第三方库就能完成基本交互。关键在于理解事件触发顺序、正确设置可拖动元素和放置目标,并处理数据传递。
让元素可拖动
默认情况下 HTML 元素不可拖动。需要给目标元素添加 draggable=”true” 属性,例如:
仅设这个属性还不够,通常还要在 dragstart 事件中指定要传输的数据,比如:
立即学习“Java 免费学习笔记(深入)”;
- 使用 event.dataTransfer.setData(format, data) 存入文本、ID 或 JSON 字符串
- 常见格式用 “text/plain” 或“text/html“,自定义类型如 “application/my-item” 也行
- 可顺带设置拖拽时的视觉反馈,比如event.target.style.opacity = “0.5”
设置放置区域并允许投放
目标容器默认会拒绝投放。必须监听 dragover 事件并调用 event.preventDefault(),否则drop 事件永远不会触发:
- dragenter和 dragover 适合加高亮样式,提示用户可投放
- dragleave用来移除高亮
- 只在 drop 事件里读取数据:event.dataTransfer.getData(format)
- 注意:不要在 dragover 里做耗时操作,它会高频触发
处理投放逻辑
drop事件发生后,通常要做三件事:
- 阻止 浏览器 默认行为(比如打开文件或跳转链接):event.preventDefault()
- 取出传输的数据,例如const id = event.dataTransfer.getData(“text/plain”)
- 执行实际操作:移动 DOM 节点、更新数组、发送请求等
- 如果想复制而非移动,可在 dragstart 里设置 event.dataTransfer.effectAllowed = “copy”,并在drop 中用cloneNode()
兼容性与简化建议
现代浏览器都支持标准 Drag API,但 IE11 及更早版本有差异(比如只支持 text 和URL格式)。移动端不支持原生拖放,需用 touchstart/move/end 模拟。简单场景可直接用 SortableJS 或react-dnd这类库;纯 JS 开发建议封装成小函数,把 dragstart/dragover/drop 绑定逻辑抽离,避免重复写 preventDefault。
基本上就这些。不复杂但容易忽略 preventDefault 和 dataTransfer 的配合。