整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何使用HTML5實現多個元素的拖放功能

          過使用HTML5的拖放功能我們可以拖放HTML頁面元素。在上一篇文章中,我們介紹了有關于可以拖放單個元素的代碼。在接下來的這篇文章中,我們將來介紹關于允許拖放多個元素的代碼。



          話不多說,我們直接看示例

          示例一:使用UL標記拖放多個元素

          代碼如下:

          ListDragDrop.html

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8" />

          <title></title>

          <link rel="stylesheet" href="ListDragDrop.css"/>

          <script>

          function load() {

          var delbox = document.getElementById('del');

          delbox.addEventListener('dragover', onDragOver, false);

          delbox.addEventListener('drop', onDrop, false);

          var elems = document.querySelectorAll('ul#list1 > li');

          for (var i = 0; i < elems.length; i++) {

          el = elems[i];

          el.setAttribute('draggable', 'true');

          el.addEventListener('dragstart', onDragStart, false);

          }

          }

          function onDragStart(e) {

          e.dataTransfer.effectAllowed = 'copy';

          e.dataTransfer.setData('text', this.id);

          }

          function onDragOver(e) {

          e.preventDefault();

          }

          function onDrop(e) {

          if (e.stopPropagation) e.stopPropagation();

          var eid = e.dataTransfer.getData('text');

          var elem = document.getElementById(eid);

          elem.parentNode.removeChild(elem);

          }

          </script>

          </head>

          <body onload="load();">

          <div id="del">刪除</div>

          <ul id="list1">

          <li id="1">海豚</li>

          <li id="2">鯨魚</li>

          <li id="3">企鵝</li>

          <li id="4">北極熊</li>

          <li id="5">雪狐</li>

          </ul>

          </ul>

          </body>

          </html>

          ListDragDrop.css

          #del{

          width:120px;

          height:60px;

          border: solid 2px #ff6a00;

          }

          ul#list1 > li {

          display: block;

          width: 150px;

          border: 1px solid #808080;

          }

          說明:

          加載頁面時執行加載功能。load函數中的以下代碼將dragover和drop事件分配給[Delete]的div。當元素被拖動到Delete框時,會調用onDragOver函數,當它被刪除時,會調用onDrop函數。

          var delbox = document.getElementById('del');

          delbox.addEventListener('dragover', onDragOver, false);

          delbox.addEventListener('drop', onDrop, false);

          調用querySelectorAll方法以獲取ul標記中的li元素。for循環反復處理中獲取的元素數組,并將每個元素的“draggable”屬性設置為true。此過程將其設置為可拖動對象。它還分配了一個dragstart事件。

          var elems = document.querySelectorAll('ul#list1 > li');

          for (var i = 0; i < elems.length; i++) {

          el = elems[i];

          el.setAttribute('draggable', 'true');

          el.addEventListener('dragstart', onDragStart, false);

          }

          拖動列表項時,將調用以下onDragStart函數。調用dataTransfer對象的setData方法以在dataTransfer對象中存儲元素的ID。

          function onDragStart(e) {

          e.dataTransfer.effectAllowed = 'copy';

          e.dataTransfer.setData('text', this.id);

          }

          當在拖放區域中拖動列表中的項目時,將調用以下onDragOver函數。由于DragOver沒有特別的處理,因此它調用PreventDefault方法來取消事件。

          function onDragOver(e) {

          e.preventDefault();

          }

          如果列表的項目在拖放區域內被刪除,則可以調用onDrop函數。調用stopPropagation方法取消事件的處理。然后,我們從dataTransfer對象中獲取ID。通過取得ID,您可以獲得丟棄區域中丟棄的元素。調用getElementById方法并從ID中獲取LI標記的對象。通過使用獲取的LI對象的paerntNode屬性訪問父節點,調用removeChild方法,刪除被丟棄的列表的項目。

          function onDrop(e) {

          if (e.stopPropagation) e.stopPropagation();

          var eid = e.dataTransfer.getData('text');

          var elem = document.getElementById(eid);

          elem.parentNode.removeChild(elem);

          }

          運行結果:

          使用Web瀏覽器顯示上述HTML文件。將顯示如下所示的效果。



          可以拖動頁面底部列表中的項目。比如拖動“企鵝”這一項,將其拖動到刪除區域,然后下面列表項中就沒有第三項“企鵝”了,具體效果如下圖所示




          拖動其他項都是一樣的效果,五項都可以刪除。

          以上就是如何使用HTML5實現多個元素的拖放功能的詳細內容,更多請關注其它相關文章!

          更多技巧請《轉發 + 關注》哦!

          節我們學習 HTML5 中的拖放,拖放是一種常見的特性,也就是抓取對象以后拖到另一個位置。在 HTML5 中,拖放是標準的一部分,任何元素都能夠拖放。

          拖放事件

          拖放是由拖動與釋放兩部分組成,拖放事件也分為被拖動元素的相關事件,和容器的相關事件。

          被拖動元素的相關事件如下所示:



          容器相關事件如下所示:



          如何實現元素的拖放

          我們通過上述的拖放事件來實現將下圖“你好,俠課島”,拖放到上面的矩形框中的演示效果:


          • 首先創建一個HTML文本,用于測試代碼,如下所示:
          <!DOCTYPE html>
              <html>
                  <head>
                      <meta charset="utf-8">
                      <title>HTML5學習(9xkd.com)</title>
                      <style type="text/css">
                          .div1{
                              width:200px;
                              height:100px;
                              padding:20px;
                              border:1px solid #000;
                          }
                          p{
                              font-size: 28px;
                          }
                      </style>
                  </head>
                  <body>
                      <div>
                          <div class="div1" id="div1" ></div>
                          <p id="drag1">你好,俠課島!</p>
                      </div>
                  </body>
              </html>
          
          • 然后,我們要給被拖動元素(也就是在上述的 <p> 標簽上),設置一個 draggable 屬性,此屬性用于規定元素是否可拖動,當屬性值為 true 時表示元素可拖動,為 false 表示元素不可拖動。
          <p id="drag1" draggable="true">你好,俠課島!</p>
          

          只有設置了 draggable 屬性值為 true ,指定元素才能被拖動。

          • 然后,我們要做的是點擊被拖動元素 “你好,俠課島!”,點擊這個元素時需要觸發一個 ondragstart 事件,ondragstart 事件會在用戶開始拖動元素或選擇的文本時觸發。調用了一個 drag(event) 函數,在這個函數中規定被拖動的數據,如下所示:
          function drag(e){
              e.dataTransfer.setData("Text", e.target.id);
          }
          

          代碼中的 dataTransfer.setData() 方法用于設置被拖數據的數據類型和值。參數 Text 表示被拖動數據的數據類型,參數 e.target.id 是可拖動元素的 id。

          • 接著,我們將要 “你好,俠課島!” 拖動到元素容器范圍內(矩形框中)。要實現這個步驟,需要在放置拖動元素的容器上綁定一個 ondragover 事件,這個事件用于規定在何處放置被拖動的數據。默認情況下,是無法將一格元素放置到另外一個元素里面的,所以如果需要設置允許放置,則要在 ondragover 事件中加上 e.preventDefault() 方法來阻止默認行為。
          function allowDrop(e){
              e.preventDefault();
          }
          
          • 最后,就是要放置被拖動元素,也就是要在元素容器范圍內松開鼠標。需要在元素容器上綁定一個 ondrop 事件,如下所示,這個事件會在拖動過程中釋放鼠標鍵時觸發。
          <div id="div1" class="div1" ondrop="drop(event)" ondragover="allowDrop(event)" ></div>
          
          <script>
              function drop(e){
                  e.preventDefault();
                  var data = e.dataTransfer.getData("Text");
                  e.target.appendChild(document.getElementById(data));
              }
          </script>
          

          在 ondrop 事件中同樣需要調用 e.preventDefault() 方法來阻止默認行為。然后可以通過 dataTransfer.getData("Text"); 方法獲取之前的 drag(event) 函數中保存的信息,也就是被拖動元素的 id。接著通過 target.appendChild() 方法為將拖動元素作為元素容器的子元素追加到元素容器中,這樣就能成功實現拖放。

          完整代碼

          完整代碼如下所示:

          <!DOCTYPE html>
              <html>
                  <head>
                      <meta charset="utf-8">
                      <title>HTML5學習(9xkd.com)</title>
                      <style type="text/css">
                          .div1{
                              width:200px;
                              height:100px;
                              padding:20px;
                              border:1px solid #000;
                          }
                          p{
                              font-size: 28px;
                          }
                      </style>
                  </head>
                  <body>
                      <div>
                          <div id="div1" class="div1" ondrop="drop(event)" ondragover="allowDrop(event)" ></div>
                          <p id="drag1" draggable="true" ondragstart="drag(event)">你好,俠課島!</p>
                      </div>
                      <script>
                          function drag(e){
                              e.dataTransfer.setData("Text", e.target.id);
                          }
                          function allowDrop(e){
                              e.preventDefault();
                          }
                          function drop(e){
                              e.preventDefault();
                              var data = e.dataTransfer.getData("Text");
                              e.target.appendChild(document.getElementById(data));
                          }
                      </script>
                  </body>
              </html>
          

          總結

          當我們要對某個元素實行拖放操作時,首先就需將這個元素的 draggable 屬性設置為 true,表示允許元素拖動。其中圖片和鏈接默認是可拖動的,不需設置要 draggable 屬性。

          鏈接:https://www.9xkd.com/

          簡介】

          拖放是一種常見的特性, 屬于html5標準的一部分, 即抓取對象以后拖動到另一個位置, 在html5中, 任何元素都可被設置拖放。首先, 我們要給需要拖動的HTML元素啟用拖動功能, 設置屬性draggable="true",

          <div draggable="true"></div>

          提示:a標簽和img標簽默認是啟用該屬性的, 可不需要設置draggable屬性。

          draggable有三個值, 如下所示:

          draggable = true(元素可以被拖動)

          draggable = false(元素不能被拖動)

          draggable = auto(瀏覽器可以自主決定某個元素是否可以被拖動)

          【用法】

          當我們用鼠標拖拽目標元素過程中會觸發的事件:

          ondragstart:用戶按下鼠標開始拖動時觸發

          ondrag:用戶正在拖動時反復觸發

          ondragend:用戶結束拖動后觸發

          <img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

          當拖動元素進入目標容器內觸發的事件:

          ondragenter:鼠標拖動對象進入釋放區時觸發

          ondragover:被拖動物體進入目標容器內移動時反復觸發

          ondragleave:拖動對象在釋放區沒有釋放就離開容器時觸發

          ondrop:被拖動物體在目標容器內釋放時觸發

          <div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

          ondragenter和ondragover事件的默認行為是拒絕接受任何被拖放的項目, 所以我們必須要做的最重要的事情就是防止這種默認行為的發生。

          因此, 我們只需要在這兩個事件調用的函數中傳入event對象, 使用event.preventDefault()就可取消這種默認行為;舉個例子, 在drop事件時, Firefox瀏覽器會關閉網頁, 轉而顯示被拖動圖片img元素src所引用的地址。

          取消元素默認行為:

          function ondragenterFun(e){
              e.preventDefault();
          }
          function ondragoverFun(e){
              e.preventDefault();
          }

          在event對象中, 我們會使用dataTransfer屬性來獲取DataTransfer對象, 在DataTransfer對象中有我們操作數據的屬性和方法, 具體如下:

          datatransfer:轉移釋放元素的數據到釋放區, 返回Datatransfer對象

          event.dataTransfer //返回DataTransfer對象

          DataTransfer對象的屬性:

          files:處理從操作系統拖動并釋放到釋放區的文件;

          types:返回一個字符串數組, 該對象包含了dataTransfer對象中數據的所有類型;

          items:返回DataTransferItems對象, 該對象代表了拖動數據;

          dropEffect:設置拖放目標允許發生的拖放行為, 如果此處設置的拖放行為不在effectAllowed屬性設置的可拖放行為內, 拖放操作將會失敗。該屬性值只允許為"null"、"copy"、"link"或"move";

          effectAllowed:設置拖動元素允許發生的拖動行為, 該屬性值可為"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

          DataTransfer對象的方法:

          setData( format , data ):將指定格式的數據賦值給dataTransfer對象,參數format定義數據的格式也就是數據的類型,data為待賦值的數據。

          getData( format ):從dataTransfer對象中獲取指定格式的數據,format代表數據格式,data為數據。

          clearData( [format] ):從dataTransfer對象中刪除指定格式的數據,參數可選,若不給參數,將刪除對象中所有的數據。

          setDragImage(el, x, y):設置拖放操作的圖標,其中el代表自定義圖標,x代表圖標與鼠標在水平方向上的距離,y代表圖標與鼠標在垂直方向上的距離。


          了解了H5拖動使用的api以后我們接下來看一個綜合的案例, 功能如下:

          1)、實現圖片拖動功能;

          2)、實現圖片復制功能;

          3)、過濾不能拖動的元素;

          4)、實現拖動本地圖片到瀏覽器指定位置;

          公共css部分:

          <style>
          #dropIn{
          border:1px solid #AAAAAA;
          height:100px;
          margin-bottom: 10px;
          padding: 10px;
          }
          #dropIn>img{
          margin-right: 10px;
          border:2px solid deepskyblue;
          }
          img{
          width:100px;
          border-radius: 10px;
          border:2px solid red;
          }
          </style>

          html部分:

          <body>
          <div id="dropIn"></div> <!--釋放區-->
          <img id="drop1" src="img/a.png" alt="" />
          <!--拖動的圖片元素-->
          </body>

          js部分:

          <script type="text/javascript">
          var darggID;
          function getId(el){
              return document.getElementById(el)
          }
          var dropId1 = getId("drop1");
          var dropInId = getId("dropIn");
          //取消事件默認行為
          dropInId.ondragenter = cancelDefault;
          dropInId.ondragover = cancelDefault; //綁定拖動元素釋放時觸發的事件
          dropInId.ondrop = drop; //綁定
          dropId1.ondragstart = startFun;
          function cancelDefault(ev){ //取消默認行為
              ev.preventDefault();
          }
          function startFun(ev){
              darggID = ev.target.id;
              //獲取被拖動元素的id
              //從源對象上的事件處理中保存數據,數據類型為"Text"
              ev.dataTransfer.setData("Text",darggID);
          }
          function drop(ev){
              ev.preventDefault();
              // 從目標對象上的事件處理中讀取"Text"類型數據
              var data=ev.dataTransfer.getData("Text");
              // 插入到目標對象中
              ev.target.appendChild(document.getElementById(data));
          }
          </script>

          接下來我們添加兩張圖, "drop2"是實現復制的圖片, "drop3"是既不能復制也不能拖動的圖片;

          <img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

          添加js代碼:

          //獲取頁面元素
          var dropId2 = getId("drop2");
          var dropId3 = getId("drop3");
          //綁定事件
          dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;
          //修改drop函數為
          function drop(ev){
              ev.preventDefault();
              // 從目標對象上的事件處理中讀取"Text"類型數據
              var data=ev.dataTransfer.getData("Text");
              if(data=='drop1'){
              //移動
                  ev.target.appendChild(document.getElementById(data));
              }
              if(data=='drop2'){//復制
                  var nreEl=document.getElementById(darggID).cloneNode(false);
                  getId("dropIn").appendChild(nreEl);
              }
              if(data=='drop3'){//過濾drop3,drop3不做任何操作
                  alert('過濾drop3')
              }
          }

          接下來我們實現拖動本地圖片到瀏覽器, 我們就將圖片拖動到id為"dropIn"的這個div中;添加js:

          /*document 監聽drop 并阻止瀏覽器打開客戶端的圖片*/
          document.ondragover = function (e) {
              //只有在ondragover中阻止默認行為
              e.preventDefault();
          };
          document.ondrop = function (e) {
              //阻止 document.ondrop的默認行為
              e.preventDefault();
          };
          //dropIn是div的id
          dropIn.ondrop = function (e) {
              var list = e.dataTransfer.files;
              for (var i = 0; i < list.length; i++) {
              var f = list[i];
                  reader(f);
              }
          };
          function reader(f) {
              var reader = new FileReader();
              //讀取數據
              reader.readAsDataURL(f);
              reader.onload = function () {
              var img = new Image();
              img.src = reader.result;
              dropIn.appendChild(img);
              }
          }

          【瀏覽器支持】

          目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

          最后再和大家分享一個技巧, 這種拖動行為還能跨瀏覽器工作, 這里說的跨瀏覽器不是瀏覽器之間的跨窗口, 而是可以從Chrome瀏覽器拖動到Firefox瀏覽器, 因為拖放功能的支持是集成在操作系統里面的, 有著相同的特性。


          主站蜘蛛池模板: 中文字幕一区二区三| 无码国产精品一区二区免费| 国产一区二区在线观看app| 国产精品福利一区| 亚洲福利电影一区二区?| 日韩内射美女人妻一区二区三区| 日本不卡免费新一区二区三区| 丝袜无码一区二区三区| 国产综合一区二区在线观看| 亚洲综合av永久无码精品一区二区| 久久精品一区二区影院 | 国产精品高清一区二区三区不卡 | 一本久久精品一区二区| 色窝窝免费一区二区三区| 无码一区二区三区免费视频| 国产伦精品一区二区三区精品 | 亚洲高清一区二区三区 | 国产成人精品无码一区二区老年人| 女同一区二区在线观看| 精品视频一区二区三区在线播放| 日韩精品无码人妻一区二区三区 | 国产一区二区精品| 亚洲一区二区电影| 中文字幕无线码一区二区| 国产麻豆媒一区一区二区三区| 精品视频午夜一区二区| 国产免费一区二区三区在线观看| 精品无码人妻一区二区免费蜜桃| 色欲AV蜜桃一区二区三| 国产91一区二区在线播放不卡| 国产亚洲无线码一区二区| 久久精品一区二区三区AV| 国产在线观看精品一区二区三区91| AV怡红院一区二区三区| 精品视频无码一区二区三区| 夜夜高潮夜夜爽夜夜爱爱一区| 中文字幕一区二区三区精华液| 末成年女A∨片一区二区| 精品国产一区在线观看| 亚洲一区二区三区AV无码| 亚洲欧美国产国产一区二区三区|