前端学习随记の拖拽(三)HTML5篇

HTML5篇是拖拽学习的最后一篇了,O(∩_∩)O哈哈~。!

参考传送门:http://www.cnblogs.com/fsjohnhuang/p/3961066.html#t3,这位猿还是很有耐性的,介绍的很详细啊,下了大功夫啊(__) 嘻嘻……。

源代码传送门:https://github.com/WZOnePiece/study-draggable

HTML5之前,要实现网页元素的拖放操作,需要依靠mousedown、mousemove、mouseup等API,通过大量的JS代码来实现;HTML5中引入了直接支持拖放操作的API,大大简化了网页元素的拖放操作编程难度,并且这些API除了支持浏览器内部元素的拖放外,同时支持浏览器和其它应用程序之间的数据互相拖动。

相关API###

1、DataTransfer 对象:拖拽对象用来传递的媒介,使用一般为Event.dataTransfer。内部方法:

  • setData(type, data):设置被拖数据的数据类型和值;
  • getData(type):获取拖动数据值;
  • clearData(type):数据清除。

2、 draggable 属性:就是标签元素要设置draggable=true,否则不会有效果,例如:

<div title="拖拽我" draggable="true">列表1</div>

3、ondrag:表示鼠标拖拽的过程,类似于onmousemove。作用在源元素上。

4、ondragstart 事件:当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖拽元素上(源元素)。

5、ondragenter 事件:当拖曳元素进入目标元素的时候触发的事件,此事件作用在目标元素上。

6、ondragover 事件:拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上。

7、ondrop 事件:被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上。

8、ondragend 事件:当拖拽完成后触发的事件,此事件作用在被拖曳元素上。

9、dragleave事件:源元素离开目标元素,触发该事件。

10、Event.preventDefault() 方法:阻止默认的些事件方法等执行。在ondragover中一定要执行preventDefault(),否则ondrop事件不会被触发。另外,如果是从其他应用软件或是文件中拖东西进来,尤其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要在目标元素的ondragover事件中把它直接干掉。

11、Event.effectAllowed 属性:就是拖拽的效果,鼠标指针类型,仅能在dragover中设置。

简单例子:###

<!DOCTYPE html>
<html>
 <head>
  <title>实现HTML5中的拖拽效果</title>
  <meta charset="utf-8"/>
  <meta name='author' content='NARUTOne'>
  <style>
    #d1 {
        width : 300px;
        height : 300px;
        border : solid 1px black;
        float : left;
    }
    #d2 {
        width : 300px;
        height : 300px;
        border : solid 1px black;
        float : right;
    }
  </style>
 </head>

 <body>
    <!-- 用于显示源元素(DATA文件夹) -->
    <div id="d1">
        <p>源元素</p>
        <!-- 将该图片作为源元素 -->
        [站外图片上传中……(3)]</img>
    </div>
    <!-- 用于显示目标元素(PROJECT文件夹) -->
    <div id="d2">
        <p>目标元素</p>
    </div>
  <script>
      // 1. 获取源元素 - 图片元素
      var ele1 = document.getElementById("myimg");
      var d1 = document.getElementById("d1");
      // 2. 获取目标元素 - id为d2的div元素
      var d2 = document.getElementById("d2");
      // 3. 源元素事件 - dragstart事件
      ele1.addEventListener("dragstart",function(event){
          // a. 获取到源元素使用的数据 - src属性值
          var mysrc = ele1.src;
          console.log(mysrc);
          // b. 将数据设置到dataTransfer对象中
          event.dataTransfer.setData("text",mysrc);//text,指数据类型type
      });

      // 4. 目标元素事件 - drop事件;自定义处理拖放过程
      d2.addEventListener("drop",function(event){
          // a. 阻止页面的默认行为
          event.preventDefault();
          // b. 从dataTransfer对象得到数据
          var mysrc = event.dataTransfer.getData("text");//返回指定type的数据
          // c. 创建<img>元素,设置一些属性
          var myimg = document.createElement("img");
          myimg.src = mysrc;
      myimg.id = 'myimg';
          myimg.width = "200";

          // f. 将源元素从页面中删除
      var removeElem = document.getElementById('myimg');
          d1.removeChild(removeElem);
      // d. 将<img>元素添加到id为d2的div元素中
      d2.appendChild(myimg);
      // e. 清除dataTransfer对象中的数据内容
      event.dataTransfer.clearData("text");
      });
      /*
       * dragover和dragleave事件
       * * dragover - 源元素到达目标元素
       * * dragleave - 源元素离开目标元素
       * * 上述两个事件组合效果 - 拖拽效果
       * drop事件
       * * 完成逻辑
       */
      d2.addEventListener("dragover",function(){
          event.preventDefault();
      });
      d2.addEventListener("dragleave",function(){
          event.preventDefault();
      });

//d1作为目标元素
    d1.addEventListener("drop",function(event){
      event.preventDefault();
      // b. 从dataTransfer对象得到数据
      var mysrc = event.dataTransfer.getData("text");
      // c. 创建<img>元素,设置一些属性
      var myimg = document.createElement("img");
      myimg.src = mysrc;
      myimg.width = "200";
      myimg.id = 'myimg';
      // f. 将源元素从页面中删除

      var removeElem = document.getElementById('myimg');
      d2.removeChild(removeElem);

      d1.appendChild(myimg);
      event.dataTransfer.clearData("text");
    });

    d1.addEventListener("dragover",function(){
      event.preventDefault();
    });
    d1.addEventListener("dragleave",function(){
      event.preventDefault();
    });
      /*
      setDragImage()用于在拖放过程中,修改鼠标指针所指向的图像
          event.dataTransfer.setDragImage(image,x,y);
          event.target;返回触发事件的元素(事件的目标节点)
      */
  </script>
 </body>
</html>

效果图,但是比较丑(✿◡‿◡):



HTML5是存在兼容性问题的,则drag and drop (DnD)也是有兼容性问题的。例:IE6-7在dataTransfer对象存在兼容性问题。具体的兼容问题,还是需要具体问题具体解决了!
如果猿(媛)们想要了解更加具体的HTML5拖拽问题和技术,我建议可以看看文章开头的参考链接里面的文章,写的还是很好的。我本来想多借鉴下,写写文章什么的,想想还是算了(__) 嘻嘻……。毕竟人家找资料总结也是不容易啊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容