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

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

 更新時間:2019年02月20日 09:55:49   作者:changuncle  
這篇文章主要介紹了JS拖拽排序插件Sortable.js用法,結合實例形式分析了拖拽排序插件Sortable.js功能、使用方法及相關操作注意事項,需要的朋友可以參考下

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

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

特點:

  • 輕量級但功能強大
  • 移動列表項時有動畫
  • 支持觸屏設備和大多數(shù)瀏覽器(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");
     //拖拽完畢后重新設置序號,使其連續(xù)
     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">優(yōu)化使最優(yōu)化</option>
    <option value="2">發(fā)布部署</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,當排序的容器是個可滾動的區(qū)域,拖放可以引起區(qū)域滾動

事件:

onChoose:function 列表單元被選中的回調函數(shù)
onStart:function 列表單元拖動開始的回調函數(shù)
onEnd:function 列表單元拖放結束后的回調函數(shù)
onAdd:function 列表單元添加到本列表容器的回調函數(shù)
onUpdate:function 列表單元在列表容器中的排序發(fā)生變化后的回調函數(shù)
onRemove:function 列表元素移到另一個列表容器的回調函數(shù)
onFilter:function 試圖選中一個被filter過濾的列表單元的回調函數(shù)
onMove:function 當移動列表單元在一個列表容器中或者多個列表容器中的回調函數(shù)
onClone:function 當創(chuàng)建一個列表單元副本的時候的回調函數(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ù)所對應的值;

closest
返回滿足selector條件的元素集合中的第一個項

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

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

save()

destroy()

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

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

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

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

相關文章

  • Javascript 拖拽雛形(逐行分析代碼,讓你輕松了拖拽的原理)

    Javascript 拖拽雛形(逐行分析代碼,讓你輕松了拖拽的原理)

    這篇文章主要介紹了Javascript 拖拽雛形(逐行分析代碼,讓你輕松了拖拽的原理),需要的朋友可以參考下
    2015-01-01
  • JavaScript中數(shù)組去除重復的三種方法

    JavaScript中數(shù)組去除重復的三種方法

    本文通過三種方法給大家介紹js數(shù)組去除重復的方法,實用性非常高,感興趣的朋友一起學習吧
    2016-04-04
  • JavaScript中DOM操作常用事件總結

    JavaScript中DOM操作常用事件總結

    這篇文章主要為大家詳細介紹了JavaScript中常用的幾個DOM事件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-04-04
  • js + css實現(xiàn)標簽內容切換功能(實例講解)

    js + css實現(xiàn)標簽內容切換功能(實例講解)

    下面小編就為大家?guī)硪黄猨s + css實現(xiàn)標簽內容切換功能(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • js實現(xiàn)簡單的驗證碼

    js實現(xiàn)簡單的驗證碼

    這篇文章主要介紹了js實現(xiàn)簡單驗證碼的方法,驗證碼主要是為了網(wǎng)站的安全性,防止惡意注冊和登陸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • JavaScript平鋪數(shù)組轉樹形結構的實現(xiàn)示例

    JavaScript平鋪數(shù)組轉樹形結構的實現(xiàn)示例

    本文主要介紹了JavaScript平鋪數(shù)組轉樹形結構的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 5秒后跳轉效果(setInterval/SetTimeOut)

    5秒后跳轉效果(setInterval/SetTimeOut)

    實現(xiàn)5秒后自動跳轉效果有兩種方式setInterval與SetTimeOut,具體實現(xiàn)如下,感興趣的朋友可以參考下
    2013-05-05
  • js實現(xiàn)input框文字動態(tài)變換顯示效果

    js實現(xiàn)input框文字動態(tài)變換顯示效果

    這篇文章主要介紹了js實現(xiàn)input框文字動態(tài)變換顯示效果,涉及javascript隨機字符串與中文的動態(tài)切換顯示效果,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 詳解如何在在瀏覽器中使用WebRTC獲取用戶IP地址

    詳解如何在在瀏覽器中使用WebRTC獲取用戶IP地址

    如果需要在程序中獲取當前用戶的IP,通常手段都是需要使用服務器,但現(xiàn)在借助WebRTC的強大功能,我們可以直接在瀏覽器客戶端獲取用戶IP,所以本文小編將給大家介紹一下如何在在瀏覽器中使用WebRTC獲取用戶IP地址,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2023-11-11
  • echarts報錯:Error?in?mounted?hook的解決方法

    echarts報錯:Error?in?mounted?hook的解決方法

    最近又遇到了寫echarts的時候常遇到的一個錯誤,這篇文章主要給大家介紹了關于echarts報錯:Error?in?mounted?hook:?“TypeError:?Cannot?read?properties?of?undefined?(reading?‘init‘)“的解決方法,需要的朋友可以參考下
    2022-07-07

最新評論