JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)

news2024/12/22 21:36:38

简述:JavaScript的拖拽api相必大家都不陌生,今天来分享下元素在拖动时触发的事件,顺便做下记录。

一、ondragstart事件

ondragstart事件在拖动元素时触发,通常用于设置拖动时的数据类型和数据。可以通过event.dataTransfer.setData()方法设置数据类型和数据。

示例代码:

// 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", "这是拖动的数据");
});

二、ondragover事件

ondragover事件在拖动元素在目标元素上方时触发,通常用于防止默认的拖放行为。可以通过event.preventDefault()方法阻止默认行为。

示例代码:

// 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();
});

三、ondragenter事件

ondragenter事件在拖动元素进入目标元素时触发,通常用于设置拖动时的样式。

示例代码:

// 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事件

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();
    }
  }
};

视频讲解:

使用方式:拖拽API,课程表小案例讲解(复制后,打开抖音搜索)

1.02 lPX:/ 拖拽API # 前端开发工程师 # JavaScript # 编程 # 程序员 # web前端 # 前端 # 前端开发 https://v.douyin.com/UuyyMjc/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发环境搭建-stm32CubeIDE进行标准库开发

stm32CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE stm32CubeIDE下载 点击上面的链接&#xff0c;登录即可下载。 搭建demo工程 新建工作空间 创建一个工程 选择芯片-STM32F103C8T6 点击“Next” 点击“Finish ” 添加标准库到项目工程文件目录下 配…

SM国密算法(二)-- OpenSSL库中分离算法

一、OpenSSL简介&#xff1a; OpenSSL 是用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的一个强大、商业级和功能齐全的工具包。它也是一个通用的密码学库&#xff0c;包含有RSA、SM4、DES、AES等诸多加密算法。 OpenSSL GitHub地址 二、移植过程 1. 文件目录 下载在…

除蚂蚁文件数据恢复大师之外,还有哪些相似的软件?

数据丢失是一件常见的事情&#xff0c;许多人都会遇到这样的问题。为了解决这个问题&#xff0c;出现了许多数据恢复软件&#xff0c;其中包含蚂蚁文件数据恢复大师。但是&#xff0c;除了蚂蚁文件数据恢复大师之外&#xff0c;还有哪些类似的软件呢&#xff1f;本文为您整理了…

笔试强训总结3

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望能同大家一起进步&#xff01; 1.以下代码运行输出的是 public class Person{ private String name "Person"; int age0; } public class Child extends Person{ p…

selenium clear()无效的解决办法

做自动化时&#xff0c;在往输入框中send_keys前往往需要先清空一下这个输入框里的内容&#xff0c;避免输入框原本有内容或默认值&#xff0c;导致最终输入的结果不是预期的内容。 清空内容我们一般会用clear()方法 import time from selenium import webdriverdriver webd…

如何使用Python操作Excel文件?看这篇博客就够了!

前言 如何使用Python操作Excel文件&#xff1f;看这篇博客就够了&#xff01; 在工作中&#xff0c;我们经常需要处理和分析数据。而Excel作为一种广泛使用的数据分析工具&#xff0c;被很多人所熟知。但是&#xff0c;对于一些非技术背景的用户来说&#xff0c;如何操作Exce…

自学网络安全,一般人我劝你还是算了吧

学前感言: 我为什么会这样说&#xff0c;要一般人自学网络安全就算了&#xff0c;因为我不是一般人 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发 .3.有时多 google,baidu,我们往往…

自学网络安全(黑客)?一般人我劝你还是算了吧!

一、自学网络安全学习的误区和陷阱 1.不要试图以编程为基础的学习开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 …

IMX6ULL裸机篇之IIC协议

一. IIC实验简介 I2C 是最常用的通信接口&#xff0c;众多的传感器都会提供 I2C 接口来和主控相连。 比如摄像头、 加速度计、触摸屏等。 I.MX6U-ALPHA开发板 使用 I2C1 接口连接了一个距离传感器 AP3216C &#xff0c;本章我们就来学习如何使用 I.MX6U 的 I2C 接口…

“开启科技之门,每日工作充满力量” —— 全国科技者工作日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

科技创新—人工智能应用技术的出现

科技创新—人工智能应用技术的出现 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;研究目的是通过探索智慧的实质&#xff0c;扩展人类智能——促使智能主体会听&#xff08;语音识别、机器翻译等&#xff09;、会看&#xff08;图像识别、文字识别等…

深入解析CPU性能火焰图生成的内部原理

在进行CPU性能优化的时候&#xff0c;我们经常先需要分析出来我们的应用程序中的CPU资源在哪些函数中使用的比较多&#xff0c;这样才能高效地优化。一个非常好的分析工具就是《性能之巅》作者 Brendan Gregg 发明的火焰图。 我们今天就来介绍下火焰图的使用方法&#xff0c;以…

这三款识别图片手写文字的软件超好用

在过去&#xff0c;我们需要通过扫描或者人工录入的方式将手写文字数字化&#xff0c;这样操作不仅繁琐而且容易出错。而随着人工智能技术的发展&#xff0c;我们现在可以通过图片识别技术将手写文字自动识别为数字形态&#xff0c;从而实现自动化的信息处理和提取。这项技术可…

【C语言】经典题目(二)

C站的小伙伴们&#xff0c;大家好呀^^! 这一篇文章是C语言之经典题目&#xff0c;快来跟我一起进入C语言的世界吧&#xff01;&#x1f49e; C语言其他刷题篇在这里哦&#xff1a; 【C】语言经典题目&#xff08;一&#xff09; 【C语言】字符串—刷题篇 【C语言】经典题目二 求…

java.time包使用指南

目录 前言一、时区与时间1. 世界标准时&#xff1a;UTC、GMT、UT2. 地区时&#xff1a;Asia/Shanghai、UTC83. 时区&#xff1a;ZoneId、TimeZone4. 时间偏移量&#xff1a;ZoneOffset5. 时区简称&#xff1a;CTT、PRC 二、主要时间类1. 重要时间接口&#xff1a;Temporal2. 时…

Uni-app学习从0到1开发一个app——(1)初步了解各种小程序开发框架

文章目录 0 引入1、小程序常用框架1.1、 mpvue1.2、 mpvue1.3、 Tina.js1.4、 WePY1.5 微信官方1.6 TouchUI WX 2、uin-app3、引用 0 引入 uin-app官网地址&#xff1a;https://uniapp.dcloud.net.cn/ 最近对于小程序莫名的感兴趣起来&#xff0c;索性就从uni-app开始吧 1、小…

spring boot使用elasticsearch分词,排序,分页,高亮简单示例

目录 1. 创建ES实体2. 创建查询实体3. 查询方法实现3.1 核心代码3.2 构建查询条件3.2.1 关键词分词 3.3 高亮处理 4.完整查询代码展示 记&#xff0c;写一个简单的es分词demo,es版本6.8.12 如果使用es7有些方法可能会有所改变&#xff0c;请参考7的文档 es安装教程&#xff1a;…

PMP-识别相关方的重要性

一、为什么要识别相关方 每个项目都有相关方&#xff0c;他们会受项目的积极或消极影响&#xff0c;或者能对项目施加积极或消极的影响。有些相关方影响项目工作或成果的能力有限&#xff0c;而有些相关方可能对项目及其期望成果有重大影响。项目经理和团队正确识别并合理引导所…

Apache的日志分割

一、日志分割的作用 我们知道当服务安装完成以后&#xff0c;都会在相关服务下有一个logs文件里面有着访问日志和错误日志。访问日志可以帮我们记录访问者的信息&#xff0c;错误日志一般在服务搭建&#xff0c;服务配置&#xff0c;启动时能够快速寻找错误原因的日志&#xf…

堆的应用(堆排序、TOP - K问题)

前言 &#x1f34e; 时间复杂度&#xff1a; &#x1f95d; 堆排序的最坏时间复杂度为 &#xff1a;O(n*lg(n)) &#x1f95d; TOP - K问题的最坏时间复杂度为&#xff1a;O(n*lg(k)) &#x1f341;前面我们学习了二叉树、以及堆的结构&#xff0c;也用顺序表的结构成功的把堆的…