您的位置:首页 > Web前端 > HTML5

HTML5学习日记——拖(Drag)&放(Drop)

2016-11-17 21:54 309 查看
浏览器支持

IE 9、Firefox、Opera 12、Chrome、Safari 5

拖(Drag) 放( drop)是 HTML5 的新特性。

直观来说,就是一个对象承担这一动作,一个对象承担这一动作。

创建两个元素来进行测试,以两个div为例,注意拖拽对象需设置 draggable 属性。链接和图片默认是可拖动的,不需要设置 draggable 属性。

<div id="boxDrop" ></div>  //用于放置,相当于容器
<div id="boxDrag" draggable="true"></div>  //用于拖动



设置样式用于展示

拖拽元素

在被拖拽的元素上触发的事件 :

ondragstart 用户开始拖动元素时触发

ondrag 元素正在拖动时触发

ondragend 用户完成元素拖动后触发

简单体会一下事件触发的过程

var boxDrag,boxDrop;
window.onload = function () {
boxDrag = document.getElementById("boxDrag");
boxDrop = document.getElementById("boxDrop");
msgDiv = document.getElementById("msg");

boxDrag.ondragstart = function (e) {
msgDiv.innerHTML = "开始拖动啦!";
}
boxDrag.ondrag = function (e) {
var str = msgDiv.innerHTML;
str = str +"<br/>"+ "拖动进行中~";
msgDiv.innerHTML = str;
}
boxDrag.ondragend = function (e) {
var str = msgDiv.innerHTML;
str = str +"<br/>"+ "拖动结束啦!";
msgDiv.innerHTML = str;
}




总之就是,开始,拖———-,结束。

下面,打印任一事件的具体内容:



标注出来的 dataTransfer 是拖拽数据传递对象,用来保存被拖动的数据。具体再打印一下dataTransfer的内容(当然最好直接查API)



标注出来了两个方法比较重要,也能直观的看出用途:设置数据和获取数据

在拖拽对象时设置元素进行存放。(在ondrag事件和ondragend事件中设置是不可以的)

boxDrag.ondragstart = function (e) {
e.dataTransfer.setData("Text","boxDrag");   //若未事先获取元素 可利用事件的目标属性event.target.id
}


setData()方法的第一个参数,也是getData()方法唯一的一个参数,是用来保存数据类型的字符串,取值是“text”或“URL”

*以上说法貌似是在IE中的定义,其他情况可以指定别的值。

放置元素

在容器元素上触发的事件 :

ondragenter 当被拖拽的对象进入其容器范围内时触发此事件

ondragover 当被拖拽的对象在容器范围内拖动时触发此事件

ondragleave 当被拖拽的对象离开其容器范围内时触发此事件

ondrop 在一个拖拽过程中,释放鼠标时触发此事件

具体的进入容器、离开容器过程不再测试。

preventDefault方法:用来阻止一些默认的元素处理方法。

在ondragover中一定要执行preventDefault(),否则ondrop事件不会被触发。因为默认情况下,数据/元素不能放置在其他元素中。有时在ondrop事件中也需要进行默认事件阻止。

boxDrop.ondragover = function (e) {
e.preventDefault();
}


最后用dataTransfer中的getData方法获取对象,进行append即可。

boxDrop.ondrop = function (e) {
//e.preventDefault();
var obj = document.getElementById(e.dataTransfer.getData("Text"));
boxDrop.appendChild(obj);
}


getData方法的参数与setData的第一个参数相同



本地资源问题

可以看到dataTransfer中还有一个files属性,当拖拽的对象是本地文件时,需要用到这一属性。

例如,随便将本地的一张图片拖至容器中,打印dataTransfer.files结果如下:



也就是通过dataTransfer.files[0]可以读取拖入的内容。

再利用FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL

如果使用jQuery UI,会方便很多。(jQuery UI的js文件,需在jQuery的js文件下方引入,因为执行顺序从上至下)然后只需引入拖、放方法即可。

$("#boxDrag").draggable();
$("#boxDrop").droppable();


而且被拖拽的对象可以被放置在容器的任意位置。HTML5若想放置在鼠标落下的位置,需加一步对css的设置(例如left和top的值)。

自己加油加油 笨鸟晚飞也要飞呀飞
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: