HTML 5 Step by Step(一) 拖放API


在Html4中,我們可以通過監聽mousedown、mousemove、mouseup來實現拖放效果。在Html5中,直接提供了支持拖放操作的API,我們可以很簡單的幾步就可以實現拖放的效果。

實現的概要

首先我們了解下跟拖動相關的事件:

事件 產生的源對象 說明
dragstart 被拖動的元素 開始拖放動作
drag 被拖動的元素 拖放過程中
dragenter 拖動過程中鼠標經過的元素 被拖動的元素開始進入本元素的范圍內
dragleave 拖動過程中鼠標經過的元素 被拖動的元素離開本元素的范圍
drop 拖放的目標元素 有其他元素拖動到了本元素中
dragend 拖動的對象元素 拖動結束
dragover 拖動過程中鼠標經過的元素 被拖動的元素在本元素上移動

實現步驟:

1.我們要想一個元素可以被拖動,同時需要將元素的draggable屬性設置為true(img、a默認允許拖放);

2.監聽拖動相關的事件。

Demo

我們實現一個將幾個商品拖入的購物車的一個簡單Demo,效果如下:

image

首先看下Html代碼:

<body onload="init()">
    <span>商品列表</span>
    <div class="goodsList">
        <div class="goods" draggable="true">
            ThinkPad T410i</div>
        <div class="goods" draggable="true">
            Ipad 2</div>
    </div>
    <span>已選商品:</span>
    <div id="box" style="width: 200px; height: 200px; border: 1px solid green;">
    </div>
</body>

Javascirpt:

          function init() {
            var goodsList = getElementsbyClassName('goods');
            var box = document.getElementById('box');
            for (var i = 0; i < goodsList.length; i++) {
                goodsList[i].addEventListener('dragstart', function (ev) {
                    var dt = ev.dataTransfer;
                    dt.effectAllowed = 'all';
                    dt.setData('text/plain', this.textContent);
                }, false);
            }
            box.addEventListener('dragend', function (ev) {
                ev.preventDefault();
            }, false);
            box.addEventListener('drop', function (ev) {
                var dt = ev.dataTransfer;
                var goodsName = dt.getData('text/plain');
                box.textContent += goodsName;
                ev.preventDefault();
                ev.stopPropagation();
            }, false);
        }

解釋下上面的代碼:

1.獲取class為goods的元素,在dragstart的時候,將自己本元素的textContext傳遞給dataTransfer(下面會說明dataTransfer對象的作用);

2.在將goods拖動到box時候,獲取dataTransfer數據,並顯示出來;

3.preventDefault的作用是,對於目標元素,默認的情況下是不允許接收元素的,所以必須在dragend或則dragover事件內調用preventDefault。

關於DataTransfer對象

我們通過上面的例子知道拖動時是通過DataTransfer來進行拖動元素之間的數據傳遞的,同時我們也可以通過設置DataTansfer里面的相關屬性來實現一些拖動的額外效果。下面看下DataTransfer的屬性與方法:

屬性/方法 作用
dropEffect屬性 拖放操作的視覺效果,可以指定為none、copy、link、move
effectAllowed屬性 指定當元素被拖放時所允許的視覺效果
types屬性 存入數據的種類
cleraData(DomString format) 清楚DataTransfer對象中存放的數據
setData(DOMString format,DomString data) 存入數據
DOMString getData(DOMString format) 從DataTransfer對象中讀取數據
setDragImange(Element image,long x,long y) 用img元素來設置拖放圖標

這里有幾個要說明的:

1.現在拖動處理所支持的MIME類型為以下幾種:

text/plain:文本文字;

text/html:HTML文字;

text/xml:xml;

text/uri-list:url列表。

對於dropEffect、effectAllowed屬性使用的幾個注意的地方:

一般的時候我們在ondragstart事件中去設置effectAllowed值,在ondragover事件中指定dropEffect值。其中如果effectAllowed屬性設置為none,則不允許拖動,如果dropEffect屬性設置為none,則不允許拖放到目標元素中。

總結

通過本篇Post,了解了Html5中拖放的新的API,比起html4實現起來要簡單很多。下面的文章會繼續一步步學習Html5其他方面的相關特性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM