亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于JavaScript 實現拖放功能

2019-11-19 09:22:23
字體:
來源:轉載
供稿:網友

HTML 的拖放 API 依賴 DOM 事件模型,獲取拖放和放置元素的相關信息,以此實現拖放功能。我們只需要注冊很少幾個事件監聽器,就能把任何元素變成可拖動或可放置的。

拖放 API 除了提供基本的拖放功能接口外,還可以在拖放之外提供選擇,用來自定義行為。比如,可以修改拖放元素的 CSS 樣式?;蛘?,我們不移動元素,拖動的時候,復制一個副本,拖放結束后,我們就會多了一個同樣的元素。

本篇只介紹實現基本的拖放功能。

將元素設置成可拖動的

我們先從拖動元素開始。假設我們有一個容器元素,其中包含兩種類型的子元素:可拖動元素和可放置元素。舉個例子,如果我們有一個待辦事項列表,我們可以將待辦事項拖到“完成”區域。

簡單起見,我們將移動的元素稱為拖動元素,將拖動元素移入的目標元素稱為 dropzone。

<div class='parent'> <span id='draggableSpan'>  draggable </span> <span> dropzone </span></div>

這是我們的第一段代碼,子元素現在還 不能 拖動。

下面給拖動元素添加屬性 draggable='true' ,將它設置成一個可拖動元素。

<div class='parent'> <span id='draggableSpan' draggable='true'>  draggable </span> <span> dropzone </span></div>

現在你再用鼠標拖動拖動元素的時候,它就會跟隨鼠標移動(對不起,移動端不行:see_no_evil:)。

draggable 屬性在沒設置的情況下,默認值 auto 。就是說,元素是可不可以拖動,取決于瀏覽器的默認設置。比如,鏈接( <a> )默認就是可拖動的,而 <span> 就不是。

拖放事件處理器

到目前為止,如果我們拖動元素,釋放鼠標,什么事都不會發生。拖動和放置都會觸發事件,實現一個基本的拖放功能,我們最少需要用到拖放 API 中的三個事件:

ondragstart
ondragover
ondrop

學會使用 ondragstart 、 ondragover 、 ondrop 事件只是個開始。拖拽過程一共會涉及八個事件: ondrag 、 ondragend 、 ondragenter 、 ondragexit 、 ondragleave 、 ondragover 、 ondragstartondrop 。

DataTransfer

DataTransfer 接口中保存了與當前拖放過程相關的跟蹤信息,信息從 DataTransfer 對象屬性中獲得,而 DataTransfer 對象又是從 DOM 事件對象中獲得的。

技術上講, DataTransfer 接口可以同時跟蹤多個拖動對象的信息,我們這里只關注拖動一個元素的情況。:sparkles:

拖動時更新元素

下一步,我們開始設置 ondragstart 的事件處理器。

拖動開始時,我們可以在 ondragstart 處理器中,做任何想做的修改。比如更新拖動元素的 CSS 樣式,將拖動的版本設置為臨時圖片,或者其他能從 DOM 事件中訪問到的任何內容。

dataTransfer 對象的 setData 屬性可以用來設置拖動狀態信息。它接收兩個參數,第一個參數是表示內容格式的字符串,第二個參數是實際傳遞的數據。

我們要實現的功能是將拖動元素移動到一個新的父元素里面。我們需要獲取拖動元素,因此需要將拖動元素的 ID 通過 setData 屬性保存下來:

function onDragStart(event) { event  .dataTransfer  .setData('text/plain', event.target.id);}

再從事件對象中獲得拖動元素并設置 CSS 樣式:

function onDragStart(event) { event  .dataTransfer  .setData('text/plain', event.target.id); event  .currentTarget  .style  .backgroundColor = 'yellow';}

注意:如果上面的黃色背景樣式,你只希望在拖動時才應用,那么拖動結束后,就要手動將樣式恢復。就會說,拖動開始時,如果修改了元素樣式,除非再次修改過來,否則樣式是不會自動恢復的。:rainbow:

拖動開始時的處理函數寫好了,現在將它設置給可拖動元素的 ondragstart 屬性:

<div class='parent'> <span id='draggableSpan'  draggable='true'  ondragstart='onDragStart(event);'>   draggable </span> <span> dropzone </span></div>

下面是使用鼠標拖動時的效果:

現在拖動元素, ondragstart 中的代碼就會執行,樣式改變了,但釋放拖動元素后,什么事情都沒發生。接下來我們將視線轉移到 dropzone 上來。

設置元素為可放置的

ondragstart 之后,下一個要寫的處理函數就是 ondragover 了。上面講過,放置行為默認是被瀏覽器阻止的,我們需要取消這個默認行為,雙重否定為肯定,對吧?

function onDragOver(event) { event.preventDefault();}

在阻止瀏覽器干擾后,現在就能將拖動元素添加到 dropzone 了,dropzone 成為能夠接受任何拖動元素的容器元素。

<div class='parent'> <span id='draggableSpan'  draggable='true'  ondragstart='onDragStart(event);'>   draggable </span> <span ondragover='onDragOver(event);'>  dropzone </span></div>

即便現在 dropzone 可以接受拖動元素,釋放鼠標后還是看不見改變發生。

放置的時候要做什么?

現在要介紹第三個也是最后一個處理函數 ondrop 。

我們的函數邏輯遵循以下步驟:

  • 還記得在 setData 中設置的數據嗎?
  • 現在我們需要從 dataTransfer 對象的 getData 屬性中獲取設置的數據,數據內容是拖動元素的 ID,它會返回給我們。
  • 使用上一步獲取的 ID,獲得拖動元素。 獲取 dropzone 元素。
  • 將拖拽元素 append 到 dropzone 中。
  • 清理 dataTransfer 對象中保存的數據。
function onDrop(event) { const id = event  .dataTransfer  .getData('text'); const draggableElement = document.getElementById(id); const dropzone = event.target;  dropzone.appendChild(draggableElement); event  .dataTransfer  .clearData();}

因為這是我們要寫的第三個也是最后一個函數,我們只要將它傳遞給 dropzone 的 ondrop 屬性,就完成了一個完整的拖放功能!

<div class='parent'> <span id='draggableSpan'  draggable='true'  ondragstart='onDragStart(event);'>   draggable </span> <span  ondragover='onDragOver(event);'  ondrop='onDrop(event);'>   dropzone </span></div>

這里寫的示例是最基本的,它展示如何使頁面上的任何內容可變得可拖動。當然,一個網頁里可以同時包含多個可拖動元素、多個 dropzone,或者使用文本沒有介紹的其他事件做更加細粒度的自定義設置。

下面展示的是本文一開始提到的那個簡單的待辦事項列表功能。:fire:

只要依據本文上面已經講過的內容,稍微變通一下,就能寫出來。只要確保這里可拖動待辦項目的 ID 是唯一的就行了。

總結

以上所述是小編給大家介紹的基于JavaScript 實現拖放功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品电影久久久| 久久综合伊人77777尤物| 欧美日韩在线视频一区| 亚洲国内精品视频| 69视频在线免费观看| 成人网欧美在线视频| 亚洲第一网站男人都懂| 亚洲精品黄网在线观看| 欧美精品免费在线| 九九久久国产精品| 日韩精品在线免费| 欧美激情久久久久久| 久久久中精品2020中文| 欧美综合国产精品久久丁香| 国产成人精品av| 国产精品wwwwww| 九九久久精品一区| 国产精品视频999| 亚洲一区免费网站| 在线成人激情黄色| 精品国偷自产在线视频99| 法国裸体一区二区| xxx成人少妇69| 日韩av成人在线观看| 国产成人+综合亚洲+天堂| 亚洲第一天堂av| 国产91在线播放九色快色| 欧美激情亚洲精品| 色噜噜狠狠狠综合曰曰曰88av| 亚洲精品理论电影| 国产精品最新在线观看| 欧美激情视频一区二区三区不卡| 91香蕉嫩草影院入口| 久久频这里精品99香蕉| 91成人在线观看国产| 亚洲精品一区二区三区婷婷月| 亚洲精品一区二三区不卡| 日韩av电影在线免费播放| 91热福利电影| 国产精品久久久久久久久久久久| 日韩高清电影好看的电视剧电影| 日韩在线观看免费高清完整版| 国产成人自拍视频在线观看| 国产精品成人品| 国产精品视频永久免费播放| 国产精品丝袜视频| 亚洲影院色在线观看免费| 91热精品视频| 国产成人短视频| 免费不卡欧美自拍视频| 91在线观看免费高清完整版在线观看| 国产欧美日韩中文字幕在线| 亚洲桃花岛网站| 中文字幕自拍vr一区二区三区| 亚洲色图偷窥自拍| 青青久久av北条麻妃黑人| 久久99视频免费| 538国产精品视频一区二区| 精品无码久久久久久国产| 欧美精品做受xxx性少妇| 69久久夜色精品国产69| 国产精品福利久久久| 国产成人一区二区三区电影| 欧美国产日韩在线| 久久久久久欧美| 欧美日韩高清在线观看| 国产午夜精品麻豆| 浅井舞香一区二区| 欧美丰满老妇厨房牲生活| 精品久久久999| 精品视频在线导航| 欧美理论电影网| 最近2019好看的中文字幕免费| 亚洲xxxxx电影| 日韩久久免费视频| 高清在线视频日韩欧美| 亚洲第一区在线观看| 欧美一级视频免费在线观看| 97精品视频在线| 欧美性色xo影院| 日韩欧美在线观看视频| 国产精品成人观看视频国产奇米| 日韩中文字幕在线| 国产99久久久欧美黑人| 上原亚衣av一区二区三区| 日韩精品在线观看一区| 亚洲成人免费在线视频| 欧美一区视频在线| 精品国产一区二区三区久久久| 国产在线98福利播放视频| 日韩精品福利网站| 91在线精品播放| 亚洲欧美制服综合另类| 日韩小视频在线观看| 国产欧美最新羞羞视频在线观看| 在线播放日韩欧美| 日韩人体视频一二区| 91精品国产综合久久香蕉的用户体验| 欧美最猛性xxxxx免费| 91九色视频导航| 日韩精品中文字幕视频在线| 国产亚洲欧美aaaa| 国产在线日韩在线| 日韩精品在线免费观看| 国语自产在线不卡| 欧美大学生性色视频| 欧美疯狂xxxx大交乱88av| 亚洲毛片在线观看| 一区二区av在线| 国产精品免费一区| 中文字幕国内精品| 久久国产视频网站| 亚洲国产精品高清久久久| 亚洲欧美国产精品久久久久久久| 日韩av在线播放资源| 色av吧综合网| 欧美精品在线免费播放| 91超碰中文字幕久久精品| 中文字幕国产亚洲2019| 最新91在线视频| 国产精品视频永久免费播放| 欧美电影《睫毛膏》| 国产成人精品一区| 国产精品视频免费在线| 国产精品视频最多的网站| 日韩亚洲成人av在线| 国产欧美日韩中文| 亚洲免费av片| 8090成年在线看片午夜| 精品日韩视频在线观看| 国产噜噜噜噜久久久久久久久| 色无极影院亚洲| 国产精品免费小视频| 亚洲国产成人91精品| 成人欧美一区二区三区黑人| 青青草原成人在线视频| 91嫩草在线视频| 国产精品久久久久久亚洲调教| 国产精品日日做人人爱| 国产91精品久久久久| 欧美精品在线极品| 美女福利视频一区| 欧美日韩日本国产| 欧美视频13p| 亚洲人线精品午夜| 另类色图亚洲色图| 亚洲欧洲偷拍精品| 欧美成人午夜免费视在线看片| 久久久久久免费精品| 亚洲欧美综合区自拍另类| 亚洲护士老师的毛茸茸最新章节| 91国自产精品中文字幕亚洲| 亚洲色图综合网| 亚洲精品一区二区三区婷婷月| 性色av一区二区三区在线观看| 亚洲欧美中文字幕在线一区| 久久这里有精品视频| 在线观看日韩视频| 欧美成人免费观看| 欧美性一区二区三区| 91久久在线观看| 色一情一乱一区二区| 亚洲一区二区三区成人在线视频精品| 黄色91在线观看|