Skip to content

用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按钮以放置这些元素。拖拽操作期间,会有一个可拖拽元素的半透明快照跟随着鼠标指针。

事件On 型事件处理程序触发时刻
dragondrag当拖拽元素或选中的文本时触发。
dragendondragend当拖拽操作结束时触发 (比如松开鼠标按键或敲“Esc”键). (见结束拖拽)
dragenterondragenter当拖拽元素或选中的文本到一个可释放目标时触发(见指定释放目标)。
dragleaveondragleave当拖拽元素或选中的文本离开一个可释放目标时触发。
dragoverondragover当元素或选中的文本被拖到一个可释放目标上时触发(每 100 毫秒触发一次)。
dragstartondragstart当用户开始拖拽一个元素或选中的文本时触发(见开始拖拽操作)。
dropondrop当元素或选中的文本在可释放目标上被释放时触发(见执行释放)。

拖拽操作 ​

在 HTML 中,除了图像、链接和选择的文本默认的可拖拽行为之外,其他元素在默认情况下是不可拖拽的。

要使其他的 HTML 元素可拖拽,必须做三件事:

将想要拖拽的元素的 draggable 属性设置成 "true"。 为 dragstart 事件添加一个监听程序。 在上一步定义的监听程序中 设置拖拽数据。

开始拖拽 ​

在 dragstart 事件中,你可以指定拖拽数据、反馈图像和拖拽效果,所有这些都将在下面描述。不过,我们只需要设置拖拽数据,因为在大多数情况下默认的图像和拖拽效果都是适用的

指定放置目标 ​

网页或应用程序的大多数区域都不是放置数据的有效位置。因此,这些事件的默认处理是不允许放置。

如果你想要允许放置,你必须取消 dragenter 和 dragover 事件来阻止默认的处理。调用事件的 preventDefault() 方法来实现这一点。

完成拖拽 ​

一旦拖拽完成,dragend 事件会在拖拽源头(即触发 dragstart 的元素)上发生。无论拖拽是成功还是被取消,这个事件都会被触发。然而,你可以使用 dropEffect 属性来决定执行什么放置操作。

DataTransfer ​

DataTransfer 对象用于保存拖动并放下(drag and drop)过程中的数据。它可以保存一项或多项数据,这些数据项可以是一种或者多种数据类型。

实例属性 ​

  1. DataTransfer.files属性在拖动操作中表示文件列表。如果操作不包含文件,则此列表为空。

此功能可用于将文件从用户桌面拖动到浏览器。

  1. DataTransfer的items 属性只读,是拖动操作中 数据传输项的列表。该列表包含了操作中每一项目的对应项,如果操作没有项目,则列表为空。

  2. DataTransfer.setData() 方法用来设置拖放操作的drag data到指定的数据和类型。

如果给定类型的数据不存在,则将其添加到拖动数据存储的末尾,使得 types 列表中的最后一个项目将是新类型。

如果给定类型的数据已经存在,现有数据将被替换为相同的位置。也就是说,替换相同类型的数据时 types列表的顺序不会更改。

  1. DataTransfer.getData() 方法接受指定类型的拖放(以DOMString的形式)数据。如果拖放行为没有操作任何数据,会返回一个空字符串。

数据类型有:text/plain,text/uri-list

示例

html
<html>
  <head>
    <script>
      function drop(e) {
        console.log(e.dataTransfer.items)
      }
    </script>
    <style>
      .block {
        width: 200px;
        height: 200px;
        background-color: aliceblue;
      }
    </style>
  </head>
  <body>
    <p
      draggable="true"
      ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')"
    >
      This text be dragged.
    </p>
    <div class="block" ondrop="drop(event)" ondragover="event.preventDefault()"></div>
  </body>
</html>