JavaScript原生拖放详解

 更新时间:2024年11月25日 14:41:07   作者:橘猫吃不胖~  
本文介绍了HTML5拖放事件的处理方法,包括拖放事件的触发顺序、dataTransfer对象的使用以及可拖动能力的设置,通过这些方法,可以实现更丰富的用户交互效果

拖放事件

拖放事件可以让开发者控制拖放操作的方方面面,关键的部分是确定每个事件是在哪里触发的,有的事件在被拖放元素上触发,有的事件则在放置目标上触发。

当某个元素被拖动时,会按顺序触发以下事件:

事件说明
dragstart按住鼠标不放开始移动鼠标时触发
drag元素正在被拖动时触发
dragend停止拖动时触发

在把元素拖动到一个有效的放置目标上时,会依次触发以下事件:

事件说明
dragenter被拖动的元素进入目标容器时触发
dragover被拖拽元素在目标容器内拖动时触发
dragleave被拖动元素离开目标容器时触发
drop被拖动元素放到了目标容器上触发

如果我们想让一个元素可以被拖放,还要为该元素添加dragabble属性

dataTransfer对象

dataTransfer对象实现了拖动操作中的数据传输,用于从被拖动元素向放置目标传递字符串数据。

因为这个对象是event的属性,所以在拖放事件的事件处理程序外部无法访问dataTransfer

该对象内部有以下属性和方法:

事件说明
dropEffect可以告诉浏览器允许哪种放置行为,获取当前选定的拖放操作类型或者设置的为一个新的类型。值必须为none, copy, link、move。
effectAllowed表示对被拖动元素是否允许dropEffect,提供所有可用的操作类型。必须是none, copy, copyLink, copyMove, link, linkMove, move, all、uninitialized之一。
files包含数据传输中可用的所有本地文件的列表。如果拖动操作不涉及拖动文件,则此属性为空列表。
items提供一个包含所有拖动数据列表的DataTransferItemList对象。
types一个提供dragstart事件中设置的格式的strings数组。
clearData()删除与给定类型关联的数据。类型参数是可选的。如果类型为空或未指定,则删除与所有类型关联的数据。如果指定类型的数据不存在,或者data transfer中不包含任何数据,则该方法不会产生任何效果。
getData()检索给定类型的数据,如果该类型的数据不存在或data transfer不包含数据,则返回空字符串。
setData()设置给定类型的数据。如果该类型的数据不存在,则将其添加到末尾,以便类型列表中的最后一项将是新的格式。如果该类型的数据已经存在,则在相同位置替换现有数据。
setDragImage()用于设置自定义的拖动图像。

可拖动能力

HTML5在所有HTML元素上规定了一个draggable属性,表示元素是否可以拖动。

图片和链接的draggable属性自动被设置为true,而其他所有元素此属性的默认值为false

如果想让其他元素可拖动,或者不允许图片和链接被拖动,都可以设置这个属性。

示例代码:

<!-- 禁止拖动图片 -->
<img src="smile.gif" draggable="false" alt="Smiley face">
<!-- 让元素可以拖动 -->
<div draggable="true">...</div>

一个拖动demo

设置一个可以拖拽的元素:

<div id="draggable" draggable="true">Drag me!</div>
#draggable {
  width: 100px;
  height: 100px;
  background-color: #3498db;
  color: #fff;
  text-align: center;
  line-height: 100px;
  cursor: move;
  position: absolute;
}

const draggableElement = document.getElementById('draggable');
let offsetX, offsetY;
draggableElement.addEventListener('dragstart', function (event) {
  // 拖动开始时计算鼠标位置与元素左上角的偏移,并记录
  offsetX = event.clientX - draggableElement.getBoundingClientRect().left;
  offsetY = event.clientY - draggableElement.getBoundingClientRect().top;
});

draggableElement.addEventListener('drag', function (event) {
  // 计算元素应该移动到的位置
  const x = event.clientX - offsetX;
  const y = event.clientY - offsetY;
  // 更新元素位置
  draggableElement.style.left = x + 'px';
  draggableElement.style.top = y + 'px';
});

draggableElement.addEventListener('dragend', function (event) {
  const x = event.clientX - offsetX;
  const y = event.clientY - offsetY;
  // 拖动结束之后更新元素的位置
  draggableElement.style.left = x + 'px';
  draggableElement.style.top = y + 'px';
});

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JavaScript中字符串和字符串拼接操作实例代码

    JavaScript中字符串和字符串拼接操作实例代码

    这篇文章主要介绍了JavaScript中字符串和字符串拼接操作的相关资料,文中通过示例代码详解讲解了创建方式、不可变性及长度属性,包括+、+=、concat()、模板字符串拼接方法,需要的朋友可以参考下
    2025-05-05
  • JavaScript中使用ActiveXObject操作本地文件夹的方法

    JavaScript中使用ActiveXObject操作本地文件夹的方法

    以前一直用vbscript来操作文件夹,才发现原来使用JavaScript也是可以的,肯定不如vbs用的简单,不过学习一下还是不错的
    2014-03-03
  • JavaScript设计模式之代理模式实例分析

    JavaScript设计模式之代理模式实例分析

    这篇文章主要介绍了JavaScript设计模式之代理模式,简单描述了代理模式的概念、原理并结合实例形式分析了javascript代理模式的相关实现与使用技巧,需要的朋友可以参考下
    2019-01-01
  • 微信小程序实现蒙版弹出窗功能

    微信小程序实现蒙版弹出窗功能

    这篇文章主要介绍了微信小程序实现蒙版弹出窗功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • JavaScript 加号(+)运算符号

    JavaScript 加号(+)运算符号

    在一些框架中看到了类似这样的写法:+new Date();感觉有些怪,查阅了相关资料和一些网友的帮助.对此用法解释如下,希望对大家有所帮助,不合适的地方请大家指正!
    2009-12-12
  • JavaScript插件化开发教程(五)

    JavaScript插件化开发教程(五)

    这篇文章是JavaScript插件化开发系列教程的第五篇,还是着重于实战,通过具体的实例来学习jQuery的方式如何开发插件,有相同需求的小伙伴来参考下吧。
    2015-02-02
  • ES6入门教程之Array.from()方法

    ES6入门教程之Array.from()方法

    这篇文章主要给大家介绍了关于ES6入门教程之Array.from()方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ES6具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 深入探讨TypeScript中类与接口的使用

    深入探讨TypeScript中类与接口的使用

    TypeScript是一种强大的编程语言,它在JavaScript的基础上添加了静态类型检查,使得代码更加可维护和类型安全,在TypeScript中,类和接口是构建复杂应用程序的关键组成部分,本文将深入探讨TypeScript中类与接口的使用,需要的朋友可以参考下
    2023-09-09
  • 改变隐藏的input中value值的方法

    改变隐藏的input中value值的方法

    这篇文章主要介绍了改变隐藏的input中value值的方法,需要的朋友可以参考下
    2014-03-03
  • js实现Tab选项卡切换效果

    js实现Tab选项卡切换效果

    这篇文章主要为大家详细介绍了js实现Tab选项卡切换效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论