列表數(shù)據(jù)拖拽排序

前言:很多時候我們都有這樣的一種需求:在一個數(shù)據(jù)列表中,對數(shù)據(jù)進行排序,然后這個排序又希望用戶體驗好一點,頁面不刷新,也不需要彈出修改數(shù)據(jù)的彈出層,直接在列表中拖拽數(shù)據(jù)實現(xiàn)排序。那么這樣的需求可以如何實現(xiàn)呢?這就需要用到前端的拖拽插件了,前端拖拽插件有很多,這里選擇的是Sortable插件。

下載插件

Sortable是可以實現(xiàn)DOM元素拖拽效果的前端插件,它的包很小,簡單易用,功能齊全,效果很好,它不依賴jQuery庫,是使用原生JavaScript開發(fā)的。最重要的是它可以讓我們完成列表數(shù)據(jù)拖拽排序的需求。

下載地址:https://github.com/RubaXa/Sortable
官方DEMO:http://rubaxa.github.io/Sortable/

開始使用

在頁面初始化成功后,創(chuàng)建出Sortable對象,然后傳入需要拖拽的DOM元素,該DOM元素應該是一個列表,這樣,該列表下的數(shù)據(jù)就能拖拽了:

$(function () {
        //給需要做拖拽排序的dom對象實例化出拖拽排序的對象
        var el = $("#items")[0];
        Sortable sortable = new Sortable(el);
})

完成拖拽排序

然后結合Sortable的其他屬性和方法,調(diào)用后臺程序就能完成拖拽排序的需求。在初始化Sortable代碼的基礎上進行改造,加上拖拽數(shù)據(jù)事件,觸發(fā)了該事件就把拖拽后的數(shù)據(jù)傳到后臺,然后由后臺程序完成數(shù)據(jù)重新排序:

//Sortable對象提取出來
var sortable;
    $(function () {
        //給需要做拖拽排序的dom對象實例化出拖拽排序的對象,并添加數(shù)據(jù)拖拽事件
        var el = $("#items")[0];
        sortable = new Sortable(el,{
            onUpdate:updateSort
        });
    })

    //更新數(shù)據(jù)排序方法
    function updateSort() {
        //調(diào)用Sortable對象的toArray方法,該方法的作用看下面屬性和方法的詳細介紹
        var ids = sortable.toArray();
        $.ajax({
            url:"xxx",
            type:"POST",
            data:JSON.stringify(ids),
            contentType:"application/json",
            dataType:"json"
        })
    }

其他屬性和方法

屬性:

group:string or array

sort:boolean 定義是否列表單元是否可以在列表容器內(nèi)進行拖拽排序;

delay:number 定義鼠標選中列表單元可以開始拖動的延遲時間;

disabled:boolean 定義是否此sortable對象是否可用,為true時sortable對象不能拖放排序等功能,為false時為可以進行排序,相當于一個開關;

animation:number 單位:ms,定義排序動畫的時間;

handle:selector 格式為簡單css選擇器的字符串,使列表單元中符合選擇器的元素成為拖動的手柄,只有按住拖動手柄才能使列表單元進行拖動;

filter:selector 格式為簡單css選擇器的字符串,定義哪些列表單元不能進行拖放,可設置為多個選擇器,中間用“,”分隔;

draggable:selector 格式為簡單css選擇器的字符串,定義哪些列表單元可以進行拖放

ghostClass:selector 格式為簡單css選擇器的字符串,當拖動列表單元時會生成一個副本作為影子單元來模擬被拖動單元排序的情況,此配置項就是來給這個影子單元添加一個class,我們可以通過這種方式來給影子元素進行編輯樣式;

chosenClass:selector 格式為簡單css選擇器的字符串,當選中列表單元時會給該單元增加一個class;

forceFallback:boolean 如果設置為true時,將不使用原生的html5的拖放,可以修改一些拖放中元素的樣式等;

fallbackClass:string 當forceFallback設置為true時,拖放過程中鼠標附著單元的樣式;

scroll:boolean 默認為true,當排序的容器是個可滾動的區(qū)域,拖放可以引起區(qū)域滾動


事件:

onChoose:function 列表單元被選中的回調(diào)函數(shù)

onStart:function 列表單元拖動開始的回調(diào)函數(shù)

onEnd:function 列表單元拖放結束后的回調(diào)函數(shù)

onAdd:function 列表單元添加到本列表容器的回調(diào)函數(shù)

onUpdate:function 列表單元在列表容器中的排序發(fā)生變化后的回調(diào)函數(shù)

onRemove:function 列表元素移到另一個列表容器的回調(diào)函數(shù)

onFilter:function 試圖選中一個被filter過濾的列表單元的回調(diào)函數(shù)

onMove:function 當移動列表單元在一個列表容器中或者多個列表容器中的回調(diào)函數(shù)

onClone:function 當創(chuàng)建一個列表單元副本的時候的回調(diào)函數(shù)


事件對象:

事件對象在各個函數(shù)中略有不同,可通過輸出對象查看對象的屬性,下面簡單列舉幾個:

to:HTMLElement--移動到列表容器

from:HTMLElement--來源的列表容器

item:HTMLElement--被移動的列表單元

clone:HTMLElement--副本的列表單元

oldIndex:number/undefined--在列表容器中的原序號

newIndex:number/undefined--在列表容器中的新序號


方法

option(name[,value])

獲得或者設置項參數(shù),使用方法類似于jQuery用法,沒有第二個參數(shù)為獲得option中第一個參數(shù)所對應的值,有第二個參數(shù)時,將重新賦給第一個參數(shù)所對應的值;

toArray()

序列化可排序的列表單元的data-id(可通過配置項中dataIdAttr修改)放入一個數(shù)組,并返回這個數(shù)組中

sort()

通過自定義列表單元的data-id的數(shù)組對列表單元進行排序

save()

destroy()
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,171評論 25 708
  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫安裝 3、第三方服務 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,195評論 1 180
  • 成功的先決條件就是持續(xù)不斷,不厭其煩地努力。雖然聽起來好像很簡單,但比別人更真誠努力的人,的確是可以成功的,...
    周立zhouli閱讀 473評論 0 1
  • 一年一度,每當春天到來的時候,它總是這樣飄呀飄,默默地、不動聲色但卻是盡情地撫摸著在嚴冬中悄然沉睡的大地,給其溫暖...
    紫螳螂閱讀 444評論 0 1
  • 夜晚,韓少遲遲沒有回來。雨欣睡不著便到外面的花園看夜色,聽到汽車聲響趕緊跑過去,見韓少獨自開車回來“來,我?guī)湍隳冒?..
    幽蘭馨雨閱讀 317評論 0 0

友情鏈接更多精彩內(nèi)容