欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于JavaScript 實現(xiàn)拖放功能

 更新時間:2019年09月12日 13:54:22   作者:zhangbao90s  
本文通過實例代碼給大家介紹了JavaScript 實現(xiàn)拖放功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

本篇只介紹實現(xiàn)基本的拖放功能。

將元素設置成可拖動的

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

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

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

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

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

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

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

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

拖放事件處理器

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

ondragstart
ondragover
ondrop

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

DataTransfer

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

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

拖動時更新元素

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

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

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

我們要實現(xiàn)的功能是將拖動元素移動到一個新的父元素里面。我們需要獲取拖動元素,因此需要將拖動元素的 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:

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

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

 <span> dropzone </span>
</div>

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

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

設置元素為可放置的

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

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

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

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

 <span ondragover='onDragOver(event);'>
  dropzone
 </span>
</div>

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

放置的時候要做什么?

現(xiàn)在要介紹第三個也是最后一個處理函數(shù) ondrop 。

我們的函數(shù)邏輯遵循以下步驟:

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

 const draggableElement = document.getElementById(id);
 const dropzone = event.target;
 
 dropzone.appendChild(draggableElement);

 event
  .dataTransfer
  .clearData();
}

因為這是我們要寫的第三個也是最后一個函數(shù),我們只要將它傳遞給 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:

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

總結

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

相關文章

  • js密碼強度檢測

    js密碼強度檢測

    這篇文章主要介紹了js密碼強度檢測的相關資料,并給出了詳細代碼,需要的朋友可以參考下
    2016-01-01
  • js實現(xiàn)點擊文本框顯示日期選擇器特效代碼分享

    js實現(xiàn)點擊文本框顯示日期選擇器特效代碼分享

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)點擊文本框顯示日期選擇器特效,提高了工作效率,推薦給大家,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • 一文解決前端JS小數(shù)運算精度問題

    一文解決前端JS小數(shù)運算精度問題

    在做項目的時候,前端需要在表格的底部做一個匯總的功能,在采用reduce對當前屬性所有值匯總時,發(fā)現(xiàn)匯總結果存在好長的小數(shù)位,本文給大家介紹了如何解決前端JS小數(shù)運算精度問題,需要的朋友可以參考下
    2024-02-02
  • javaScript中一些常見的數(shù)據(jù)類型檢查校驗

    javaScript中一些常見的數(shù)據(jù)類型檢查校驗

    最近在面試的時候又被問到JS中檢查校驗數(shù)據(jù)類型的方法,所以這篇文章主要給大家介紹了關于javaScript中一些常見的數(shù)據(jù)類型檢查校驗的相關資料,需要的朋友可以參考下
    2022-05-05
  • JavaScript中防抖和節(jié)流的原理和區(qū)別詳解

    JavaScript中防抖和節(jié)流的原理和區(qū)別詳解

    JavaScript 中,防抖和節(jié)流是一種用于優(yōu)化事件處理函數(shù)調用頻率的技術,防抖和節(jié)流的目的都是為了避免頻繁地觸發(fā)事件處理函數(shù),從而減少瀏覽器和服務器的負擔,本文將給大家介紹一下JavaScript中防抖和節(jié)流的原理和區(qū)別,需要的朋友可以參考下
    2023-09-09
  • 微信小程序實現(xiàn)自動播放視頻模仿gif動圖效果實例

    微信小程序實現(xiàn)自動播放視頻模仿gif動圖效果實例

    這篇文章主要給大家介紹了關于微信小程序實現(xiàn)自動播放視頻模仿gif動圖效果的相關資料,通過本文介紹的方法可以實現(xiàn)自動播放視頻,視頻無控制條無聲音且自動循環(huán)播放,需要的朋友可以參考下
    2021-07-07
  • js時鐘翻牌效果實現(xiàn)代碼分享

    js時鐘翻牌效果實現(xiàn)代碼分享

    這篇文章主要介紹了javascript時鐘翻牌效果的實現(xiàn),效果非常酷炫,實現(xiàn)步驟也很簡單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • chrome調試javascript詳解

    chrome調試javascript詳解

    這篇文章主要介紹了chrome調試javascript詳解,需要的朋友可以參考下
    2015-10-10
  • javascript 仿QQ滑動菜單效果代碼

    javascript 仿QQ滑動菜單效果代碼

    javascript 仿QQ滑動菜單效果代碼,非常漂亮的代碼,學習js的朋友可以參考下代碼風格。
    2010-09-09
  • 一些常用彈出窗口/拖放/異步文件上傳等實用代碼

    一些常用彈出窗口/拖放/異步文件上傳等實用代碼

    今天寫一點工作中遇到的東西【彈出窗口】【拖放】【異步文件上傳】,大家共同學習,共同進步
    2013-01-01

最新評論