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

时间:2022-11-19 19:29:34

浏览器支持
IE 9、Firefox、Opera 12、Chrome、Safari 5


拖(Drag) 放( drop)是 HTML5 的新特性。
直观来说,就是一个对象承担这一动作,一个对象承担这一动作。

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

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

HTML5学习日记——拖(Drag)&放(Drop) 设置样式用于展示

拖拽元素

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

  • 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;
   }

HTML5学习日记——拖(Drag)&放(Drop)
总之就是,开始,拖———-,结束。

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

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

HTML5学习日记——拖(Drag)&放(Drop)
标注出来了两个方法比较重要,也能直观的看出用途:设置数据和获取数据
在拖拽对象时设置元素进行存放。(在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的第一个参数相同

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


本地资源问题
可以看到dataTransfer中还有一个files属性,当拖拽的对象是本地文件时,需要用到这一属性。
例如,随便将本地的一张图片拖至容器中,打印dataTransfer.files结果如下:
HTML5学习日记——拖(Drag)&放(Drop)

也就是通过dataTransfer.files[0]可以读取拖入的内容。
再利用FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL


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

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

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


自己加油加油 笨鸟晚飞也要飞呀飞