您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在JavaScript中使用Sortable.js拖拽排序插件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
特點:
輕量級但功能強大
移動列表項時有動畫
支持觸屏設備和大多數瀏覽器(IE9及以下除外)
支持單個列表容器內部拖拽排序,也支持兩個列表容器互相拖拽排序
支持拖放操作和可選擇的文本
非常友善的滾動效果
基于原生HTML5中的拖放API
支持多種框架(Angular、Vue、React等)
支持所有的CSS框架,如:Bootstrap
簡單的API,方便調用
不依賴于jQuery
運行效果如下圖所示:
單個列表容器內部拖拽排序
<head> <script src="~/Scripts/jquery-3.3.1.min.js"></script> <script src="~/Scripts/Sortable-master/Sortable.min.js"></script> <script type="text/javascript"> $(document).ready(function () { var ul = document.getElementById("infos"); var sortable = new Sortable(ul, { handle: "input,li",//設置li、input支持拖拽 animation: 150,//設置動畫時長 // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent,此處指的是li的索引值 }, // Element dragging ended onEnd: function (/**Event*/evt) { var lis = $("#infos li"); //拖拽完畢后重新設置序號,使其連續 for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } } }); }); </script> <style> li{ cursor:pointer; padding-bottom:5px; list-style:none; } </style> </head> <body> <ul id="infos"> <li> <input type="text" value="1" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">objective</option> <option value="2">proposition</option> </select> </li> <li> <input type="text" value="2" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">eliminate</option> <option value="2">alige</option> </select> </li> <li> <input type="text" value="3" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">optimize</option> <option value="2">deploy</option> </select> </li> </ul> </body>
兩個列表容器相互拖拽排序
<head> <script src="~/Scripts/jquery-3.3.1.min.js"></script> <script src="~/Scripts/Sortable-master/Sortable.min.js"></script> <script type="text/javascript"> $(document).ready(function () { var infosOne = document.getElementById("infosOne"); var sortableOne = new Sortable(infosOne, { group: "guo",//若需要在兩個列表容器間拖拽排序,那group的值必須相同 handle: "input,li",//設置li、input支持拖拽 animation: 150,//設置動畫時長 // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent,此處指的是li的索引值 }, // Element dragging ended onEnd: function (/**Event*/evt) { var lis = $("#infosOne li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } lis = $("#infosTwo li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } } }); var infosTwo = document.getElementById("infosTwo"); var sortableTwo = new Sortable(infosTwo, { group:"guo",//若需要在兩個列表容器間拖拽排序,那group的值必須相同 handle: "input,li",//設置li、input支持拖拽 animation: 150,//設置動畫時長 // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent,此處指的是li的索引值 }, // Element dragging ended onEnd: function (/**Event*/evt) { var lis = $("#infosOne li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } lis = $("#infosTwo li"); for (var i = 0; i < lis.length; i++) { var no = $(lis[i]).find("input:eq(0)"); no.val(i + 1); } } }); }); </script> </head> <body> <ul id="infosOne"> <li> <input type="text" value="1" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">objective</option> <option value="2">proposition</option> </select> </li> <li> <input type="text" value="2" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">eliminate</option> <option value="2">alige</option> </select> </li> <li> <input type="text" value="3" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">optimize</option> <option value="2">deploy</option> </select> </li> </ul> <hr /> <ul id="infosTwo"> <li> <input type="text" value="1" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">目標任務</option> <option value="2">論題議題</option> </select> </li> <li> <input type="text" value="2" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">消除排除</option> <option value="2">機敏的敏捷的</option> </select> </li> <li> <input type="text" value="3" /> <input type="text" value="hierarchy" /> <select> <option value="">--請選擇--</option> <option value="1">優化使最優化</option> <option value="2">發布部署</option> </select> </li> </ul> </body>
常見配置項及事件
var sortable = new Sortable(el, { group: "name", // or { name: "...", pull: [true, false, clone], put: [true, false, array] } sort: true, // sorting inside list delay: 0, // time in milliseconds to define when the sorting should start touchStartThreshold: 0, // px, how many pixels the point should move before cancelling a delayed drag event disabled: false, // Disables the sortable if set to true. store: null, // @see Store animation: 150, // ms, animation speed moving items when sorting, `0` — without animation handle: ".my-handle", // Drag handle selector within list items filter: ".ignore-elements", // Selectors that do not lead to dragging (String or Function) preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter` draggable: ".item", // Specifies which items inside the element should be draggable ghostClass: "sortable-ghost", // Class name for the drop placeholder chosenClass: "sortable-chosen", // Class name for the chosen item dragClass: "sortable-drag", // Class name for the dragging item dataIdAttr: 'data-id', forceFallback: false, // ignore the HTML5 DnD behaviour and force the fallback to kick in fallbackClass: "sortable-fallback", // Class name for the cloned DOM Element when using forceFallback fallbackOnBody: false, // Appends the cloned DOM Element into the Document's Body fallbackTolerance: 0, // Specify in pixels how far the mouse should move before it's considered as a drag. scroll: true, // or HTMLElement scrollFn: function(offsetX, offsetY, originalEvent, touchEvt, hoverTargetEl) { ... }, // if you have custom scrollbar scrollFn may be used for autoscrolling scrollSensitivity: 30, // px, how near the mouse must be to an edge to start scrolling. scrollSpeed: 10, // px setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) { dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent }, // Element is chosen onChoose: function (/**Event*/evt) { evt.oldIndex; // element index within parent }, // Element dragging started onStart: function (/**Event*/evt) { evt.oldIndex; // element index within parent }, // Element dragging ended onEnd: function (/**Event*/evt) { var itemEl = evt.item; // dragged HTMLElement evt.to; // target list evt.from; // previous list evt.oldIndex; // element's old index within old parent evt.newIndex; // element's new index within new parent }, // Element is dropped into the list from another list onAdd: function (/**Event*/evt) { // same properties as onEnd }, // Changed sorting within list onUpdate: function (/**Event*/evt) { // same properties as onEnd }, // Called by any change to the list (add / update / remove) onSort: function (/**Event*/evt) { // same properties as onEnd }, // Element is removed from the list into another list onRemove: function (/**Event*/evt) { // same properties as onEnd }, // Attempt to drag a filtered element onFilter: function (/**Event*/evt) { var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event. }, // Event when you move an item in the list or between lists onMove: function (/**Event*/evt, /**Event*/originalEvent) { // Example: http://jsbin.com/tuyafe/1/edit?js,output evt.dragged; // dragged HTMLElement evt.draggedRect; // TextRectangle {left, top, right и bottom} evt.related; // HTMLElement on which have guided evt.relatedRect; // TextRectangle originalEvent.clientY; // mouse position // return false; — for cancel }, // Called when creating a clone of element onClone: function (/**Event*/evt) { var origEl = evt.item; var cloneEl = evt.clone; } });
屬性
group:string or array
sort:boolean 定義是否列表單元是否可以在列表容器內進行拖拽排序;
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,當排序的容器是個可滾動的區域,拖放可以引起區域滾動
事件:
onChoose:function 列表單元被選中的回調函數
onStart:function 列表單元拖動開始的回調函數
onEnd:function 列表單元拖放結束后的回調函數
onAdd:function 列表單元添加到本列表容器的回調函數
onUpdate:function 列表單元在列表容器中的排序發生變化后的回調函數
onRemove:function 列表元素移到另一個列表容器的回調函數
onFilter:function 試圖選中一個被filter過濾的列表單元的回調函數
onMove:function 當移動列表單元在一個列表容器中或者多個列表容器中的回調函數
onClone:function 當創建一個列表單元副本的時候的回調函數
事件對象:
事件對象在各個函數中略有不同,可通過輸出對象查看對象的屬性,下面簡單列舉幾個:
to:HTMLElement--移動到列表容器
from:HTMLElement--來源的列表容器
item:HTMLElement--被移動的列表單元
clone:HTMLElement--副本的列表單元
oldIndex:number/undefined--在列表容器中的原序號
newIndex:number/undefined--在列表容器中的新序號
方法
option(name[,value])
獲得或者設置項參數,使用方法類似于jQuery用法,沒有第二個參數為獲得option中第一個參數所對應的值,有第二個參數時,將重新賦給第一個參數所對應的值;
closest
返回滿足selector條件的元素集合中的第一個項
toArray()
序列化可排序的列表單元的data-id(可通過配置項中dataIdAttr修改)放入一個數組,并返回這個數組中
sort()
通過自定義列表單元的data-id的數組對列表單元進行排序
save()
destroy()
javascript是一種動態類型、弱類型的語言,基于對象和事件驅動并具有相對安全性并廣泛用于客戶端網頁開發的腳本語言,同時也是一種廣泛用于客戶端Web開發的腳本語言。它主要用來給HTML網頁添加動態功能,現在JavaScript也可被用于網絡服務器,如Node.js。
看完上述內容,你們對怎么在JavaScript中使用Sortable.js拖拽排序插件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。