三、dataTransfer对象
上面只是简简单单地实现了拖放功能,但并没用利用该功能做出什么实际性的功能,这里我们介绍一个拖放事件中事件对象上的一个特别重要的属性——dataTransfer
我们通过 event.dataTransfer
来获取该对象,其主要的作用就是从被拖放元素向目标元素传递一个字符串数据
(1)方法
dataTransfer上有两个方法,如下表所示
方法 | 含义 |
setData | 设置字符串,并设置数据类型 |
getData | 获取对应数据类型的字符串 |
setData() 方法接收两个参数,第一个参数表示的是字符串的数据类型,HTML5规定了两种数据类型,分别是 text/plain
和 text/uri-list
,前者表示普通字符串,后者表示URL字符串;第二个参数 就是用于存放的字符串
getData() 方法只接收一个参数,即需要接收的字符串类型
我们来简单使用一下这两个方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .box{ width: 100px; height: 100px; background-color: lightgreen; } .location{ width: 100px; height: 100px; background-color: lightpink; } </style> </head> <body> <div class="box" draggable='true'></div> <div class="location"></div> <script> let box = document.querySelector('.box') // 为被拖放元素绑定 dragstart 事件 box.addEventListener('dragstart', function(e) { // 设置类型为 text/plain 的 字符串 e.dataTransfer.setData('text/plain', '我是拖放开始时被设置的字符串') }) let located = document.querySelector('.location') located.addEventListener('dragenter', function(e) { e.preventDefault() }) located.addEventListener('dragover', function(e) { e.preventDefault() }) located.addEventListener('drop', function(e) { // 将被拖放元素放置到目标元素时获取字符串 let res = e.dataTransfer.getData('text/plain') console.log(res); }) </script> </body> </html>
来看下测试结果
(2)属性
在 dataTransfer对象 上还有两个比较常用的属性,如下表所示
属性 | 含义 |
dropEffect | 被拖放元素的放置行为 |
effectAllowed | 目标元素支持的放置行为 |
首先说一下,这个两个属性需要搭配使用,它们决定了被拖放元素 和 目标元素 之间的关系的,当设定好两者的关系后,在进行拖动操作的时候,鼠标会根据不同的关系显示不同的样式,除此之外,没有别的特别的作用。
dropEffect 可以设置以下几个属性
值 | 含义 |
none | 默认值。不能把拖动的元素放在这里 |
move | 应该把拖动的元素移动到该目标元素 |
copy | 应该把拖动元素复制到该目标元素 |
link | 表示目标元素会打开被拖放进来的元素对应的链接 |
【注意】:dropEffect 属性必须在 dragenter事件 中设置,否则无效
effectAllowed 可以设置以下几个属性
值 | 含义 |
uninitialized | 被拖放元素没有设置放置性为 |
none | 被拖放元素不能有放置性为 |
copy | 只允许值为 'copy' 的 dropEffect 目标元素 |
link | 只允许值为 'link' 的 dropEffect 目标元素 |
move | 只允许值为 'move' 的 dropEffect 目标元素 |
copyLink | 只允许值为 'copy' 和 'link' 的 dropEffect 目标元素 |
copymove | 只允许值为 'copy' 和 'move' 的 dropEffect 目标元素 |
linkMove | 只允许值为 'link' 和 'move' 的 dropEffect 目标元素 |
all | 只允许任意值的 dropEffect 目标元素 |
【注意】:effectAllowed 属性必须在 dragstart事件 中设置,否则无效
上面也说了,这两个属性基本上只是用来改变鼠标样式的,所以如果想实现特定的功能还得我们自己来重写事件的处理函数。
下面来看一个拖放实例:
需求: 将一段文本拖放到一个元素中
因为文本是默认支持的拖放元素,所以我们可以不对其做任何的事件绑定。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .location{ width: 100px; height: 100px; border: 1px solid black; } </style> </head> <body> <div class="box">我是一段测试文字</div> <div class="location"></div> <script> let located = document.querySelector('.location') located.addEventListener('dragenter', function(e) { e.dataTransfer.dropEffect = 'copy' e.preventDefault() }) located.addEventListener('dragover', function(e) { e.preventDefault() }) located.addEventListener('drop', function(e) { e.target.innerHTML = e.dataTransfer.getData('text/plain') }) </script> </body> </html>
测试动图