JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)
作者:程序员11 时间:2023-06-25 人气:304 QQ交流群\邮箱:1003265987@qq.com
JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)
要展示的内容
简述:JavaScript的拖拽api相必大家都不陌生,今天来分享下元素在拖动时触发的事件,顺便做下记录。
// HTML
<div id="drag" draggable="true">拖动我</div>
<div id="drop">放置区域</div>
// JS
var drag = document.getElementById("drag");
// 拖拽开始 执行一次
drag.addEventListener("dragstart", function(event) {
event.dataTransfer.setData("text/plain", "这是拖动的数据");
});// HTML
<div id="drag" draggable="true">拖动我</div>
<div id="drop">放置区域</div>
// JS
var drop = document.getElementById("drop");
// 拖拽经过 一直执行(类似Mousemove事件)
drop.addEventListener("dragover", function(event) {
event.preventDefault();
});// HTML
<div id="drag" draggable="true">拖动我</div>
<div id="drop">放置区域</div>
// CSS
#drop {
border: 2px dashed #ccc;
}
#drop.dragover {
border-color: #f00;
}
// JS
var drop = document.getElementById("drop");
// 拖拽进入 执行一次
drop.addEventListener("dragenter", function(event) {
drop.classList.add("dragover");
});
drop.addEventListener("dragleave", function(event) {
drop.classList.remove("dragover");
});四、ondrop事件
// HTML
<div id="drag" draggable="true">拖动我</div>
<div id="drop">放置区域</div>
// JS
var drop = document.getElementById("drop");
// 拖拽放手 执行一次,table中的tr td默认禁止拖拽在上面
drop.addEventListener("drop", function(event) {
var data = event.dataTransfer.getData("text/plain");
console.log(data);
});下面通过一个课程表小案例,来实际应用一下,使用JavaScript拖拽API实现的课程表案例,效果如下:

HTMl:
<div class="demo_box"> <div class="left" data-drop="move"> <div data-effect="copy" draggable="true" class="subjects color1">语文</div> <div data-effect="copy" draggable="true" class="subjects color2">数学</div> </div> <table class="right_table" border="1"> <thead> <tr> <td>星期一</td> <td>星期二</td> <td>星期三</td> </tr> </thead> <tbody> <tr> <td data-drop="copy"></td> <td data-drop="copy"></td> <td data-drop="copy"></td> </tr> <tr> <td data-drop="copy"></td> <td data-drop="copy"></td> <td data-drop="copy"></td> </tr> <tr> <td data-drop="copy"></td> <td data-drop="copy"></td> <td data-drop="copy"></td> </tr> <tr> <td data-drop="copy"></td> <td data-drop="copy"></td> <td data-drop="copy"></td> </tr> </tbody> </table> </div> <script src="./draw.js"></script> // 用到的自定义属性 // draggable="true" // data-effect="copy" // data-drop="copy" // data-drop="move"
JavaScript:
// 事件委托 获取父元素
const containerBox = document.querySelector('.demo_box');
// console.log(containerBox);
let source;//定义source ,用于拿到节点‘
// 拖拽开始 执行一次
containerBox.ondragstart = (e) => {
// console.log("start", e.target);
// 拖拽事件改为移动 此事拖拽时元素上没有加号
// e.dataTransfer.effectAllowed = "move";
// 默认是copy复制 此事拖拽时元素上有加号
// e.dataTransfer.effectAllowed = "copy";
// 自定义事件data-effect = "copy" ,此事件可共享, 所以
e.dataTransfer.effectAllowed = e.target.dataset.effect;
// 拿到节点
source = e.target;
};
// 拖拽经过 一直执行,类似Mousemove事件
containerBox.ondragover = (e) => {
// console.log("over", e.target);
// 阻止默认行为 这里就是开启表格的drop事件
e.preventDefault();
};
function claerStyle() {
// 清除之前的背景颜色over_bg
document.querySelectorAll(".over_bg").forEach((node) => {
node.classList.remove("over_bg");
});
}
// 判断父元素
function getDropNode(node) {
while (node) {
if (node.dataset && node.dataset.drop) {
return node;
}
node = node.parentNode;
}
}
// 拖拽进入 执行一次
containerBox.ondragenter = (e) => {
// 清除之前的背景调用
claerStyle();
// console.log("enter", e.target);
// 改变背景颜色 添加over_bg时父子都会触发
// e.target.classList.add('over_bg');
// 所以给right里的td添加data-drop="copy"只接受复制
// 给left添加data-drop="move"
// const dropNode = e.target;
// 判断父元素
const dropNode = getDropNode(e.target);
if (dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
//如果相等 表示该节点能够接受目前拖拽的节点
dropNode.classList.add('over_bg');
}
};
// 拖拽放手 执行一次,table中的tr td默认禁止拖拽在上面,所以需要阻止默认行为;
containerBox.ondrop = (e) => {
// console.log("drop", e.target);
// 首先清除之前的背景颜色
claerStyle();
const dropNode = getDropNode(e.target);
if (dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
//如果相等 表示该节点能够接受目前拖拽的节点
// 分为两种情况
if (dropNode.dataset.drop === "copy") {
dropNode.innerHTML = '';
// 克隆元素 source是上面拿到的元素
const cloned = source.cloneNode(true);
cloned.dataset.effect = "move";
// 添加克隆的元素
dropNode.appendChild(cloned);
}
else {
source.remove();
}
}
};链接:https://blog.csdn.net/weixin_65793170/article/details/130941302
温馨提示:
欢迎阅读本文章,觉得有用就多来支持一下,没有能帮到您,还有很多文章,希望有一天能帮到您。
- 上一篇:html文件里怎么引用vue组件?
- 下一篇:前端实现电子签名
JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)---相关文章
HTML5-热门文章
活跃用户












