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

首頁 > 開發 > JS > 正文

JS拖拽排序插件Sortable.js用法實例分析

2024-05-06 16:48:15
字體:
來源:轉載
供稿:網友

本文實例講述了JS拖拽排序插件Sortable.js用法。分享給大家供大家參考,具體如下:

最近由于項目功能設計的原因,需要對table中的行實現拖拽排序功能,找來找去發現Sortable.js能很好的滿足這個需求,而且它還是開源的,于是乎就開始學習使用Sortable.js,再然后就有了這篇文章。

特點:

  • 輕量級但功能強大
  • 移動列表項時有動畫
  • 支持觸屏設備和大多數瀏覽器(IE9及以下除外)
  • 支持單個列表容器內部拖拽排序,也支持兩個列表容器互相拖拽排序
  • 支持拖放操作和可選擇的文本
  • 非常友善的滾動效果
  • 基于原生HTML5中的拖放API
  • 支持多種框架(Angular、Vue、React等)
  • 支持所有的CSS框架,如:Bootstrap
  • 簡單的API,方便調用
  • CDN
  • 不依賴于jQuery

下載地址:https://github.com/RubaXa/Sortable
或者點擊此處本站下載

運行效果如下圖所示:

JS,拖拽排序插件,Sortable.js

單個列表容器內部拖拽排序

<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程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国内自产拍在线观看| 欧美风情在线观看| 日韩欧美在线观看视频| 亚洲欧洲第一视频| 欧美激情2020午夜免费观看| 欧美午夜视频一区二区| 亚洲精品ady| 国产免费观看久久黄| 日韩高清免费在线| 亚洲国产婷婷香蕉久久久久久| 午夜精品99久久免费| 欧美另类老肥妇| 国产精品偷伦免费视频观看的| 亚洲成人久久电影| www国产精品视频| 国产精品久久久久久久久久三级| 欧美制服第一页| 亚洲福利视频久久| 日韩中文字幕欧美| 欧美成人自拍视频| 欧美激情精品久久久久久大尺度| 91久久久久久久久久久久久| 欧美日韩国产一区二区三区| 国产美女精品免费电影| 伊人激情综合网| 中文字幕无线精品亚洲乱码一区| 亚洲色图偷窥自拍| 亚洲欧美中文日韩v在线观看| 97超级碰在线看视频免费在线看| 国产国语刺激对白av不卡| 色yeye香蕉凹凸一区二区av| 欧美激情一区二区三区高清视频| www.久久久久| 色yeye香蕉凹凸一区二区av| 国产一区二区三区毛片| 国产成人亚洲综合| 国产午夜精品免费一区二区三区| 精品日本高清在线播放| 超碰日本道色综合久久综合| 萌白酱国产一区二区| 亚洲精品ady| 久久精品精品电影网| 国产欧美精品日韩| 欧美黄色片在线观看| 91中文精品字幕在线视频| 日韩视频在线免费观看| 日韩精品视频三区| 亚洲区在线播放| 在线精品91av| 97视频在线观看免费高清完整版在线观看| 欧美在线日韩在线| 国产精品自拍偷拍| 日本久久91av| 91精品国产91久久久| 久久精品电影网| 亚洲国产精彩中文乱码av在线播放| 性欧美暴力猛交69hd| 国产精品扒开腿做爽爽爽男男| 亚洲欧美国产一本综合首页| 久久香蕉国产线看观看av| 国产精品美女无圣光视频| 欧美激情精品久久久久久久变态| 青草青草久热精品视频在线网站| 最近2019年手机中文字幕| 国产91九色视频| 91av在线免费观看视频| 日韩av电影免费观看高清| 国产精品69久久久久| 精品久久久久久中文字幕大豆网| 欧美区在线播放| 欧美专区在线视频| 国产一区二区三区视频在线观看| 97视频在线播放| 精品国产一区久久久| 国产精品99久久久久久久久| 一区二区三区日韩在线| 久久久久久中文字幕| 亚洲欧美国产精品va在线观看| 福利视频一区二区| 5566成人精品视频免费| 国产一区二区激情| 2019亚洲男人天堂| 国产成人一区三区| 亚洲精品国产精品国自产观看浪潮| 精品久久中文字幕久久av| 日韩精品久久久久久福利| 国产99久久精品一区二区永久免费| 成人网中文字幕| 国产精品久久久久久久一区探花| 亚洲国产精品嫩草影院久久| 日韩精品在线免费| 亚洲一区二区在线| 国产亚洲成精品久久| 久久中文精品视频| 中文字幕亚洲综合久久筱田步美| 久久久久久18| 国产日韩在线观看av| 欧美激情久久久| 色偷偷888欧美精品久久久| 美女啪啪无遮挡免费久久网站| 国产精品久久久久99| 亚洲精品一区久久久久久| 欧美久久精品午夜青青大伊人| 国产一区二区三区高清在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 日韩免费观看在线观看| 久久亚洲春色中文字幕| 国产视频久久久久| 久久久亚洲影院你懂的| 国产精品永久免费| 日韩精品极品视频免费观看| 国产精品18久久久久久麻辣| 欧美日韩在线看| 69av成年福利视频| xxxxx91麻豆| 亚洲日本欧美日韩高观看| 精品毛片三在线观看| 欧美黄色小视频| 亚洲国产精彩中文乱码av| 色www亚洲国产张柏芝| 欧美精品电影免费在线观看| 国模精品一区二区三区色天香| 日韩经典中文字幕| 欧美大片第1页| 欧美巨乳在线观看| 亚洲精品视频免费| 欲色天天网综合久久| 日韩高清免费观看| 亚洲成人激情在线| 亚洲精品自拍偷拍| 亚洲精品中文字幕av| 国产精品美女呻吟| 激情av一区二区| 国产中文字幕日韩| 日韩精品免费在线观看| 欧美视频在线视频| 国产精品久久久久久亚洲调教| 色哟哟网站入口亚洲精品| 国产精品网站视频| 欧美午夜片欧美片在线观看| 国内自拍欧美激情| 亚洲男女自偷自拍图片另类| 亚洲欧美综合另类中字| 中文字幕国产亚洲| 欧美一区二区三区精品电影| 亚洲精品国产精品自产a区红杏吧| 欧美激情视频在线观看| 国产精品免费网站| 日本国产一区二区三区| 91产国在线观看动作片喷水| 日本久久久久久| 亚洲**2019国产| 欧美精品18videos性欧| 亚洲免费电影一区| 欧美性xxxxxxx| 日本高清+成人网在线观看| 国产偷亚洲偷欧美偷精品| 久久久久久久色| 日韩电视剧免费观看网站| 亚洲一区二区三区毛片| www.日韩视频| 久久伊人精品视频| 亚洲第一精品福利| 欧美日韩另类视频|