JS中dataTransfer对象在拖曳操作中的妙用

本文介绍如何利用dataTransfer对象实现网页元素的拖放功能,包括添加和删除收藏项的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dataTransfer对象提供了对于预定义的剪贴板格式的访问,以便在拖曳操作中使用。

通俗的讲就是在拖曳操作的过程中,我们可以用过dataTransfer对象来传输数据,以便在拖曳操作结束的时候对数据进行其他的操作。

对象属性


  • dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此处设置的拖放行为不再effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许为“null”、“copy”、“link”和“move”四值之一。
  • effectAllowed:设置或返回被拖动元素允许发生的拖动行为。该属性值可设为“none”、“copy”、“copyLink”、“copyMove”、“link”、“linkMove”、“move”、“all”和“uninitialized”。
  • items:该属性返回DataTransferItems对象,该对象代表了拖动数据。
  • types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。


对象方法


  • setData(format,data):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据
  • getData(format):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。
  • clearData([format]):从dataTransfer对象中删除指定格式的数据,参数可选,若不给出,则为删除对象中所有的数据。
  • addElement(element):添加自定义图标
  • setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向上的距离,y设置图标与鼠标在垂直方向上的距离。

下面我们就通过dataTransfer对象实现一个允许通过拖放来添加、删除‘收藏项’的功能。

<! DOCTYPE html>
< html >
     < head >
         < meta http-equiv = "Content-Type" content = "text/html;charset=utf-8" />
         < title >通过拖放实现添加、删除</ title >
         < style type = "text/css" >
             div>div{
                 display:inline-block;
                 padding: 10px;
                 background-color: #aaa;
                 margin: 3px;
             }
         </ style >
     </ head >
     < body >
         < div style = "width:600px;border:1px solid black;" >
             < h2 >可将喜欢的项目拖到收藏夹</ h2 >
             < div draggable = "true" ondragstart = "dsHandler(event);" >勿忘心安</ div >
             < div draggable = "true" ondragstart = "dsHandler(event);" >照顾自己</ div >
             < div draggable = "true" ondragstart = "dsHandler(event);" >Number 9</ div >
             < div draggable = "true" ondragstart = "dsHandler(event);" >崇拜</ div >
         </ div >
         < div id = "dest" style = "width:400px;height:400px;border:1px solid black;float:left;" >
             < h2 ondragleave = "return false;" >收藏夹</ h2 >
         </ div >
         < div id = "gb" draggable = "false" style = "width:100px;height:100px;border:1px solid red;float:left;" >我是垃圾桶</ div >
         < script type = "text/javascript" >
             var dest = document.getElementById("dest");
             var dsHandler = function (evt){
                 evt.dataTransfer.setData("text/plain","< item >"+evt.target.innerHTML);
             }
 
             dest.ondrop = function(evt){
                 var text = evt.dataTransfer.getData("text/plain");
                 if(text.indexOf("< item >") == 0){
                     var newEle = document.createElement("div");
                     newEle.id = new Date().getUTCMilliseconds();
                     newEle.innerHTML = text.substring(6);
                     newEle.draggable = "true";
                     newEle.ondragstart = function(evt){
                         evt.dataTransfer.setData("text/plain","< remove >"+newEle.id);
                     }
                     dest.appendChild(newEle);
                 }
             }
 
             document.getElementById("gb").ondrop = function(evt){
                 var id = evt.dataTransfer.getData("text/plain");
                 if(id.indexOf("< remove >") == 0){
                     var target = document.getElementById(id.substring(8));
                     dest.removeChild(target);
                 }
             }
 
             document.ondragover = function(evt){
                 return false;
             }
 
             document.ondrop = function(evt){
                 return false;
             }
         </ script >
     </ body >
</ html >

  



效果图如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值