Drag & Drop 拖拽詳解
學習一個技術最好從例項入手,可以直接演示操作效果。
然後再對照程式碼分析每一步操作來龍去脈,本文將詳細分析一段關於拖放的程式碼。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style type="text/css"> p{ width:100px; height:50px; background-color:red; } #box { width:300px; height:100px; background-color:#ccc; } </style> <script> window.onload=function(){ let odiv=document.getElementById("box"); let op=document.getElementById("p"); op.ondragstart = (ev) => { ev.dataTransfer.setData("Text",ev.target.id); } odiv.ondragover = (ev) => { ev.preventDefault(); } odiv.ondrop = (ev) => { ev.preventDefault(); ev.stopPropagation(); let data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } } </script> </head> <body> <p draggable="true" id="p"></p> <div id="box"></div> </body> </html>
上述程式碼可以將紅色矩形拖放到灰色矩形中去,程式碼分析如下:
[HTML] 純文字檢視 複製程式碼<p draggable="true" id="p"></p>
將p元素的draggable屬性值設定為true,這樣此元素就是可以拖動的。
關於設定可拖動更多內容可以參閱HTML元素設定可拖拽一章節。
[JavaScript] 純文字檢視 複製程式碼op.ondragstart = (ev) => { ev.dataTransfer.setData("Text",ev.target.id); }
被拖動元素暫且稱之為源元素,目的地元素暫且稱之為目標元素。
源元素註冊dragstart事件處理函式,此事件會在源元素被拖動時觸發。
事件物件的dataTransfer屬性用於從源元素向目標元素傳遞資料。
上述程式碼通過dataTransfer.setData()方法將源元素的id屬性值儲存起來,以便在目標元素中獲取。
具體參閱JavaScript dragstart 事件一章節。
註冊在源元素的事件:
(1).dragstart:當源元素開始拖動時觸發。
(2).drag:源元素拖動過程中持續觸發。
(3).dragend:當拖動操作的滑鼠鬆開時觸發此事件,無論是否位於目標元素內。
註冊在目標元素的事件:
(1).dragenter:當拖動操作的滑鼠指標進入目標元素時觸發。
(2).dragover:當拖動操作的滑鼠指標在目標元素內移動時觸發。
(3).dragleave:當拖動操作的滑鼠指標離開目標元素時觸發。
(4).drop:當拖動操作的滑鼠指標位於目標元素內,並鬆開滑鼠時觸發。
[JavaScript] 純文字檢視 複製程式碼odiv.ondragover = (ev) => { ev.preventDefault(); }
為目標元素註冊dragover事件處理函式,當拖動源元素的滑鼠指標在目標元素上移動時觸發。
ev.preventDefault()方法非常重要,否則無法完成拖動效果。
預設,目標元素是不允許放置文件內其他元素(允許放置從作業系統拖拽的檔案)。
所以要通過ev.preventDefault()取消此預設行為。
具體參閱JavaScript dragover 事件一章節。
[JavaScript] 純文字檢視 複製程式碼odiv.ondrop = (ev) => { ev.preventDefault(); ev.stopPropagation(); let data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); }
當源元素被放置於目標元素之上時觸發drop事件。
預設,拖動作業系統源元素,然後放置於目標元素中,會在新的標籤開啟資源。
所以需要ev.preventDefault()方法取消此預設動作。
火狐瀏覽器中,拖動文件內源元素至目標元素,會開啟一個新標籤,並進行搜尋操作。
ev.stopPropagation()方法可以組織火狐瀏覽器的此動作,其他瀏覽器不會有此問題。
文章最後總結:
(1).前面對拖拽簡單程式碼進行了分析,以便於讀者對拖拽有一個整體把握。
(2).拖拽操作設計的內容比較多,本文並未全部涉及,可以參閱本板塊的其他文章。
相關文章
- HTML5原生拖拽/拖放 Drag & Drop 詳解HTML
- drag &drop 拖拽事件事件
- drag & drop 拖拽事件事件
- HTML5 Drag和Drop 拖拽HTML
- HTML5 drag & drop 拖拽與拖放HTML
- html-拖拽釋放(Drag and drop) APIHTMLAPI
- 利用File,Drop&Drag,XHR2實現圖片拖拽上傳
- HTML5 : Drag & DropHTML
- drag拖拽程式碼例項
- vue-drag-resize 全解,vue拖拽縮放元件Vue元件
- dnd.js 拖放庫 Drag and DropJS
- HTML5 拖放(Drag和drop)HTML
- html 5 drag and drop upload fileHTML
- Blazor 使用拖放(drag and drop)上傳檔案Blazor
- 033Drag and Drop-TheBrain提示3DAI
- java swing的drag and drop源程式 (轉)Java
- Canvas drag 實現拖拽拼圖小遊戲Canvas遊戲
- 精讀《結合 React 使用原生 Drag Drop API》ReactAPI
- Android拖拽詳解Android
- HTML5 Drag and Drop 的一些總結HTML
- jQuery div拖拽效果詳解jQuery
- 詳解javascript拖拽(二)拖拽的應用及示例JavaScript
- 史上第二走心的 iOS11 Drag & Drop 教程iOS
- (原創)[C#] 一步一步自定義拖拽(Drag&Drop)時的滑鼠效果:(一)基本原理及基本實現C#
- 詳解javascript拖拽(一)基礎介紹JavaScript
- 基於HTML5的Drag and Drop生成圖片Base64資訊HTML
- 拖拽一個元素如此簡單,mouse、drag、touch三兄弟的用處
- three.js內部拖拽例子全詳解JS
- H5 FileReader+drag+ajax2.0+Formdata實現圖片拖拽上傳H5ORM
- 詳解SQL中drop、delete和truncate的異同SQLdelete
- Truncate table 詳解及與delete,drop 的區別delete
- Truncate table詳解及與delete,drop的區別delete
- JavaScript drag 事件JavaScript事件
- MySQL Drop 大表的解決方案MySql
- 解決:windows無法拖拽檔案Windows
- 如何自定義 drag 樣式
- Flutter ListView 拖拽排序瞭解一下FlutterView排序
- 解決Selenium元素拖拽不生效Bug