原生拖放需显式设置draggable="true"且dragover中调用preventDefault;dataTransfer传数据而非移动DOM;移动端不支持,须用touch事件或兼容库替代。

拖放事件监听必须在目标元素上显式设置 draggable="true"
HTML 元素默认不可拖,即使绑了 这是最常踩的坑——目标容器(drop zone)不响应 原生拖放不会自动移动节点; iOS Safari 和大多数安卓 WebView 完全忽略 立即学习“Java免费学习笔记(深入)”; 很多项目上线后才发现 iOS 上拖不动,问题就出在这里——原生拖放不是跨端可靠的交互机制。dragstart 也触发不了。必须手动加属性:。注意:仅 和 默认可拖,其他所有元素(包括 、)都得显式声明。常见错误是只写 JS 监听,忘了这个 HTML 属性,结果全程没反应。
dragover 事件里必须调用 event.preventDefault()
drop,往往是因为漏了这句。浏览器默认会阻止非链接/非图片元素的拖放行为,dragover 是唯一能“告诉浏览器:这里允许放下”的时机。不写 event.preventDefault(),drop 根本不会触发,连控制台都不会报错。
dragover,并立即 preventDefault
dragenter 或 dragleave 里做这事,它们不决定是否可投放dragenter 加 class,dragleave 移除,但 dragover 必须存在且调用 preventDefault
用
dataTransfer.setData() 传数据,别依赖 DOM 移动drop 触发时,你拿到的是一个 dataTransfer 对象,里面存着你在 dragstart 里塞进去的数据。常见误区是以为拖完元素就“到了”,其实只是触发了事件,DOM 还在原处。
event.dataTransfer.setData('text/plain', 'item-123') 是最常用方式,类型建议用 'text/plain' 或 'text/uri-list',避免用自定义 MIME 类型导致兼容问题drop 里直接 appendChild 拖拽源节点——它可能还在别的地方被引用,或已脱离文档流dragstart 存 ID 或序列化数据,在 drop 中根据 ID 找到对应元素,再用 JS 移动(如 insertBefore 或 append)移动端不支持原生
drag 系列事件draggable="true" 和所有 drag* 事件。这不是 bug,是规范明确不保证支持。想在手机上实现拖放,必须换方案:
touchstart/touchmove/touchend + CSS transform 模拟拖动视觉效果interact.js 或 sortablejs(它们内部做了平台判断和降级)










