zoukankan      html  css  js  c++  java
  • HTML5 原生拖放

    前言:

     HTML5提供专门的拖拽与拖放的API,可以方便的指定某个元素可拖动,可以创建自定义的可拖动元素和放置目标

    相关知识点:

     1.拖放事件

        拖放元素时,将依次触发下列事件

      • dragstart  按下鼠标并开始移动鼠标时,在被拖放元素上触发
      • drag   元素被拖动期间持续触发
      • dragend   拖动停止时触发

        当元素被拖动到一个有效放置目标时,下列事件依次发生

      • dragenter 只要有元素被拖放到放置目标上时触发
      • dragover   被拖放元素在放置目标范围内移动时,持续触发
      • drop或dragleave 元素被拖放到放置目标中,触发drop事件;元素被拖出放置目标时,触发dragleave事件

     2.自定义放置目标

      假设有一个ID为‘droptarget’的<div>元素,利用一下代码可以将它变为一个放置目标

     1  var droptarget=$("#droptarget")
     2  
     3  droptarget.bind("dragover",function (event) {
     4    event.preventDefault();
     5  })
     6  droptarget.bind("dragenter",function (event) {
     7    event.preventDefault();
     8  })
     9  droptarget.bind("drop",function (event) {
    10    event.preventDefault();
    11  })

    以上代码执行后,当拖放元素移动到放置目标上时,光标会变成允许放置的符号,释放鼠标就会触发drop事件

    注意:在FireFox3.5+中,放置事件的默认行为是打开被放到放置目标的url,也就是说,将图片拖放到放置目标的时,页面会转向图像文件,而如果将文本放到当放置目标的时候,会因为无效URL而导致错误。因此,为了FireFox正常拖放,还要取消drop事件默认行为,阻止它打开URL

     3.dataTransfer 对象:拖放操作实现数据交换的媒介,使用一般为Event.dataTransfer。

          主要有两种方法:getData()和setData(),HTML5为此甲加以扩展,允许指定各种MIME类型,考虑跨流浪器问题,我们可以这样子使用:

    1 var dataTransfer=event.dataTransfer;
    2 // 读取URL
    3 var url=dataTransfer.getData('url')||dataTransfer.getData('text/uri-list');
    4 //读取文本
    5 var text=dataTransfer.getData('Text')

      注意:在Firefox中,clearData()和setData()方法只能在ondragstart事件处理程序中调用。在其他情况下使用clearData()和setData()方法都会引发异常。

      一定要将短数据放在前面,因为在IE10及之前版本不支持MIME类型名,会抛出错误;FireFox5.0版本之前不能正确将“text”类型映射为‘text/plain’,却可以将“Text”(注意大写)类型映射为‘text/plain’

     4.dataEffect和effecAllowed

    实例:

    为了更方便理解,实现了一个简单的demo

     demo源代码地址:戳 here

    源代码:

    html代码:

     1     <div class="container">
     2         <div class="favbox" id='droptarget'>
     3             <p style='margin:1px;font-size: 0.8rem;'>收集箱</p>
     4           <span><i class="fa fa-heart"></i>&nbsp;(<span id='favnum'>0</span>)</span>
     5         </div>
     6         <div class="gallery">
     7             <a href="images/image-1.jpg" class="image-link dragitem" draggable="true" data-lightbox="roadtrip" title="点击查看大图"> <img src="images/image-1.jpg" alt="" class="img-thumbnail img-fluid"></a>
     8             <a href="images/image-2.jpg" class="image-link dragitem" draggable="true" data-lightbox="roadtrip" title="点击查看大图"> <img src="images/image-2.jpg" alt="" class="img-thumbnail img-fluid"></a>
     9             <a href="images/image-3.jpg" class="image-link dragitem" draggable="true" data-lightbox="roadtrip" title="点击查看大图"> <img src="images/image-3.jpg" alt="" class="img-thumbnail img-fluid"></a>
    10         </div>
    11     </div>

    js代码:

     1  $(function () {
     2    new DragUtil('.dragitem', '#droptarget')
     3  });
     4 
     5 
     6  var DragUtil = function (dragList, dropEle) {
    /* 拖拽对象 */
    7 this.$draglist = $(dragList)
    /* 放置目标 */
    8 this.$droptarget = $(dropEle) 9 this.$dragEle = null; 10 11 this.$draglist.each(function (index, item) { 12 item.ondragstart = function (e) { 13 /*拖拽开始*/ 14 e.dataTransfer.effectAllowed = "move"; 15 if (e.target.nodeName === 'A') { 16 this.$dragEle = $(e.target) 17 } else { 18 this.$dragEle = $(e.target) 19 .parents('a')[0] 20 } 21 e.dataTransfer.setData("url", this.$dragEle); 22 return true; 23 }; 24 $(item) 25 .bind('dragend', function (e) { 26 /*拖拽结束*/ 27 28 this.$dragEle.remove() 29 return false 30 }); 31 }) 32 33 this.$droptarget.bind("dragover", function (event) { 34 /*拖拽元素在放置目标上移动的时候*/ 35 event.preventDefault(); 36 return true; 37 }) 38 this.$droptarget.bind("dragenter", function (event) { 39 /*拖拽元素在放置目标上的时候*/ 40 this.style.color = "red"; 41 return true; 42 }) 43 this.$droptarget.bind("drop", function (e) { 44 /*拖拽元素放置到放置目标,取消默认行为!*/ 45 e.preventDefault(); 46 var dataTransfer = e.originalEvent.dataTransfer 47 var imgUrl = dataTransfer.getData('url') || dataTransfer.getData( 48 'text/uri-list') 49 $(this) 50 .append('<img src="' + imgUrl + '">') 51 var favnum = $('#favnum') 52 .html(); 53 favnum++; 54 $("#favnum") 55 .html(favnum) 56 this.style.color = "#666"; 57 return true; 58 }) 59 }

    结束语:

    根据自己的简单的测试,demo在chrome,FireFox,IE均可实现,文中注意点是比较重要的部分,故重点高亮了,然而在FireFox,虽然不报错,但暂时还不能正确地利用dataTransfer进行数据交换,有空一定将此补上~~

    感谢阅读。文中要是有表述不准确的地方,欢迎指正。

  • 相关阅读:
    FMDB 使用方法
    Masonry
    iOS请求服务器数据去空NSNull
    NSProgress
    根据图标名称动态设置TreeList图标
    控制显示行头列(Indicator)
    窗体内元素遍历-通用方法(DevExpress 中BarManager的遍历)
    BarManager相关使用
    C# 枚举变量
    dev TreeList 获取可视区域节点方法
  • 原文地址:https://www.cnblogs.com/kasmine/p/6367749.html
Copyright © 2011-2022 走看看