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

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 12:06:24
字體:
來源:轉載
供稿:網友

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

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

特點:

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

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

運行效果如下圖所示:

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

<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()

PS:這里再為大家推薦一款關于排序的演示工具供大家參考:

在線動畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.VeVB.COm/aideddesign/paixu_ys

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript表格(table)操作技巧大全》、《JavaScript操作DOM技巧總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript數學運算用法總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結

希望本文所述對大家JavaScript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品小视频| 91在线网站视频| 中文.日本.精品| 亚洲精品av在线播放| 久久久精品久久| 欧美激情免费在线| 国产精品久久久久aaaa九色| 懂色av中文一区二区三区天美| 伦理中文字幕亚洲| 日韩av在线网址| 欧洲美女7788成人免费视频| 在线观看国产欧美| 亚洲午夜国产成人av电影男同| 欧美成人合集magnet| 成人羞羞国产免费| 亚洲国产精品视频在线观看| 日韩精品视频免费在线观看| 欧美高清激情视频| 久久国产加勒比精品无码| 黑人巨大精品欧美一区二区免费| 亚洲第一男人av| 91中文字幕一区| 亚洲老司机av| 成人国内精品久久久久一区| 国产精品黄页免费高清在线观看| 九九精品视频在线观看| 久久露脸国产精品| 久久久国产视频| 亚洲人成在线观看网站高清| 91在线观看免费网站| 精品视频在线播放色网色视频| 日韩精品欧美国产精品忘忧草| 青青a在线精品免费观看| 久久精品人人做人人爽| 亚洲三级黄色在线观看| 中文字幕亚洲综合| 欧美一区二区三区免费观看| 久久久国产影院| 亚洲性无码av在线| 国产精品亚洲第一区| 欧美成人小视频| 最近中文字幕2019免费| 精品激情国产视频| 亚洲护士老师的毛茸茸最新章节| 亚洲成成品网站| 日韩久久精品成人| 国产午夜精品视频免费不卡69堂| 精品久久久久久久久久ntr影视| 欧美另类交人妖| 日韩最新在线视频| 久久久亚洲成人| 中文字幕久热精品视频在线| 国产精品视频自在线| 51色欧美片视频在线观看| 国产精品mp4| 91丝袜美腿美女视频网站| 亚洲白虎美女被爆操| 国产99久久久欧美黑人| 欧美日本啪啪无遮挡网站| 日韩高清av在线| 国产99久久久欧美黑人| 亚洲欧美中文字幕在线一区| 亚洲aa在线观看| 亚洲第一综合天堂另类专| 欧美一区二区三区免费观看| 国产精品wwwwww| 久久99国产精品久久久久久久久| 国产一区红桃视频| 亚洲男人天天操| 久久久久国产视频| 中文字幕精品网| 日韩影视在线观看| 69av在线视频| 日本精品在线视频| y97精品国产97久久久久久| 尤物yw午夜国产精品视频明星| 日韩中文字幕第一页| 国产精品久久久久久久av电影| 91久久综合亚洲鲁鲁五月天| 亚洲女人天堂成人av在线| 国产欧美在线观看| 国产精品偷伦视频免费观看国产| 久久精品国产电影| 久久精品国产清自在天天线| 亚洲的天堂在线中文字幕| 欧美激情伊人电影| 成人福利网站在线观看| 亚洲va久久久噜噜噜久久天堂| 国产精品久久久久久久久久新婚| 91丝袜美腿美女视频网站| 国产原创欧美精品| 国产在线观看91精品一区| 92裸体在线视频网站| 国产精品热视频| 91精品国产亚洲| 国产69精品久久久久9| 一本一道久久a久久精品逆3p| 欧美成人午夜视频| 久久99精品久久久久久琪琪| 日韩免费看的电影电视剧大全| 成人亲热视频网站| 日本精品视频网站| 国产午夜精品美女视频明星a级| 91探花福利精品国产自产在线| 国产精品日韩在线一区| 国产伦精品免费视频| 久久久久久久av| 国产精品美女午夜av| 欧美在线观看网站| 久久成人18免费网站| 国产精品美女无圣光视频| 国产视频自拍一区| 久久久久久久999精品视频| 久久综合国产精品台湾中文娱乐网| 孩xxxx性bbbb欧美| 日韩欧美成人免费视频| 国产一区二区日韩精品欧美精品| 日韩欧美视频一区二区三区| 国产精品欧美日韩一区二区| 在线观看欧美日韩| 国产精品入口夜色视频大尺度| 亚洲天堂免费视频| 日韩美女毛茸茸| 国产精品视频网| 国产精品自产拍高潮在线观看| 欧美午夜性色大片在线观看| 久久国产加勒比精品无码| 亚洲欧美日韩精品久久奇米色影视| 一区二区三区动漫| 精品久久久久久中文字幕大豆网| 亚洲伊人第一页| 色先锋资源久久综合5566| 亚洲精品二三区| 欧美日韩亚洲激情| 蜜臀久久99精品久久久久久宅男| 亚洲精品综合久久中文字幕| 日韩精品视频观看| 国产精品欧美一区二区三区奶水| 国产精品激情av电影在线观看| 亚洲精品日产aⅴ| 久久久久北条麻妃免费看| 久久精品国产清自在天天线| 国产91久久婷婷一区二区| 91国自产精品中文字幕亚洲| 91精品国产综合久久男男| 亚洲国产欧美久久| 日韩电影在线观看中文字幕| 久久人人爽人人| 国产精品旅馆在线| 国产精品一二三在线| 伊人亚洲福利一区二区三区| 亚洲黄页网在线观看| 久久亚洲一区二区三区四区五区高| 欧美在线观看日本一区| 国产午夜精品全部视频在线播放| 超碰97人人做人人爱少妇| 97热在线精品视频在线观看| 精品久久久久久久久国产字幕| 欧美做受高潮1| 精品亚洲男同gayvideo网站| 粉嫩av一区二区三区免费野| 日韩欧美在线视频观看| 欧美日韩国产成人高清视频| 欧美视频在线免费|