JavaScript拖放功能依赖原生Drag and Drop API,需设draggable="true",通过dragstart、dragend、dragenter、dragover、dragleave、drop等事件协同实现数据传递与交互。
JavaScript 实现拖放功能主要依靠原生的 Drag and Drop API,它提供了一套语义明确、浏览器原生支持的事件机制,无需依赖第三方库即可完成元素拖拽、跨区域投放等交互。核心在于理解并合理监听和响应一系列拖放事件。
要让一个元素可拖动,必须设置其 draggable 属性为 true(默认为 false):
注意:只有部分元素(如 、)默认可拖,其他元素需显式开启。
拖放过程涉及源元素(被拖动者)和目标元素(投放区),不同阶段触发不同事件:
dataTransfer.setData())和自定义拖拽视觉效果(如半透明预览)。event.preventDefault() 才能允许后续的 drop 事件发生。preventDefault(),否则浏览器会阻止投放;常用来添加高亮样式或计算投放位置。event.dataTransfer.getData() 获取之前设置的数据,完成实际的业务逻辑(如移动 DOM、更新列表)。拖放过程中的数据通过 dataTransfe 对象传递,它是所有拖放事件对象的属性:
r
setData(type, data) 在 dragstart 中存入字符串数据(如 "text/plain"、"text/uri-list" 或自定义类型如 "application/json")。drop 中用 getData(type) 取出对应类型的数据。dataTransfer.types 判断支持哪些数据类型,实现更安全的投放校验。dataTransfer.effectAllowed(如 "move"、"copy")和 dataTransfer.dropEffect 控制光标样式和行为语义。dragenter 和 dragover 中调用 preventDefault(),否则 drop 永远不会触发。dragover 中执行耗时操作,因其触发频率极高,可能影响性能。touchstart/move/end 自行模拟,或使用 interact.js 等库。insertBefore() 或 appendChild() 操作 DOM,并配合 dragover 的坐标判断插入位置。