HTML5提供專門的拖曳與拖曳的API,以後實現這類效果就不必亂折騰了。但是,考慮到Opera瀏覽器似乎對此不感冒,在通用性上有待商榷,所以這裡也就簡單說一說。拖放(Drag 和 drop)是 html5 標準的組成部分。
瀏覽器支援
Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支援拖放。
被拖曳元素,dragElement :
1、新增事件:ondragstart
2、新增屬性:dragable
放置元素,dropElement:
1、新增事件:ondargenter , ondragover , ondragleave , ondragend ,ondrop
與mouser劃入劃出一類的事件很類似,字面也很好理解,不贅述了,下面會用例子來說明。
1、頁面上元素間的拖放
下面用個小例子,p間的拖放來展示,各個事件如何被觸發:
<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8"/> <style type="text/css"> #dropEle p { float: left; } </style> <script src="../../jquery-1.8.3.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> /** * 拖放(Drag 和 drop)是 HTML5 标准的组成部分。 * 浏览器支持 *Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。 */ $(function () { $("#dragEle")[0].ondragstart = function (event) { console.log("dragStart"); event.dataTransfer.setData("Text", event.target.id); }; /** * 当放置被拖数据时,会发生 drop 事件。 * 调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开) * @param event */ $("#dropEle")[0].ondrop = function (event) { /* for (var p in event.dataTransfer) { console.log(p + " = " + event.dataTransfer[p] + " @@"); } */ console.log("onDrop"); var id = event.dataTransfer.getData("Text"); $(this).append($("#" + id).clone().text($(this).find("p").length)); event.preventDefault(); }; /** * ondragover 事件规定在何处放置被拖动的数据。 *默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。 */ $("#dropEle")[0].ondragover = function (event) { console.log("onDrop over"); event.preventDefault(); } $("#dropEle")[0].ondragenter = function (event) { console.log("onDrop enter"); } $("#dropEle")[0].ondragleave = function (event) { console.log("onDrop leave"); } $("#dropEle")[0].ondragend = function (event) { console.log("onDrop end"); } }); </script> </head> <body> <p style="border: 1px solid red ; width: 100px ; height: 100px ;text-align: center;line-height: 100px;" draggable="true" id="dragEle" > </p> <p style="width: 330px;min-height: 202px;border: 1px solid #444;margin-top: 20px;overflow-y: scroll;" id="dropEle"></p> </body> </html>
需要注意幾點:
a、ondragover中必須組織事件的預設行為,預設地,無法將資料/元素放置到其他元素中。
b、drop 事件的預設行為是以連結形式打開,所以也需要阻止其預設行為。
還有可能注意到:在拖放時,event中包含一個event.dataTransfer 對象,上例中我們使用了該對象的setData方法傳遞了拖曳p的id,然後在drop中取得該id,並且複製了該元素添加到放置的p中。
下面介紹下該物件的其他方法:
event.dataTransfer :
items = [object DataTransferItemList] @@drag_drop.html:44
# files = [object FileList] @@drag_drop.html:44
types = text/plain @@drag_drop.html:44
#effectAllowed = all @@drag_drop.html:44
effectAllowed = all @@drag_drop.html:44
effectAllowed = all @@drag_drop.html:44
dropEffect = none @@drag_drop.html:44
clearData = function clearData() { [native code] } @@drag_drop.html:44
#getData = function getData() { [native code] } @@drag_drop.html:44
setData = function setData() { [native code] } @@drag_drop.html:44
setDragImage = function setDragImage() { [native code] } @@
我使用了js列印出了它所有的屬性:
1、getData,setData上例已經使用了,clearData就是清除設定的資料。
2、值得注意的是files,當把作業系統中選擇的一個或多個檔案拖入該p中,files中會儲存拖入檔案的信息,然後我們透過file可以得到檔案的類型,長度,內容然後實現上傳。
3、setDragImage(image, x, y)用於設定滑鼠移動過程中隨滑鼠一起移動的效果圖。必須在dragstart中設定。
4、types,effectAllowed和dropEffect分別是拖入元素的類型,拖曳過程中滑鼠顯示的樣式,我覺得可以忽略了這幾個屬性,一般用不到。
相關重點
DataTransfer 物件:退化物件用來傳遞的媒介,使用一般為Event.dataTransfer。
ondragstart 事件:當拖曳元素開始被拖曳的時候觸發的事件,此事件作用在被拖曳元素上
ondragenter 事件:當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上
ondragover 事件:拖曳元素在目標元素上移動的時候觸發的事件,此事件作用在目標元素上
ondrop 事件:被拖曳的元素在目標元素上同時滑鼠放開觸發的事件,此事件作用在目標元素上
ondragend 事件:當拖曳完成後觸發的事件,此事件作用在被拖曳元素上
###Event.preventDefault() 方法:阻止預設的些事件方法等執行。 ondragover中一定要執行preventDefault(),否則ondrop事件不會被觸發。另外,如果是從其他應用軟體或檔案中拖東西進來,尤其是圖片的時候,預設的動作是顯示這個圖片或是相關訊息,並不是真的執行drop。此時需要用用document的ondragover事件把它直接幹掉。 ######Event.effectAllowed 屬性:就是拖曳的效果。 ###以上是詳解HTML5拖放功能實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!