HTML5 的拖拽介紹
本文主要介紹與拖拽操作相關的對象及事件信息,但并不涉及太多的源碼演示。一個簡單的示例
在html5中要實現拖放操作,相對于以前通過鼠標操作實現,要簡單得多,數據安全性也更有保障。只需要以下幾步即可。
- 給被拖拽元素添加
draggable屬性,如果是文件拖放。 - 為目標元素添加一個
dropzone屬性,這一步也不是必須的,可以省略。 - 在拖拽元素的
dragstart中初始化相關的數據信息,主要是DataTransfer對象。 - 在目標元素的
dragover事件中,取消其默認操作。 - 在目標元素的
drop事件中,處理接受到的數據。 - 在被拖拽元素的
dragend事件中,做善后工作。若沒有則可以省略。
</ol>
true:表示此元素可拖拽。false:表示此元素不可拖拽。auto:除img和帶href的標簽a標簽表示可拖拽外,其它標簽均表示不可拖拽。- 其它任何值:表示不可拖拽。 </ol> </section>
- copy:表示將允許的元素放到該元素上時,會將拖拽數據復制到目標元素上。
- link:表示將允許的元素放到該元素上時,將鏈接數據到目標元素上。
- move:表示將允許的元素放到該元素上時,會將數據移動到目標元素上。
- 以
string:
開頭的字符串,長度不能小于8個字符:表示能接受DataTransferItem.kind值為string
的data對象。 - 以
file:
開頭的字符串,長度不能小于6個字符:表示能接受DataTransferItem.kind值為file
且DataTransferItem.type的值匹配file:
之后的字符的DataTransferItem的對象。
</ul>
</section> - kind:表示數據的類型,只能是
string或File。單從字面就很好理解這兩個值代表的是什么意思。 - type:實際數據的類型或是格式,一般用mimetype表示,但并不是強制mimetype格式。
- getAsString(callback):當
kind屬性為string時,在只讀或是讀寫模式下,可以通過回調函數處理此對象關聯的實際數據。 - getAsFile():當
kind為file是,通過此函數能獲取真實的數據,否則返回null,只在只讀或是讀寫模式下有效。
</ul>
- 產生一個空的
DOMStringList對象L。 - 遍歷
DataTransfer.items對象。 - 若
DataTransfer.items的子項的kind的值為string
,則將該項的type值添加到L對象中。 - 若
DataTransfer.items的子項的kind的值為file
,則向L對象添加"Files"字符串。 - 返回L對象 </ol> </section>
DataTransferItem.kind為string
DataTransferItem.type的值等于format參數
</ol>
kind等于string
type等于參數format
</ol>
kind的值為string
type的值為formatdata參數作為DataTransferItem的實際值。
</ol>
大致代碼如下:
<div id="source" draggable="draggable">source</div>
<div id="target">target</div>
<script type="text/javascript">
var target = document.getElementById('target');
var source = document.getElementById('source');
source.ondragstart = function(e){
e.dataTransfer.effectAllowed = 'copyMove';
e.dataTransfer.setData('test', 'testData');
};
target.ondragover = function(e){
e.dataTransfer.dropEffect = 'move';
e.preventDefault(); // 不能少
};
target.ondrop = function(e){
var elem = document.createElement('a');
elem.innerHTML = e.dataTransfer.getData('test');
e.target.appendChild(elem);
};
</script></section>draggable屬性
draggable是一個枚舉屬性,用于指定一個標簽是否可以被拖拽。有以下四種取值:
dropzone屬性
這個屬性用于接受拖拽元素的目標元素上,表示能接受的數據類型及操作方式。多個值用空格分開,不區分大小寫。其值有以下類型組成:
相關的事件
DragEvent接口定義
DragEvent從MouseEvent接口繼承,其定義如下,與MouseEvent相比,只是多了個DataTransfer對象。所有針對拖拽的操作也是通過控制此對象來完成的。
[Construct(DOMString type, optional DragEventInit eventInitDict)]
interface DragEvent : MouseEvent
{
readonly attribute DataTransfer? dataTransfer;
};
/* 這是用于初始事件的參數定義 */
dictionary DragEventInit : EventInit
{
// 從UIEvent繼承的屬性:
Window? view = null;
long detail = 0;
// 從MouseEvent繼承的屬性:
long screenX = 0;
long screenY = 0;
long clientX = 0;
long clientY = 0;
boolean ctrlKey = false;
boolean shiftKey = false;
boolean altKey = false;
boolean metaKey = false;
unsigned short button = 0;
unsigned short buttons = 0;
EventTarget? relatedTarget = null;
// DragEvent添加的新屬性:
DataTransfer? dataTransfer;
} 事件描述
| 事件名稱 | 事件目標 | 可撤消? | 存儲模式1 | dropEffect值 | 默認操作 | 備注 | </tr> </thead>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.存儲模式是針對于DataTransfer對象的操作,具體數據見后表。 |
</tr>
</tfoot> |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dragstart | 被拖拽元素 | 是 | 讀、寫 | none |
初始化操作 | 若調用preventDefault()函數取消此事件的默認行為,則拖拽功能將被取消。 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| drag | 被拖拽元素 | 是 | 保護模式 | none |
在dragstart之后,釋放鼠標之前,不管鼠標是否移動,此事件不停地被觸發。 | </tr>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dragenter | 目標元素 | 是 | 保護模式 | effectAllowed限定的值。 | 更換目標元素。 | 進入目標元素時,觸發一次。 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dragleave | 離開前的目標元素 | 否 | 保護模式 | none |
離開時觸發一次。 | </tr>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dragover | 目標元素 | 是 | 保護模式 | effectAllowed限定的值 | 重置dropEffect為none,并中斷后續事件執行。 |
在dragenter之后,dragleave之前,不管是否移動,此事件都將不停地觸發。 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| drop | 目標元素 | 是 | 只讀模式 | 當前設定的值 | 釋放鼠后,由目標元素觸發。 | </tr>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dragend | 被拖拽元素 | 否 | 保護模式 | 當前設定的值 | 釋放鼠標后,由被拖拽元素觸發,順序在drop之后。 | </tr> </tbody> </table>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| effectAllowed | dropEffect | </tr> </thead>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1:根據用戶所使用的平臺不同,可能會出現的值,如在windows下,copyMove的effectAllowed值,默認為copy操作,在按shift鍵時,則會變成move操作。 | </tr> </tfoot>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| none | none | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| copy | copy | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| copyLink | copy或是link1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| copyMove | copy或是move1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| all | copy、link1或是move1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| link | link | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| linkMove | link或是move1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| move | move | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uninitialized,被拖拽為一個文本框中選中的內容? | move或是copy1,link1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uninitialized,被拖拽對象為一個普通選中項? | copy或是link1,move1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uninitialized,被拖拽對象為一個帶鏈接的a元素 | link或是copy1,move1 | </tr>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 其它情況 | copy或是link1,move1 | </tr> </tbody> </table> </section>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 讀寫 | 只讀 | 保護 | </tr> </thead>||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dropEffect | 只在dragenter與dragover事件中可更改,其它事件中只可讀取。 |
</tr>
|||||||||||||||||||||
| effectAllowed | 只在dragstart事件中起作用 |
</tr>
|||||||||||||||||||||
| items | 對items的操作詳細情況參考后面的setData函數 |
</tr>
|||||||||||||||||||||
| types | 僅在dragenter、dragover與drop三個事件中可獲取此值 |
</tr>
|||||||||||||||||||||
| setData | Y | N | N | </tr>|||||||||||||||||||
| getData | Y | Y | N | </tr>|||||||||||||||||||
| clearData | Y | N | N | </tr>|||||||||||||||||||
| DataTransferItem.getAsString | Y | Y | N | </tr>|||||||||||||||||||
| DataTransferItem.getAsFile | Y | Y | N | </tr> </tbody> </table> 來自:http://blog.830725.com/post/html5-drag-and-drop-intro.html|||||||||||||||||||