vue 中使用 sortable.js 拖动表格

JavaScript014

vue 中使用 sortable.js 拖动表格,第1张

sortable.js 官网

拖放排序插件Sortable.js中文介绍

1. 安装 npm 或 yarn 安装

2. 使用

效果:

3. 小结

事件:

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中第一个参数所对应的值,有第二个参数时,将重新赋给第一个参数所对应的值;

toArray()

序列化可排序的列表单元的data-id(可通过配置项中dataIdAttr修改)放入一个数组,并返回这个数组中

sort()

通过自定义列表单元的data-id的数组对列表单元进行排序

save()

destroy()

是一个两年前的项目了。 最近增加一个新的模块,做音频和视频的通道。 为了做音视频的素材的替换,做的拖曳: 实现两个列数据不同的表格之间的行数据的替换,以及行的增加。 由于当初项目是基于jquery的,所以一下内容也是基于jquery的,但是思想和方法是通用的,需要的小伙伴,如果你的项目是基于vue的也可以看下思路。 也许会找到方法解决你现在的需求。

如上的两个表格,我要实现的就是把右边表格的表格行拖曳到左边,但是左边的不可拖曳到右边; 且拖曳到右边表格的空白行的时候,就是添加; 如果是覆盖在表格行上,就是替换数据

给 两个表格的tbody 分别赋予id ; 以上的#fileGetTableTbody 是右边的表格tbody的id,#trueFileTableDataTbody是左边的。

group1 和 group2 中的各个参数与方法 其他的都不多说了(可以去看sortable.js的文档,非常的清晰)

我只说一下两个group的参数,首先,name属性值必须设置一致(组名); 然后是pull ,我这边采用clone的方式去拖曳,put:是可放置,group2是左边被放置的表格所以put设置为true

在group1中的onMove方法中,设置evt.dragged.innerHTML = '' 把拖曳的元素的内容置空;即能解决以上问题,而且还会隐藏插件默认的放置位置中元素内容的显示。

给tbody增加一个tr ,这个 tr的高度,利用table的高度 - tbody的高度, 去动态设置。 写成下图所示的功能函数,在每次删除行,增加行的时候都执行一次,这样动态的利用 tr 去填充tbody剩余的空间,使得放置永远有效。 但是一定要记得,给tr中放置td, 否则不起作用

丢失了,就把他找回来! 方法就在group1的onMove方法和onEnd中,利用onEnd方法中的to字段判断当前放置的目标容器是什么,如果是自己本身,就把之前在onMove中存储的tr的子数据,赋值给 tr,这样就解决了。

if(tr_length >evt.newIndex &&tr_length !== 0 &&class_have == false) , 你们可根据自己需求做调整;

所有的替换方法都在group2的onAdd中,由于我这边替换的时候,要求信号格式相符,以及音频默认信号格式,所以我多了很多判断。 但是我目前需要替换的数据只有素材名称和素材地址; 你们可仿照条件进行判断。

以上全部,有些复杂,但是对于不同表格的表格行之间的拖曳,增加行,替换行数据,还是能实现的。

如果有更好的方法,请留言,谢谢!

<!doctype html>

<html>

<head>

<title>表格行拖动</title>

<script>

window.onload = function(){

//绑定事件

var addEvent = document.addEventListener ? function(el,type,callback){

el.addEventListener( type, callback, !1 )

} : function(el,type,callback){

el.attachEvent( "on" + type, callback )

}

//移除事件

var removeEvent = document.removeEventListener ? function(el,type,callback){

el.removeEventListener( type, callback )

} : function(el,type,callback){

el.detachEvent( "on" + type, callback)

}

//精确获取样式

var getStyle = document.defaultView ? function(el,style){

return document.defaultView.getComputedStyle(el, null).getPropertyValue(style)

} : function(el,style){

style = style.replace(/\-(\w)/g, function($, $1){

return $1.toUpperCase()

})

return el.currentStyle[style]

}

var dragManager = {

clientY:0,

draging:function(e){//mousemove时拖动行

var dragObj = dragManager.dragObj

if(dragObj){

e = e || event

if(window.getSelection){//w3c

window.getSelection().removeAllRanges()

}else if(document.selection){

document.selection.empty()//IE

}

var y = e.clientY

var down = y >dragManager.clientY//是否向下移动

var tr = document.elementFromPoint(e.clientX,e.clientY)

if(tr &&tr.nodeName == "TD"){

tr = tr.parentNode

dragManager.clientY = y

if( dragObj !== tr){

tr.parentNode.insertBefore(dragObj, (down ? tr.nextSibling : tr))

}

}

}

},

dragStart:function(e){

e = e || event

var target = e.target || e.srcElement

if(target.nodeName === "TD"){

target = target.parentNode

dragManager.dragObj = target

if(!target.getAttribute("data-background")){

var background = getStyle(target,"background-color")

target.setAttribute("data-background",background)

}

//显示为可移动的状态

target.style.backgroundColor = "#ccc"

target.style.cursor = "move"

dragManager.clientY = e.clientY

addEvent(document,"mousemove",dragManager.draging)

addEvent(document,"mouseup",dragManager.dragEnd)

}

},

dragEnd:function(e){

var dragObj = dragManager.dragObj

if (dragObj) {

e = e || event

var target = e.target || e.srcElement

if(target.nodeName === "TD"){

target = target.parentNode

dragObj.style.backgroundColor = dragObj.getAttribute("data-background")

dragObj.style.cursor = "default"

dragManager.dragObj = null

removeEvent(document,"mousemove",dragManager.draging)

removeEvent(document,"mouseup",dragManager.dragEnd)

}

}

},

main:function(el){

addEvent(el,"mousedown",dragManager.dragStart)

}

}

var el = document.getElementById("table")

dragManager.main(el)

}

</script>

<style>

.table{

width:60%

border: 1px solid red

border-collapse: collapse

}

.table td{

border: 1px solid red

height: 20px

}

</style>

</head>

<body>

<h1>表格行拖动</h1>

<table id="table" class="table">

<tbody>

<tr>

<td>1</td>

<td>One</td>

<td>dom.require</td>

</tr>

<tr id="2" >

<td class="2">2</td>

<td>Two</td>

<td>ControlJS </td>

</tr>

<tr id="3" >

<td class="3">3</td>

<td>Three</td>

<td>HeadJS</td>

</tr>

<tr id="4" >

<td class="4">4</td>

<td>Four</td>

<td>LAB.js</td>

</tr>

<tr id="5" >

<td class="5">5</td>

<td>Five</td>

<td>$script.js</td>

</tr>

<tr id="6" >

<td class="6">6</td>

<td>Six</td>

<td>NBL.js</td>

</tr>

</tbody>

</table>

</body>

</html>