如何用js让表格的行也能拖动

JavaScript012

如何用js让表格的行也能拖动,第1张

<!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>

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