首頁 > web前端 > H5教程 > H5的Drag與Drop詳解

H5的Drag與Drop詳解

php中世界最好的语言
發布: 2018-03-27 11:12:02
原創
3258 人瀏覽過

這次帶給大家H5的Drag與Drop詳解,使用H5的Drag與Drop注意事項有哪些,以下就是實戰案例,一起來看一下。

簡介

拖曳是一種常見的特性,即抓取物件以後拖曳到另一個位置。

在 HTML5 中,拖曳是標準的一部分,任何元素都能夠拖曳。

先點選一個小範例:在使用者開始拖曳

元素時執行JavaScript

<p draggable="true" ondragstart="myFunction(event)">拖动我!</p>
登入後複製

提示: 連結和圖片預設是可拖曳的,不需要draggable 屬性。

定義與用法

在拖曳的過程中會觸發下列事件:

  • 在拖曳目標上觸發事件(來源元素):  ondragstart - 使用者開始拖曳元素時觸發

    • #ondrag - 元素正在拖曳時觸發

    • ondragend - 用戶完成元素拖曳後觸發

  • 釋放目標時觸發的事件:  ondragenter - 當被滑鼠拖曳的物件進入其容器範圍內時觸發此事件

    • ondragover - 當某被拖曳的物件在另一個物件容器範圍內拖曳時觸發此事件

    • ondragleave -當被滑鼠拖曳的物件離開其容器範圍內時觸發此事件

    • ondrop - 在一個拖曳過程中,釋放滑鼠鍵時觸發此事件

瀏覽器支援

Internet Explorer 9+, Firefox, Opera, Chrome, 和Safari 支援拖曳。

注意:Safari 5.1.2不支援拖曳;拖曳元素時,每隔 350 毫秒會觸發 ondragover 事件。

實例

先貼上程式碼,再逐一解釋:

<!DOCTYPE html>
<html>
<head>
<title>HTML5拖拽</title>
<meta charset="utf-8">
<style>
#p1 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
</style>
</head>
<body>
<p>拖动img_w3slogo.gif图片到矩形框中:</p>
<p id="p1" ondrop="drop(event)" ondragover="allowDrop(event)"></p>
<br>
<img id="drag1" src="images/img_w3slogo.gif" draggable="true" ondragstart="drag(event)" width="300" height="56">
<script>
function allowDrop(ev){
    ev.preventDefault();
}
function drag(ev){
    ev.dataTransfer.setData("Text",ev.target.id);
}
function drop(ev){
    ev.preventDefault();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
}
</script>
</body>
</html>
登入後複製

拖曳前的頁面效果為:

 

下面分別來解析下上面程式碼的意思。

設定元素可拖放

首先,為了讓元素可拖曳,把draggable 屬性設為true :

<img draggable="true">
登入後複製

拖動什麼- ondragstart 和setData()

然後,規定當元素被拖曳時,會發生什麼事。

在上面的範例中,ondragstart 屬性呼叫了一個函數,drag(event),它規定了被拖曳的資料。

dataTransfer.setData() 方法設定被拖曳資料的資料型別和值:

function drag(ev)
{
    ev.dataTransfer.setData("Text",ev.target.id);
}
登入後複製

在這個範例中,資料型別是"Text",值是可拖曳元素的id ("drag1")。

放到何處 - ondragover

ondragover 事件規定在何處放置被拖曳的資料。

預設地,無法將資料/元素放置到其他元素中。如果需要設定允許放置,我們必須阻止對元素的預設處理方式。

這要透過呼叫ondragover 事件的event.preventDefault() 方法:

event.preventDefault()
登入後複製

來放置- ondrop

##當放置被拖曳資料時,會發生drop 事件。

在上面的範例中,ondrop 屬性呼叫了一個函數,drop(event):

function drop(ev)
{
    ev.preventDefault();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
}
登入後複製
程式碼解釋:

    ##呼叫preventDefault()來避免瀏覽器對資料的預設處理(drop 事件的預設行為是以連結形式開啟)
  • #透過dataTransfer.getData("Text") 方法獲得被拖曳的資料。此方法將傳回在 setData() 方法中設定為相同類型的任何資料。
  • 被拖曳資料是被拖曳元素的id ("drag1")
  • 把被拖曳元素追加到放置元素(目標元素)中
  • 實作的結果如圖:

 

dataTransfer对象

在拖曳操作的过程中,我们可以用过dataTransfer对象来传输数据,以便在拖曳操作结束的时候对数据进行其他的操作。

对象属性:

  • dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此处设置的拖放行为不再effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许为“null”、“copy”、“link”和“move”四值之一。

  • effectAllowed:设置或返回被拖动元素允许发生的拖动行为。该属性值可设为“none”、“copy”、“copyLink”、“copyMove”、“link”、“linkMove”、“move”、“all”和“uninitialized”。

  • items:该属性返回DataTransferItems对象,该对象代表了拖动数据。

  • types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。

对象方法:

  • setData(format,data):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据

  • getData(format):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。

  • clearData([format]):从dataTransfer对象中删除指定格式的数据,参数可选,若不给出,则为删除对象中所有的数据。

  • addElement(element):添加自定义图标

  • setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向上的距离,y设置图标与鼠标在垂直方向上的距离。

Identify what is draggable

function dragstart_handler(ev) {
 console.log("dragStart");
 // Add the target element's id to the data transfer object
 ev.dataTransfer.setData("text/plain", ev.target.id);
}
<body>
 <p id="p1" draggable="true" ondragstart="dragstart_handler(event);">This element is draggable.</p>
</body>
登入後複製

Define the drag's data

function dragstart_handler(ev) {
  // Add the drag data
  ev.dataTransfer.setData("text/plain", ev.target.id);
  ev.dataTransfer.setData("text/html", "<p>Example paragraph</p>");
  ev.dataTransfer.setData("text/uri-list", "http://developer.mozilla.org");
}
登入後複製

Define the drag image

function dragstart_handler(ev) {
  // Create an image and then use it for the drag image.
  // NOTE: change "example.gif" to an existing image or the image 
  // will not be created and the default drag image will be used.
  var img = new Image(); 
  img.src = 'example.gif'; 
  ev.dataTransfer.setDragImage(img, 10, 10);
}
登入後複製

Define the drag effect

function dragstart_handler(ev) {
  // Set the drag effect to copy
  ev.dataTransfer.dropEffect = "copy";
}
登入後複製

Define a drop zone

function dragover_handler(ev) {
 ev.preventDefault();
 // Set the dropEffect to move
 ev.dataTransfer.dropEffect = "move"
}
function drop_handler(ev) {
 ev.preventDefault();
 // Get the id of the target and add the moved element to the target's DOM
 var data = ev.dataTransfer.getData("text");
 ev.target.appendChild(document.getElementById(data));
}
<body>
 <p id="target" ondrop="drop_handler(event);" ondragover="dragover_handler(event);">Drop Zone</p>
</body>
登入後複製

火狐浏览器拖拽问题

但是进行到这儿在火狐浏览器中发现一个问题:

html5的拖拽,用了preventDefault防止弹出新页面,但在火狐下不管用?

解决办法:

document.body.ondrop = function (event) {
    event.preventDefault();
    event.stopPropagation();
} 
登入後複製

或者对于上面的实例中,添加到ondrop方法里面也是可以的:

function drop(ev){
    ev.preventDefault();
    ev.stopPropagation();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
}
登入後複製

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

H5的Canvas做出圆形进度条并显示数字百分比

H5的LocalStorage本地存储使用详解

以上是H5的Drag與Drop詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板