php无法实现网页文字拖放,拖放由html5 drag & drop api在前端完成;draggable="true"仅启用拖放权限,需配合dragstart、dragover(必须preventdefault)、drop等事件及正确样式才能生效。

draggable="true" 为什么加了也没反应?
常见现象:写了 draggable="true",鼠标悬停变抓手,但按住拖不动,或拖动后松开没任何效果。
-
draggable="true"只是“开门”,不是“做事”——它只告诉浏览器“这个元素允许被拖”,不自动绑定事件、不传数据、不处理投放 - 空
<div> 没宽高(比如只有文字没 <code>padding或min-height),浏览器判定为不可交互,dragstart根本不会触发 - 样式拦住了:比如父级设置了
pointer-events: none,或自身有user-select: none,连mousedown都收不到,更别说拖拽事件 -
<input>、<textarea></textarea>即使加了draggable="true"也无效,它们原生不支持该属性 -
dragover必须监听,且回调中必须调用e.preventDefault();只写e.stopPropagation()或return false不行 - 没
dragover+preventDefault(),浏览器会在投放阶段直接拦截,drop根本不会派发 - 目标容器若为空
<div>,确认它没被 <code>display: none或visibility: hidden隐藏,否则无法命中 - Safari 对
effectAllowed和dropEffect匹配更严格:建议在dragstart中设e.dataTransfer.effectAllowed = 'move',在dragover中设e.dataTransfer.dropEffect = 'move' -
setData()必须在dragstart回调里执行,且只能设一次有效值;多次调用同 type 会覆盖,不同 type 可共存 - type 推荐用
"text/plain"或"text/html";自定义类型如"myapp/id"在 Firefox 中可能静默失败 - 传 JSON 用
setData("application/json", JSON.stringify(obj)),但要确保目标端用对应 typegetData("application/json")读取 - 不要依赖
event.target在drop里找容器——它可能是子元素;应绑定事件到目标容器本身,并用this或闭包变量定位
drop 事件死活不触发?90% 是 dragover 没拦住
目标容器监听了 drop,但回调从不执行——这不是 bug,是浏览器的硬性规则。
dataTransfer.setData() 怎么设才不丢数据?
拖动时存了数据,drop 里却拿到空字符串或 null,问题往往出在类型和时机上。
dragstart/drop,iOS Safari 和 Android Chrome 都不触发这些事件,不是兼容性差,是平台级禁用——真要支持手机,得用 touchstart/touchmove 手动模拟,或者换库(比如 interact.js)。










