onAdd onRemove 没有触发说明当列表中的拖拽数据有增加和减少的时候才会发生该事件, 当然如果有兴趣的朋友可以看看他生事件的顺序和条件。
还有传递一个evt参数,我们看看该参数有些什么东西。主要看_dispatchEvent 这个函数 改函数的功能是:创建一个事件,事件参数主要由name 提供,并且触发该事件,其实就是模拟事件并且触发该事件。
看看改函数的关键源码
var evt = document.createEvent('Event'), //创建一个事件 options = (sortable || rootEl[expando]).options, //获取options 参数 //name.charAt(0) 获取name的第一个字符串 //toUpperCase() 变成大写 //name.substr(1) 提取从索引为1下标到字符串的结束位置的字符串 //onName 将获得 on+首个字母大写+name从第一个下标获取到的字符串 onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); evt.initEvent(name, true, true); //自定义一个事件 evt.to = rootEl; //在触发该事件发生evt的时候,将evt添加多一个to属性,值为rootEl evt.from = fromEl || rootEl; //在触发该事件发生evt的时候,将evt添加多一个to属性,值为rootEl evt.item = targetEl || rootEl; //在触发该事件发生evt的时候,将evt添加多一个to属性,值为rootEl evt.clone = cloneEl; //在触发该事件发生evt的时候,将evt添加多一个to属性,值为rootEl evt.oldIndex = startIndex; //开始拖拽节点 evt.newIndex = newIndex; //现在节点 //触发该事件,并且是在rootEl 节点上面 。触发事件接口就这这里了。onAdd: onUpdate: onRemove:onStart:onSort:onEnd:
接下来事件有了, 我们怎么做排序呢?其实很简单,只要我们做排序的列表中加一个drag-id就可以,然后在拖拽过程中有几个事件onAdd, onUpdate,onRemove,onStart,onSort,onEnd,然后我们不需要关心这么多事件,我们也不需要关心中间拖拽发生了什么事情。然后我们关心的是当拖拽结束之后我们只要调用onEnd事件就可以了 然后改接口会提供 evt。 evt中可以有一个from就是拖列表的根节点,只要获取到改节点下面的字节的就可以获取到排序id。请看dome
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <link href="https://www.jb51.net/app.css" type="text/css"/> <script src="https://www.jb51.net/Sortable.js"></script> <body> <ul> <li drag-id="1">1</li> <li drag-id="2">2</li> <li drag-id="3">3</li> <li drag-id="4">4</li> <li drag-id="5">5</li> <li drag-id="6">6</li> <li drag-id="7">7</li> <li drag-id="8">8</li> </ul> <script> Sortable.create(document.getElementById('foo'), { animation: 150, //动画参数 onAdd: function (evt){ //拖拽时候添加有新的节点的时候发生该事件 console.log('onAdd.foo:', [evt.item, evt.from]); }, onUpdate: function (evt){ //拖拽更新节点位置发生该事件 console.log('onUpdate.foo:', [evt.item, evt.from]); }, onRemove: function (evt){ //删除拖拽节点的时候促发该事件 console.log('onRemove.foo:', [evt.item, evt.from]); }, onStart:function(evt){ //开始拖拽出发该函数 console.log('onStart.foo:', [evt.item, evt.from]); }, onSort:function(evt){ //发生排序发生该事件 console.log('onSort.foo:', [evt.item, evt.from]); }, onEnd: function(evt){ //拖拽完毕之后发生该事件 console.log('onEnd.foo:', [evt.item, evt.from]); var id_arr='' for(var i=0, len=evt.from.children.length; i<len; i++){ id_arr+=','+ evt.from.children[i].getAttribute('drag-id'); } id_arr=id_arr.substr(1); //然后请求后台ajax 这样就完成了拖拽排序 console.log(id_arr); } }); </script> </body> </html>
该插件还提供了多列表拖拽。下面dome是 从a列表拖拽到b列表,b列表拖拽到a列表 两个俩表互相拖拽,然后主要参数是 group
如果group不是对象则变成对象,并且group对象的name就等于改group的值 并且添加多['pull', 'put'] 属性默认值是true
如果设置