ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台。

在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比如自定义一个tree传入ztree, 不使用ztree的识别字段,而是使用自定义字段,然后当ztree的节点发生变化时,维护这些自定义字段,从而使得整个tree是有序的,并支持拖拽。

上边的这个解决方案,有一个问题,就是使用javascript构造的tree,传入ztree之后,会发生堆栈溢出,初步推测是ztree在实现过程中,针对这种传入的数据结构进行构造tree展示的时候,发生双向循环引用,而这时javascript最容易出现内存问题的情况。

经过分析,可以得出以下可用方案:

1.使用自定义tree,然后传入ztree,通过hash表解决双向引用。
2.自定义一个对象树,然后做一个转换过程,转换为ztree需要的简单数据结构,维护指针关系即可。
3.自定义一个对象树,然后对象树本身是不互相引用的,用一个函数对自定义树做排序,传入ztree, 维护时则只需要维护前后指针和上级指针。

后来在实现第三种方案时,发现一个重要的信息,就是ztree本身不严格区分上级节点和下级节点的顺序。发现这个信息之后,我们就可以对第三种方案做一个根本性优化,不用构造任何tree,只需要一个普通的一维数组,对其做相应的排序即可。

下图为思考草图,思考不仅在于"复杂问题简单化",更在体现于"复杂方案简单化".

所以对这个一维数组排序,要实现类似于链表排序的方法,要点 :

a.只对一个层级的节点排序。b.排序时,每次扫描只扫描准确节点(根据p->或n->)。c.排序方法参考冒泡排序(也可以递归),对这个排序过程还有优化空间。

对于这样一个解决问题的过程,想来想去还是有必要写一篇记录。对于以后大家遇到zTree的拖拽排序需求,也可以直接使用这个方案。

所以综上所述,通过对拖拽动作的记录(更新到服务端),页面加载的时候,从服务器端获取ztree的节点数据,调用这里实现好的ztree排序方法,即可实现ztree的排序功能。

开源代码地址:http://git.oschina.net/gavinhacker/ztree.linked.js

别忘了关注我的公众号,当然,前提是你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。

转载于:https://www.cnblogs.com/gavinsp/p/6566675.html

zTree的拖拽排序相关推荐

  1. html列表拖拽排序插件,可对列表自由拖拽排序的jQuery插件

    dragslot.js是一款可以对列表自由拖拽排序的jQuery插件.该插件主要的功能是实现了列表项可以在各个列表中相互拖拽. 对于像todo list, 分配任务列表都可以应用这个效果. 使用方法 ...

  2. EasyUI中放置Droppable的使用以及实现拖拽排序

    场景 效果 实现 webapp下新建droppable文件夹,在其下新建basic.html <!DOCTYPE html> <html lang="en"> ...

  3. vue可视化拖拽组件模板_基于 Vue 丝滑般拖拽排序组件VueSlicksort

    今天给大家分享一个功能超强的自由拖拽排序组件VueSlicksort. vue-slicksort 一款功能强大的可拖拽的vue.js组件.拥有丝滑般拖拽动画效果,支持水平/垂直/网格拖拽排序.还可以 ...

  4. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

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

    本文实例讲述了JS拖拽排序插件Sortable.js用法.分享给大家供大家参考,具体如下: 最近由于项目功能设计的原因,需要对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好 ...

  6. Android表格拖拽排序,Android 拖拽排序控件 DragGridView

    Android 拖拽排序控件 DragGridView Android 开发中,我们经常会遇到条目拖拽排序的需求,特别是在新闻类应用中就更普遍了.其实,我们在网上可以搜到许多关于拖拽排序的自定义控件, ...

  7. android gridview拖动排序,Asp.net GridView 拖拽排序    原创(欢迎拍砖,敬请嘴下留情!)...

    原理:客户端排序(或者说组织新的排序顺序),Ajax 更新服务器端数据. 客户端用jquery插件sortable实现拖拽排序,保存之前检索顺序变化了的数据,并组织成Json数据,用AJax传送到服务 ...

  8. element ui 图片控件 排序_vuedraggable+element ui实现页面控件拖拽排序效果

    项目要实现一些控件的拖拽排序.从而找到了这款vuedraggable控件,供大家参考,具体内容如下 如上图要实现这些控件的拖拽排序 这是拖拽后 由于公司网络的原因,项目没有使用npm,都是使用的引入的 ...

  9. html5长按 排序,H5 长按 拖拽排序的实现

    H5 长按拖拽排序 产品需求: H5页面的一个列表,需要长按之后 然后拖拽排序; vuedraggable是vue生态圈中一个知名的组件,也是vue.js项目中处理拖拽问题的不二法宝; 它基于Sort ...

最新文章

  1. mysql备份策略的制定
  2. 不能摸鱼的工作不是好工作?
  3. asp.net HC架构 在.netCore上的配置
  4. php音译汉字,PHP中的西里尔语音译
  5. Android WebView与js交互通信
  6. IIS6.0下配置HTTP Gzip压缩 提高iis相应速度
  7. python3.6安装包报错_win10安装python3.6的常见问题
  8. 安装epel源 失败:未知的名称或服务。 wget: 无法解析主机地址 “mirrors.aliyun.com”
  9. pl sql代码提示手动提示设置
  10. Java继承注意事项难点理解
  11. java selenium_关于selenium的介绍
  12. linux中realplayer.rpm格式的软件安装,Linux_Linux中realplayer播放器安装步骤,Linux操作系统在安全性能上远 - phpStudy...
  13. 板卡(单片机)与电脑PING不通的原因及解决方法
  14. MATLAB中plot函数的用法
  15. 解决拉取远程分支后出现.xcodeproj Couldn't load project的问题
  16. MSP430F149 微安级低功耗模式设置总结
  17. 计算机三级考点6:网络关键设备选型。
  18. 电脑上如何操作Android手机
  19. 函数的信息传递(C语言实践)
  20. 设计模式第10式:状态模式

热门文章

  1. 高效整洁CSS代码原则
  2. c#_将文件导入到工程目录下
  3. visual studio 工具箱(选项卡、无控件、灰图标)
  4. tkinter回调异常_Python tkinter文本修改后的回调
  5. oracle查询结果插入新表,如何将查询出来的数据记录插入新表??
  6. 单片机中存储器扩展位地址线怎么算_关于单片机外扩存储器的编址方法
  7. python excel 教程推荐_python对Excel按条件进行内容补充(推荐)
  8. vue 富文本存储_Vue富文本编辑器
  9. 家用电器用户行为分析与事件识别_用户行为分析埋点实时数仓实践
  10. Eclipse 3.5 Classic+Tomcat 6.0+MySql 5.5搭建java web开发环境