近期对表格的拖拽比较感兴趣,想着自己弄个小demo来学习一下这些事件
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documenttitle>
<style>
table {
border: 1px solid #7c7c7c;
border-spacing: 1px;
border-collapse: collapse;
}
tr > th,
tr > td {
width: 100px;
text-align: center;
/* border: 1px solid #ececec; */
}
tr > td:last-child {
cursor: pointer;
}
style>
head>
<body>
<table>
<tr
id="node0"
data-id="node0"
ondrop="onDrop(event, 'node0')"
ondragstart="dragStart(event, 'node0')"
ondragover="onDragOver(event, 'node0')"
draggable="false"
ondragenter="dragEnter(event, 'node0')"
ondragleave="onLeave(event, 'node0')"
>
<th>姓名th>
<th>年龄th>
<th>身高th>
<th>体重th>
<th>操作th>
tr>
<tr
id="node1"
data-id="node1"
ondrop="onDrop(event)"
ondragstart="dragStart(event)"
ondragover="onDragOver(event)"
draggable="true"
ondragenter="dragEnter(event)"
ondragleave="onLeave(event)"
>
<td>Jamestd>
<td>40td>
<td>191td>
<td>100kgtd>
<td>移动1td>
tr>
<tr
id="node2"
data-id="node2"
ondrop="onDrop(event)"
ondragstart="dragStart(event)"
ondragover="onDragOver(event)"
draggable="true"
ondragenter="dragEnter(event)"
ondragleave="onLeave(event)"
>
<td>Kobetd>
<td>41td>
<td>191td>
<td>101kgtd>
<td>移动2td>
tr>
<tr
id="node3"
data-id="node3"
ondrop="onDrop(event)"
ondragstart="dragStart(event)"
ondragover="onDragOver(event)"
draggable="true"
ondragenter="dragEnter(event)"
ondragleave="onLeave(event)"
>
<td>Jffesontd>
<td>42td>
<td>191td>
<td>202kgtd>
<td>移动3td>
tr>
<tr
id="node4"
data-id="node4"
ondrop="onDrop(event)"
ondragstart="dragStart(event)"
ondragover="onDragOver(event)"
draggable="true"
ondragenter="dragEnter(event)"
ondragleave="onLeave(event)"
>
<td>Glacktd>
<td>43td>
<td>191td>
<td>303kgtd>
<td>移动4td>
tr>
table>
<script>
let moveNode = null;
// 离开某个div的时候,给底部border置为空。
function onLeave(event) {
event.target.parentNode.style.borderBottom = "none";
}
// 拖拽结束的时候
function dragEnd(event) {
console.log(event, "ondragend");
}
// 拖拽结束释放鼠标的事件
function onDrop(event) {
// 阻止默认事件
event.preventDefault();
// 获得在某个元素上释放鼠标的 id
let name = event.target.parentNode.dataset.id;
console.log(event.target.parentNode, "event.target1");
console.log(moveNode, "movenode");
// 如果释放是在 TR的节点上,那就会触发事件。
if (event.target.parentNode.tagName == "TR") {
// 通过onDrop的节点名,来决定需要insertBefore的dom元素 id。
let newstr = Number(name.replace("node", "")) + 1;
console.log(newstr, "newstr");
// 这个是需要被插入的节点之后的节点
let behindNode = document.getElementById("node" + newstr);
// event.target.parentNode.parentNode 是table节点。需要在 behindNode 节点之前插入一个 moveNode
event.target.parentNode.parentNode.insertBefore(moveNode, behindNode);
// 将 onDrop 的dom元素的底部border清除
event.target.parentNode.style.borderBottom = "none";
// 找到table之下 所有的节点
let tableNode = document.getElementsByTagName("table");
let trnodes = tableNode[0].children[0].children;
// 遍历一下节点, 重置节点id
for (let i = 0; i < trnodes.length; i++) {
let item = trnodes[i];
item.id = "node" + i;
item.setAttribute("data-id", "node" + i);
}
// console.log(trnodes, "trnodes");
}
}
function onDragEnter(event) {
event.preventDefault();
}
function onDrag(event) {
event.preventDefault();
}
function dragStart(event) {
console.log(event, "dragStart");
moveNode = event.target;
moveNodeName = event.target.dataset.id;
}
function onDragOver(event) {
console.log("onDragOver");
event.preventDefault();
}
function dragEnter(event) {
if (event.target.dataset.id === moveNodeName) {
return;
}
event.preventDefault();
console.log(event.target.parentNode, "event.target1");
console.log(moveNode, "movenode");
if (event.target.parentNode.tagName == "TR") {
event.target.parentNode.style.borderBottom = "3px solid #bbffaa";
}
console.log("dragEnter");
}
script>
body>
html>