国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

HTML5拖放API Drag and Drop

dantezhao / 1174人閱讀

摘要:此文研究中的拖放接口,提供各個屬性和方法的說明,解決拖放過程中的拖拽數據對象存儲和獲取問題。方法增加一個拖拽數據對象到屬性中,并返回增加的拖拽數據對象。若拖拽數據對象是文本字符串類型,通過回調函數獲取拖拽數據中的字符串數據。

此文研究Web API中的拖放接口,提供各個屬性和方法的說明,解決拖放過程中的拖拽數據對象存儲和獲取問題。

拖放API作用到兩個目標對象,分別是拖拽目標對象和放置目標對象。

拖拽目標

一個設置draggable屬性的值為trueDOM元素或者一個選中狀態的文本區塊可以成為拖拽目標。

OR

放置目標

一個綁定了下圖放置目標對應的5個事件的DOM元素可以成為放置目標。

事件

拖放API有8個事件,其中有3個事件綁定在拖拽目標上,有5個事件綁定在放置目標上。

綁定在拖拽目標
Evnet Description
dragstart 當用戶開始拖拽一個元素或者一個文本選取區塊的時觸發。
drag 當用戶正在拖拽一個元素或者一個文本選取區塊的時觸發。
dragend 當用戶結束拖拽一個元素或者一個文本選取區塊的時觸發。(如放開鼠標按鍵或按下鍵盤的 escap 鍵)
綁定在放置目標
Event Description
dragenter 當一個元素或文字選取區塊被拖曳移動進入一個有效的放置目標時觸發。
dragover 當一個元素或文字選取區塊被拖曳移動經過一個有效的放置目標時觸發。
dragleave 當一個元素或文字選取區塊被拖曳移動離開一個有效的放置目標時觸發。
dragexist 當一個元素不再是被選取中的拖曳元素時觸發。(Firefox能觸發,觸發順序:dragexist->dragleave->drop;Chrome無法觸發)
drop 當一個元素或文字選取區塊被放置至一個有效的放置目標時觸發。

通過下圖能更直觀觀察每個事件觸發的時機

戳我看源碼

注意:在dragover事件中使用event.preventDefault();阻止默認事件,才能觸發drop事件

DataTransfer對象

在進行拖放操作時,會觸發上面所述的8個事件,每個event事件對象中都會有DataTransfer對象用來保存被拖動的數據。它可以保存一項或多項數據、一種或者多種數據類型。

effectAllowed

用來指定拖動時被允許的效果。

dragstart事件中設置

屬性 dropEffect

設置實際的放置效果,它應該始終設置成effectAllowed的可能值之一 。

dragenter事件和dragover事件中設置

effectAllowed和dropEffect屬性的栗子:戳我看源碼

files

包含一個在數據傳輸上所有可用的本地文件列表。如果拖動操作不涉及拖動文件,此屬性是一個空列表。

filesZoneEl.addEventListener("drop", (event) => {
    event.preventDefault();
    let files = event.dataTransfer.files;
    for (let i = 0, len = files.length; i < len; i++) {
        let liEl = document.createElement("li");
        liEl.innerHTML = files[i].name;
        filesListEl.appendChild(liEl);
    }
});

戳我看源碼

types

保存一個被存儲數據的類型列表作為第一項,順序與被添加數據的順序一致。如果沒有添加數據將返回一個空列表。

items

存儲DataTransferItem數據對象的列表。

方法 addElement()

設置拖動源。

event.dataTransfer.addElement(element);
setData()

為一個給定的類型設置數據并存儲在items屬性中。

getData()

items屬性中獲取給定類型的數據,無數據時返回空字符串。

event.dataTransfer.getData(type);
clearData()

items屬性中刪除與給定類型關聯的數據,若類型為空則刪除所有數據。

event.dataTransfer.clearData(type);
setDragImage()

自定義一個期望的拖動時的圖片,默認為被拖動的節點。

event.dataTransfer.setDragImage(imgElement, offsetX, offsetY);
Param Description
imgElement 要用作拖動反饋圖像元素。
offsetX 圖像內的水平偏移量。
offsetY 圖像內的垂直偏移量。

設置拖動時的圖片時,要把圖片預加載,否則圖片會在拖動開始dragstart事件觸發時才會加載圖片,會導致拖動圖出不來或閃一下的后果。可把圖片放到標簽并設置display:none;,原理詳看我之前的文章Web圖片資源的加載與渲染時機。

DataTransferItemList

dataTramsfer對象的items屬性,包含了一系列DataTransferItem拖拽數據對象。

屬性 length

數組長度。

方法 add()

增加一個拖拽數據對象到items屬性中,并返回增加的拖拽數據對象。

event.dataTransfer.items.add(file);
remove()

items屬性中移除指定位置的一個拖拽數據對象。

event.dataTransfer.items.remove(index);
clear()

清空items屬性中的所拖拽數據對象。

event.dataTransfer.items.clear();
DataTransferItem

DataTransferItemList列表中的拖拽數據對象。

屬性 kind

拖拽數據對象類型。

Value Description
file 文件類型。
string 文本字符串類型。
type

MIME類型的Unicode字符串,例如text/plaintext/htmlimage/png

方法 getAsFile()

若拖拽數據對象是文件類型,則返回一個文件對象。

let itemList = event.dataTransfer.items;
for (let i = 0, len = itemList.length; i < len; i++) {
    if (itemList[i].kind == "file") {
        console.log(itemList[i].getAsFile());
    }
}
getAsString()

若拖拽數據對象是文本字符串類型,通過回調函數獲取拖拽數據中的字符串數據。

let itemList = event.dataTransfer.items;
for (let i = 0, len = itemList.length; i < len; i++) {
    if (itemList[i].kind == "string") {
        itemList[i].getAsString((data) => {
            console.log(data);
        });
    }
}
拖放對象的數據存儲

在進行拖放操作時,有可能需要把拖拽目標的數據傳送給放置目標,此時一般操作是在dragstart事件觸發時把需要的數據存儲到一個變量,然后再drop事件觸發時獲取這個變量。但當dragstart事件和drop事件在不同的文件定義,又不想玷污全局變量的情況下,我們需要更好的辦法來存儲拖放數據。

DataTransfer對象中的items屬性就是用來存儲拖放數據的,數據類型分為文本類型和文件類型。

存儲文本字符串類型數據:
event.dataTransfer.setData(type, data);

OR

event.dataTransfer.items.add(data, type);

一種文本字符串類型只能存儲一個數據,當重復文本字符串類型存儲數據時,后者會覆蓋前者。

存儲文件類型數據:
event.dataTransfer.items.add(file);
獲取所有文本字符串類型的拖拽數據對象
event.dataTransfer.types
獲取所有文件類型的拖拽數據對象
let files = event.dataTransfer.files;
for (let i = 0, len = files.length; i < len; i++) {
    console.log(files[i]);
}

OR

let itemList = event.dataTransfer.items;
for (let i = 0, len = itemList.length; i < len; i++) {
    if (itemList[i].kind == "file") {
        console.log(itemList[i].getAsFile());
    }
}
獲取所有文本字符串類型的拖拽數據對象
let itemList = event.dataTransfer.items;
for (let i = 0, len = itemList.length; i < len; i++) {
    if (itemList[i].kind == "string") {
        itemList[i].getAsString((data) => {
            console.log(data);
        });
    }
}
獲取指定文本字符串類型的拖拽數據對象
event.dataTransfer.getData(type);
刪除指定文本字符串類型的拖拽數據對象
event.dataTransfer.clearData(type);
刪除指定位置的拖拽數據對象
event.dataTransfer.items.remove(index);
清空所有拖拽數據對象
event.dataTransfer.clearData();

OR

event.dataTransfer.items.clear();
栗子

上面的幾個栗子都使用了以上方法存儲和獲取拖拽數據對象,感興趣的可以看看源碼。

歡迎關注:Leechikit
原文鏈接:segmentfault.com

到此本文結束,歡迎提問和指正。
寫原創文章不易,若本文對你有幫助,請點贊、推薦和關注作者支持。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87096.html

相關文章

  • 使用 Drag and Drop 給Web應用提升交互體驗

    摘要:注意點在鼠標操作拖放期間,有一些事件可能觸發多次,比如和。可拖拽元素,建議使用,設定可拖拽元素的鼠標游標,提升交互。在中使用拖拽中使用可以直接綁定到組件上。 什么是 Drag and Drop (拖放)? 簡單來說,HTML5 提供了 Drag and Drop API,允許用戶用鼠標選中一個可拖動元素,移動鼠標拖放到一個可放置到元素的過程。 我相信每個人都或多或少接觸過拖放,比如瀏覽...

    legendmohe 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<