站長資訊網
        最全最豐富的資訊網站

        H5拖放API基礎篇

          不要搞錯,本文不是講如何拖地的??催^《javascript精粹》朋友應該知道,他實現拖放的過程比較復雜,現在時代不同了,我們用H5的新的拖放API就能非常方便的實現拖放效果了。最近在園子見一園友寫了一篇《HTML5 進階系列:拖放 API 實現拖放排序》,真乃大師之作,大~熊同學作為一代菜鳥(不是宗師),無法與之想比,遂推出基礎篇,希望各位園友有所收獲。

        一、一個簡單的例子–地上有石子撿幾個吧

          

            地上有石子,撿幾個吧                                                            我是籃子                我是地                石子          石子          石子          石子          石子          石子          石子          石子          石子          石子

          (gif演示是用的edge,我的ubuntu做gif太麻煩了,借了個windows)

          H5拖放API基礎篇

          這里用一個簡單的例子演示了如何實現拖放,那么問題來了,從上面的演示中你可以猜出一些屬性和方法的用法了,那些方法的作用究竟是怎樣的?那些個屬性又是啥意思呢?下面一一到來。

        二、實現拖放的一般步驟

          1、找到一個可拖的元素

          正如不是所有人都叫大熊一樣,并不是所有的元素都是可以被拖的。img和a元素默認可拖,其他元素默認不可拖,當時可以加一個draggable=true讓它可拖。

          

        <p draggable='true'></p>

          2、處理拖放有關事件

          所有相關事件如下:(這個摘自:http://www.cnblogs.com/linxin/p/6794542.html)

          源對象:

        • dragstart:源對象開始拖放。

        • drag:源對象拖放過程中。

        • dragend:源對象拖放結束。

          過程對象:

        • dragenter:源對象開始進入過程對象范圍內。

        • dragover:源對象在過程對象范圍內移動。

        • dragleave:源對象離開過程對象的范圍。

          目標對象:

        • drop:源對象被拖放到目標對象內。

          我們可以用一個測試來看看這些事件的觸發時機和事件對象為何物。

          

        <!DOCTYPE html><html lang="en"><head>      <meta charset="UTF-8">      <title>testEvents</title>      <style type="text/css">          .source{              width: 50px;              height: 50px;              border: 1px solid red;          }          .process{              width: 100px;              height: 100px;              border: 1px solid black;              margin-top: 10px;          }          .dest{              width: 100px;              height: 100px;              border: 1px solid green;              margin-top: 10px;          }      </style></head><body>      <p class="source" id="source" draggable="true"></p>      <p class="process" id="process"></p>      <p class="dest" id="dest"></p>      <script type="text/javascript">      window.onload=function(){        var source = document.getElementById("source");        var process = document.getElementById("process");        var dest = document.getElementById("dest");        var sourceEle;            source.addEventListener("dragstart",function(e){              console.log("source dragstart");              console.log(e);              sourceEle = e.target;            var dt = e.dataTransfer;              dt.effectedAllowed = "all";          },false);            process.addEventListener("dragenter",function(e){              console.log("process dragenter");              console.log(e);          },false);            process.addEventListener("dragover",function(e){              console.log("process dragover");              console.log(e);          },false);            process.addEventListener("dragleave",function(e){              console.log("process dragleave");              console.log(e);          },false);            source.addEventListener("drag",function(e){              console.log("source drag");              console.log(e);          },false);            dest.addEventListener("dragend",function(e){              console.log("dest dragend");              console.log(e);              e.preventDefault();          },false);            dest.addEventListener("drop",function(e){              console.log("dest drop");              console.log(e);              dest.appendChild(sourceEle);              e.preventDefault();              e.stopPropagation();          },false);            document.ondragover = function(e){e.preventDefault();}          document.ondrop = function(e){e.preventDefault();}      }    </script></body></html>

          這個例子將拖放過過程涉及的事件做了一個羅列,這里不再細講,你可以查看控制臺看看事件的觸發順序和事件對象。

        三、一個重要的對象DataTransfer對象

          這里首字母大寫了,嚴格說叫做一個類,每一次拖放會實例化這個類,保存在事件對象的dataTransfer屬性中。其屬性和方法見下表(來自:http://www.cnblogs.com/ijjyo/p/4316232.html)

          感謝這位兄臺的總結,拿了你這么多東西,謝謝啊。

        H5拖放API基礎篇  

          H5拖放API基礎篇

        H5拖放API基礎篇

          下面做一些簡單的測試

          關于effectAllowed和dropEffect,這里將前者置為effectAllowed后者用下拉列表選擇,以便于看到不同的鼠標樣式。

          

        <!DOCTYPE html><html lang="en"><head>      <meta charset="UTF-8">      <title>testEvents</title>      <style type="text/css">          .source{              width: 50px;              height: 50px;              border: 1px solid red;          }          .process{              width: 100px;              height: 100px;              border: 1px solid black;              margin-top: 10px;          }          .dest{              width: 100px;              height: 100px;              border: 1px solid green;              margin-top: 10px;          }      </style></head><body>      <select id="dpe">          <option value="copy">copy</option>          <option value="move">move</option>          <option value="link">link</option>          <option value="none">none</option>      </select>      <p class="source" id="source" draggable="true"></p>      <p class="process" id="process"></p>      <p class="dest" id="dest"></p>      <script type="text/javascript">      window.onload=function(){        var source = document.getElementById("source");        var process = document.getElementById("process");        var dest = document.getElementById("dest");        var dpe = document.getElementById("dpe");        var dpev;            dpe.onchange = function(){              dpev = this.value;          }        var sourceEle;            source.addEventListener("dragstart",function(e){              console.log("source dragstart");              console.log(e);              sourceEle = e.target;            var dt = e.dataTransfer;              dt.effectedAllowed = "all";          },false);            dest.addEventListener("dragend",function(e){              console.log("dest dragend");              console.log(e);              e.preventDefault();          },false);            dest.addEventListener("drop",function(e){              console.log("dest drop");              console.log(e);              dest.appendChild(sourceEle);              e.preventDefault();              e.stopPropagation();          },false);            document.ondragover = function(e){              e.dataTransfer.dropEffect = dpev;              e.preventDefault();          }          document.ondrop = function(e){e.preventDefault();}      }    </script></body></html>

          我在ubuntu chrome測試法現,都是一個手,但是置為none時拖不進去了,可能不同系統會有一些差別。

          關于setData()和getData()方法

           這兩個是有關數據交換的方法,前者傳兩個參數,第一參數是一個mime類型字符串,第二個是數據;后者傳一個參數,為mime類型??捎胢ime類型為text/plain,text/html,text/xml,text/uri-list.

          測試用例,將菜單的菜拖到記錄本上。

          

        <!DOCTYPE html><html lang="en"><head>      <meta charset="UTF-8">      <title>點菜</title>      <style type="text/css">          .menu{              width: 200px;              height: 300px;              border: 1px solid red;              margin-right: 10px;              float: left;          }          .record{              width: 200px;              height: 300px;              border: 1px solid black;              margin-right: 10px;              float: left;          }      </style></head><body>      <ul class="menu" id="menu">          <li draggable="true">糖醋排骨</li>          <li draggable="true">青椒肉絲</li>          <li draggable="true">武昌魚</li>          <li draggable="true">手撕包材</li>          <li draggable="true">千葉豆腐</li>          </ul>      <ul class="record" id="record">                </ul>      <script type="text/javascript">          window.onload = function(){            var menu = document.getElementById("menu");            var record = document.getElementById("record");                menu.addEventListener("dragstart",function(e){                var dt = e.dataTransfer;                var tar = e.target;                if(tar.tagName=="LI"){                      dt.setData("text/plain",tar.innerHTML);                  }                  dt.effectedAllowed = "all";              },false);                record.addEventListener("drop",function(e){                var li  = document.createElement("li");                  li.appendChild(document.createTextNode(e.dataTransfer.getData("text/plain")));                  record.appendChild(li);                  e.stopPropagation();              },false);                record.addEventListener("dropend",function(e){                  e.preventDefault();              },false);                document.addEventListener("dragover",function(e){e.preventDefault()},false);                document.addEventListener("drop",function(e){e.preventDefault()},false);          }    </script></body></html>

          關于setDragImage(Element img,long x,long y)

          這個方法是設置拖放時的圖標的,第一個參數表是圖標元素,第二個表示相對與光標的水平偏移,第三個是垂直的。

          還是前面的例子,在dragstart事件添加下面的代碼,拖動時你會發現一只很大的手(不要被嚇到);

        var img = document.createElement("img");                  img.src = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1493802056263&di=232de2c30491e19f32833669ad5a67ae&imgtype=0&src=http%3A%2F%2Fstatic.freepik.com%2Ffree-photo%2Fone-finger_318-10333.jpg";                  dt.setDragImage(img,10,10);

        四、關于拖放數據傳遞

          上面的例子已經談到了拖放的數據傳遞方法,這里在總結一下。

          1、通過dataTransfer的setData()和getData()方法傳遞

          2、通過閉包的方法,請參考開篇的例子。

        五、總結

          HTML5的拖放api非常簡潔實用,為我們省去了很多麻煩,如果沒有它,我們可能需要通過mousedownmousemove等等事件才能實現上述功能。本文較為詳細的介紹了相關api,希望對你有所幫助。關于拖放api的應用大家可以參看下面鏈接的文章,他做了一個拖放排序,這是一個比較常見的應用場景。

          大~熊同學的粉絲數正在逼近三位數,感謝各位園友的支持,大~熊會繼續努力的! 

          參考:

        • http://www.cnblogs.com/ijjyo/p/4316232.html

        • http://www.cnblogs.com/linxin/p/6794542.html

         

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 秋霞午夜鲁丝片午夜精品久| 精品久久国产一区二区三区香蕉 | 日韩精品中文字幕第2页| 996久久国产精品线观看| 亚洲精品偷拍视频免费观看| 精品多毛少妇人妻AV免费久久| 久久精品人人做人人爽电影| 精品亚洲A∨无码一区二区三区| 四虎精品亚洲一区二区三区| 国产人成精品综合欧美成人| 午夜影视日本亚洲欧洲精品一区| 国产精品视频一区二区噜噜| 亚洲AV无码成人精品区天堂| 污污网站国产精品白丝袜| 精品人妻少妇一区二区 | 国产精品成人免费福利| 精品麻豆丝袜高跟鞋AV| 亚洲AV成人无码久久精品老人| 亚洲AV无码成人精品区大在线| 久久久久久国产精品免费免费| 国产精品美女久久久网AV| 91久久精品电影| 91精品国产91久久久久久蜜臀| 久久99精品国产| 日本一区二区三区精品中文字幕| 国产精品久久久久…| 精品一卡2卡三卡4卡免费视频| 国产精品第13页| 亚洲国产精品久久久久久| 91精品国产高清久久久久久国产嫩草| 久久99精品国产99久久| 欧美精品高清在线观看| 999精品色在线播放| 国产区精品福利在线观看精品| 久久精品国产精品亚洲下载| 日韩欧美国产精品第一页不卡| 亚洲精品无码专区久久同性男| 亚洲精品乱码久久久久久| 久久九九精品99国产精品| 国产精品99久久免费观看| 九九热精品在线|