html列表拖拽排序插件,JS拖拽排序插件Sortable.js用法实例分析

本文实例讲述了JS拖拽排序插件Sortable.js用法。分享给大家供大家参考,具体如下:

最近由于项目功能设计的原因,需要对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好的满足这个需求,而且它还是开源的,于是乎就开始学习使用Sortable.js,再然后就有了这篇文章。

特点:

轻量级但功能强大

移动列表项时有动画

支持触屏设备和大多数浏览器(IE9及以下除外)

支持单个列表容器内部拖拽排序,也支持两个列表容器互相拖拽排序

支持拖放操作和可选择的文本

非常友善的滚动效果

基于原生HTML5中的拖放API

支持多种框架(Angular、Vue、React等)

支持所有的CSS框架,如:Bootstrap

简单的API,方便调用

CDN

不依赖于jQuery

运行效果如下图所示:

c3a9005142b1c30abee4496f7afda1b9.png

单个列表容器内部拖拽排序

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

}

}

});

});

li{

cursor:pointer;

padding-bottom:5px;

list-style:none;

}

  • --请选择--

    objective

    proposition

  • --请选择--

    eliminate

    alige

  • --请选择--

    optimize

    deploy

两个列表容器相互拖拽排序

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

}

}

});

});

  • --请选择--

    objective

    proposition

  • --请选择--

    eliminate

    alige

  • --请选择--

    optimize

    deploy


  • --请选择--

    目标任务

    论题议题

  • --请选择--

    消除排除

    机敏的敏捷的

  • --请选择--

    优化使最优化

    发布部署

常见配置项及事件

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:这里再为大家推荐一款关于排序的演示工具供大家参考:

希望本文所述对大家JavaScript程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛课课通VS中学生计算机,数学奥赛VS信息学奥赛 孩子们该如何选择

同是奥赛,为什么越来越多的孩子选了信息学?今年3月&#xff0c;教育部正式发布通知&#xff1a;全面取消中学奥赛等5项全国性高考加分项目。这个消息对很多有志于让孩子“走捷径”的家长而言&#xff0c;可谓晴空霹雳&#xff0c;升学道路上突然没了“加分”可怎么办&#xff…

阿尔伯塔大学2019计算机科学 cs,[阿尔伯塔大学]计算机/计算机工程专业

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼阿尔伯塔大学的的电子与计算机工程专业(ECE)一直以来在加拿大各顶尖学校中名列前茅&#xff0c;其拥有诸多先进的设施(高端前沿的实验室设备、专门的实习场地以及极具特色的6500平方英尺的纳米和微型加工设施等)&#xff0c;国际知…

方正计算机软件保护进超级用户,超级用户权限补丁(SuperSU Pro)含刷机包

SuperSU权限管理是一款对已获取ROOT权限的Android手机进行第三方应用程序的权限管理的应用工具&#xff0c;神器作者最新作品&#xff0c;比Superuser功能更加强大&#xff0c;界面更加美观。注意&#xff1a;此软件需要手机已获取ROOT权限后才能正常运行&#xff01;超级用户权…

理解计算机网络的拓扑结构,认识计算机网络拓扑结构

计算机网络拓扑(Computer Network Topology)是指由计算机组成的网络之间设备的分布情况以及连接状态.把它两画在图上就成了拓扑图.一般在图上要标明设备所处的位置,设备的名称类型,以及设备间的连接介质类型.它分为物理拓扑和逻辑拓扑两种。下面是学习啦小编跟大家分享的是认识…

18计算机汽修英语期末试卷,英语语法期末考试试卷(a)

(2009至2010学年第2学期)课程名称&#xff1a;英语语法考试时间&#xff1a;110分钟课程代码&#xff1a;5112470试卷总分&#xff1a;100分考试形式&#xff1a;闭卷学生自带普通计算机器:PartIVocabularyandStructure(15%)Direction:Inthispart,thereare30incompletesentence…

通信与计算机技术的联系,通信技术与计算机技术融合发展论文

通信技术与计算机技术融合发展论文摘要&#xff1a;通信技术和计算机技术是现代数据传输与处理中所使用的两种核心技术,对数据传输方式与处理方式具有莫大的推动作用。文章从两种技术的融合点出发对现代计算机通信技术的定义、特点、功能、应用领域、应用优势以及发展前景进行了…

微软故障转移群集服务器要求,故障转移群集概述

故障转移群集概述08/03/2016本文内容适用对象&#xff1a;Windows Server 2012 R2, Windows Server 2012本主题提供对 Windows Server 2012 R2 和 Windows Server 2012 中故障转移群集功能的概述。 故障转移群集为许多服务器工作负荷提供高可用性和可伸缩性。 其中包括服务器应…

马踏过河卒

1000ms 131072KAA 点有一个过河卒&#xff0c;需要走到目标 BB 点。卒行走规则&#xff1a;可以向下、或者向右。同时在棋盘上的任一点有一个对方的马&#xff08;如上图的 CC 点&#xff09;&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 CC 点…

墙壁涂色

蒜头君觉得白色的墙面好单调&#xff0c;他决定给房间的墙面涂上颜色。他买了 3 种颜料分别是红、黄、蓝&#xff0c;然后把房间的墙壁竖直地划分成 n 个部分&#xff0c;蒜头希望每个相邻的部分颜色不能相同。他想知道一共有多少种给房间上色的方案。 例如&#xff0c;当 n …

小学生测验

关于这段代码&#xff1a; 数据存放在一个叫data的文件中增加了结构体排序&#xff0c;对小学生们的成绩排名其他要求如同题干大一时写的版本&#xff0c;没文件读写&#xff0c;大三时写的在下面。 项目一 小学生测验 16学时 问题描述&#xff1a;面向小学1~2年级学…

KMP算法 串模式识别 用nextval[j]改进next[j]

用nextval[]改进next[] 还有&#xff0c;代码真美&#xff0c;看了好久 #include<stdio.h> #define MAXSIZE 100 #include<iostream> using namespace std;typedef struct {char data[MAXSIZE];int length; }SqString;void StrAssign(SqString &s,char cstr[]…

win10台式机一根网线连接笔记本wifi网络

我的笔记本和台式机都是win10&#xff0c;笔记本通过家里的路由器连的无线网&#xff0c;台式机没法连接无线&#xff0c;还有一条网线 笔记本打开网络适配器 右键属性 勾选共享里面的 允许其他网络用户通过此计算机的internet连接来连接 家庭网络选择笔记本和台式机之间的局…

蓝桥杯单片机DS18B20代码注释及部分时序图

蓝桥杯单片机蓝桥杯单片机DS18B20代码注释及部分时序图 #include<STC15F2K60S2.H> #include<intrins.h>#define uchar unsigned char #define uint unsigned int sbit DQP1^4;uchar code tab[]{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF}; u…

蓝桥杯单片机stc15f2k60s2 中断函数代码模板注释

用到哪些寄存器&#xff1f; 中断使能寄存器// EA1&#xff08;总使能开&#xff09;&#xff0c;ET01&#xff08;T0中断允许&#xff09; 定时器/计数器控制寄存器TCON// TH0和TL0设定值确定时间间隔&#…

redhat下的iptables和firewalld 笔记

iptables命令怎么用&#xff1f; 网上看见的一个不错的图。 使用iptables命令配置的防火墙规则默认会在系统下一次重启时失效&#xff0c;如果想让配置的防火墙策略永久生效&#xff0c;还要执行保存命令&#xff1a; service iptables save 怎么理解firewalld&#xff1f; …

redhat挂载镜像软件包

挂载&#xff08;mounting&#xff09;是指由操作系统使一个存储设备&#xff08;诸如硬盘、CD-ROM或共享资源&#xff09;上的计算机文件和目录可供用户通过计算机的文件系统访问的一个过程。 本质&#xff1a;针对某一设备, 分析出其文件系统结构, 并根据其文件系统类型调用…

chcon和semanage fcontext的坑

chcon后不能restorecon,不然就default_t:s0&#xff0c;samba_share_t没了 chcon semanage fcontext restorecon

Windows底层窗口的实现———学习笔记

基本概念 SDK 软件开发工具包&#xff08;Software Development Kit&#xff09;&#xff0c;一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 API Windows操作系统提供给应用程序编程的接口&#xff08;Appl…

数据链路层差错检验循环冗余码过程图示

计算机网络数据链路层差错检验循环冗余码过程

如何把项目改成微服务项目_【日记】148微服务项目第18天

没有人天生就强、就弱或意志坚定。是后来才变强&#xff0c;后来才意志坚定。命运不在人身上&#xff0c;而在人四周。01一句话日记2020/9/702Day148每日总结关于图片上传&#xff0c;这个太常见了朋友圈&#xff0c;微头条都涉及到图片的上传以前我们也编写过对应的demo-当前项…