JS-拖拽API
wenking 11/3/2023 js
<div data-drop="move" class="area">
<div draggable="true" class="box"></div>
</div>
1
2
3
2
3
// 拖拽开始事件触发, 事件源为拖拽元素
let source;
area.addEventListener("dragstart", function (e) {
// 指示 拖拽的指针效果
e.dataTransfer.effectAllowed = 'move';
// 将拖拽元素保存副本,供后续使用
source = e.target;
})
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
// 推拽到哪个元素之上,将触发该事件, 持续触发
area.addEventListener("dragover", function (e) {
// 浏览器默认是不允许其他元素拖拽到当前元素之前,因此在移动到某个元素之上时需要触发默认行为
e.preventDefault()
})
1
2
3
4
5
2
3
4
5
// 拖拽到元素上触发, 只触发一次
area.addEventListener("dragenter", function (e) {
let dropNode = e.target;
if (dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
dropNode.classList.add('drop-over')
}
})
1
2
3
4
5
6
7
2
3
4
5
6
7
// 拖拽放手,事件源为放手的元素
area.addEventListener("drop", function (e) {
let dropNode = e.target;
if (dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
const cloned = source.cloneNode(true)
dropNode.innerHTML = ''
dropNode.appendChild(cloned)
}
})
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10