所有元素都支持防止目标事件,但是这些元素默认是不允许释放的,如果拖动元素经过不允许放置的元素无论用户如何操作,都不会触发drop事件,不过可以把任何元素变成有效的放置目标。方法是重写dropenter和droppover的默认行为:

<input id="moveSrc" value="我要被移动到红色div中去"></input>
<div id="moveTarget" style="width:100px;height:100px;background-color:red;"></div>
<div id="droptarget" style="height:100px;width:100px;border:1px solid red;"></div>
<p id="srcE">Hello </p>

首先我们需要把元素droptarget设置为可以放置的元素,也就是默认重写他的dragenter/dragover

//首先通过重写dragover/dragenter事件使得元素成为可以放置的元素
target.ondragover=function(event)
{
  event.preventDefault();
};
target.ondragenter=function(event)
{
  event.preventDefault();
};

然后我们需要给该元素设置一个drop事件,表示元素被放置时候触发的事件

//设置ondrop事件,如果放下了那么处理该事件!
target.ondrop=function(event)
{
//在FF3.5+中,放置事件的默认行为是打开被放置目标上的URL,如果是图片
//打开URL,如果是文本就会打开无效的URL,因此为了放FF支持正常拖放,需要默认事件!
  event.preventDefault();
//event.target是触发事件的元素
  event.target.innerHTML=event.dataTransfer.getData('Text');
};
为移动的元素设置dragstart事件,该事件用于存放需要移动的数据
//为需要移动的元素设置dragstart!
document.getElementById("srcE").ondragstart=function(event)
{
  event.dataTransfer.setData("Text","我要把我的数据传输过去!");
};

这时候当移动srcE的时候,并且在droptarget中释放,就会发现其内部文本变成了"我把我的数据传输过去"!
下面我要实现把文本框中的内容移动到第一个div中:
第一步:首先把第一个div变成可以放置的元素,即重写dragenter/dragover

//重写moveTarget的dragenter和dragover让红色的div可以放置
document.getElementById("moveTarget").ondragenter=function(e)
{
  e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
  e.preventDefault();
};
document.getElementById("moveTarget").ondragover=function(e)
{
  e.preventDefault();
};

第二步:为需要移动的元素设置dragstart事件

document.getElementById("moveSrc").ondragstart=function(e)
{
  e.dataTransfer.effectAllowed="move";//必须在dragstart中设置effectStart
};
第三步:重写div的drop事件
//重写了div的drop事件,因为默认情况下是什么也不做
document.getElementById("moveTarget").ondrop=function(event)
{   this.innerHTML=document.getElementById("moveSrc").value;
//火狐中取消drop默认行为,阻止打开URL
  event.preventDefault();
};

这时候也能实现文本框元素内容的移动!
注意:

(1)要使用dropEffect属性,必须在dragenter事件处理程序中针对放置目标来设置!
(2)dropEffect只有搭配effectAllowed属性才能用,effectAllowed表示允许拖动元素的那种dropEffect,而且effectAllowed在被移动元素的dragStart中设置!
(3)dropEffect只会导致光标显示为不同的符号,然而要怎么实现光标所指示的动作完全取决于代码的编写者,也就是说只要你不介入,没有什么会自动的移动,复制,也不会打开链接,总之,浏览器只能帮你改变光标的样式!

(4)当拖动文本框的时候,浏览器会调用setData将拖动文本以text格式保存到dataTransfer中,在拖动链接或者图片时候会保存URL,这样在drop事件中就可以读取了!

//注意:在这里我没有调用setData保存文本框的数据到dataTransfer中!
document.getElementById("moveSrc").ondragstart=function(e)
{
  e.dataTransfer.effectAllowed="copy";
};
//重写moveTarget的dragenter和dragover让红色的div可以放置
document.getElementById("moveTarget").ondragenter=function(e)
{
  e.dataTransfer.dropEffect="copy";
  e.preventDefault();
};
document.getElementById("moveTarget").ondragover=function(e)
{
  e.preventDefault();
};
//重写了div的drop事件,因为默认情况下是什么也不做
document.getElementById("moveTarget").ondrop=function(event)
{
  event.target.innerHTML=event.dataTransfer.getData('text');
  event.preventDefault();
};

在这个例子,在dragStart中我没有手动保存数据,但是在ondrop中用event.dataTransfer.getData('text')获取到了数据了!,至一点要特别注意,调用getData时候传入的是"text"!
但是我们建议还是通过手动调用setData来完成同样的操作!
(5)dataTransfer对象可以为每一种MIME类型都保存一个值,不过保存在dataTransfer对象中的数据只能在drop事件程序中读取,如果没有读取到,那么就是dataTransfer对象被销毁了,数据也丢失了!

document.getElementById("moveSrc").ondragstart=function(event)
{
//同时保存了URL和text类型
  event.dataTransfer.effectAllowed="copy";
  event.dataTransfer.setData('text','liangklfang');
  event.dataTransfer.setData('url','www.baidu.com');
};
//重写moveTarget的dragenter和dragover让红色的div可以放置
document.getElementById("moveTarget").ondragenter=function(e)
{
  e.dataTransfer.dropEffect="copy";
  e.preventDefault();
};
document.getElementById("moveTarget").ondragover=function(e)
{
  e.preventDefault();
};
//FF在第5个版本之前不能正确的将url和text映射为text/uri-list和text/plain
//但是可以将Text映射为text/plain,所以最好在检测URL时候检测两个值!
//获取文本时候用Text!
document.getElementById("moveTarget").ondrop=function(event)
{
  var url=event.dataTransfer.getData('url')||event.dataTransfer.getData('text/uri-list');
  var text= event.dataTransfer.getData('Text');//因为上面保存的是URL,所以在FF浏览器中drop事件调用以后就直接打开了指定的地址
  this.innerHTML=url+text;
  event.preventDefault();
};

总结:dataTransfer对象我在火狐浏览器低版本安装YSLOW时候见过,还是不错的技术!
---------------------
作者:liangklfang
来源:CSDN
原文:https://blog.csdn.net/liangklfang/article/details/48628171
版权声明:本文为博主原创文章,转载请附上博文链接!

DataTransfer对象的一些总结的更多相关文章

  1. HTML5 拖放(Drag 和 Drop)功能开发——浅谈dataTransfer对象

    [前言] 之前我已经为大家介绍过一篇有关HTML5中原生拖拽的相关知识了.今天为大家介绍HTML5拖拽中的其他一些关于dataTransfer对象的知识和应用. dataTransfer对象 之前的一 ...

  2. dataTransfer对象

    HTML5拖拽的数据传输 虽然通过dragstart.drag和dragend事件实现了原生拖拽.但是这仅仅是拖拽,在IE6和IE7中还是有些拖拽问题,并且也没有实现数据的交换.为了实现数据的交换,I ...

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

    转载  原文  https://my.oschina.net/jiangli0502/blog/179197 dataTransfer对象提供了对于预定义的剪贴板格式的访问,以便在拖曳操作中使用. 通 ...

  4. dataTransfer 对象

    dataTransfer 对象 提供了对于预定义的剪贴板格式的访问,以便在拖曳操作中使用. DHTML元素属性列表 属性 描述 dropEffect 设置或获取拖曳操作的类型和要显示的光标类型. ef ...

  5. HTML5拖拽功能中 dataTransfer对象详解

    有了HTML5,老板再也不用担心我们的上传了,再加上有拖拽上传是不是很酷.百度一下,有关HTML5拖拽上传的文章和实例不少,都缺不了一个至关重要的东东DataTransfer.但是详细介绍的不多,尤其 ...

  6. HTML5原生拖拽事件的值传递(三dataTransfer对象)

    引用一篇博客,讲解的比较详细:http://www.tuicool.com/articles/j6Zbam

  7. 拖动对象ondrag

    说明: 在进行拖放操作时,dataTransfer 对象用来保存被拖动的数据.它可以保存一项或多项数据.一种或者多种数据类型.dataTransfer对象有两个主要的方法:getData()方法和se ...

  8. DataTransfer(setData()方法)

    DataTransfer对象专门用来存储拖放时要携带的数据,它可以被设置为拖放事件对象的DataTransfer属性.---把拖动的数据存入其中setData有两个参数:1.第一个参数为携带数据的数据 ...

  9. HTML5 FileReader读取Blob对象API详解

    使用FileReader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容,可以使用File对象或者Blob对象来指定所要读取的文件或数据.其中File对象可以是来自用 ...

随机推荐

  1. 基础算法简单实现-python

    目录 Python(版本3.6+)-Anna-Lena Popkes

  2. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  3. YDWE Keynote

    [YDWE Keynote] 1.使用YDWE制作的地图,需要在禁用黑色阴影.迷雾.否则进入游戏将漆黑一片,什么都看不到. 2. 3. 4. 5. 6.

  4. Ubuntu---grep

    摘要:我们已经学过正则表达式了,所以现在开始学习 grep 也是水到渠成的事情. 简介:grep 是 Linux 中最常用的“文本处理工具”之一,grep 与 sed.awk 合称为 Linux 中的 ...

  5. 学习一下sticky-footer

    什么是sticky-footer? 当页面长度不够长的时候,页脚粘贴在视窗底部:如果页面足够长时页脚会被内容向下推送. 实现方式: 1.负margin布局方式 给内容div加一个父div,设置父div ...

  6. 开发模型之V模型

    1.模型目的: V模型的目的在于改进软件开发的效率和效果. 2.常见理论性描述:  V模型从整体上看起来,就是一个V字型的结构,由左右两边组成. 左边的下划线分别代表了需求分析.概要设计.详细设计.编 ...

  7. .NET Core PartialView 与 Ajax

    Ajax的核心是XMLHttpRequest对象(XHR),能够以异步方式从服务器获取新数据.开发主要利用Ajax来执行异步刷新和局部视图更新的功能. 而开发常常在前段页面利用JQuery封装的Aja ...

  8. MySQL索引优化步骤总结

    在项目使用mysql过程中,随着系统的运行,发现一些慢查询,在这里总结一下mysql索引优化步骤 1.开发过程优化 开发过程中对业务表中查询sql分析sql执行计划(尤其是业务流水表),主要是查看sq ...

  9. 分析easyswoole3.0源码,consoleTcpService(六)

    前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...

  10. docker不能上传镜像到自己网站的仓库

    错误提示如下: WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from ...