Jquery easyui treegrid实现树形表格的行拖拽
前几天修改了系统的一个功能——实现树形列列表的行拖拽,以达到排序的目的。现在基本上功能实现,现做一个简单的总结。
1.拿到这个直接网上搜,有好多,但是看了后都觉得不是太复杂就是些不是特别想看的例子,自己太懒(对自己不是很熟悉的东西是不愿意第一去看的)。结果选择良久,还是jquery easyui treegrid这个例子自己看起来比较熟悉。于是就专心研究了,从官方网站http://www.jeasyui.net/下载了demo,开始研读。先把jsp页面一些代码贴出
<link rel="stylesheet" type="text/css" href="../css/treegrid/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../css/treegrid/icon.css">
<link rel="stylesheet" type="text/css" href="../css/treegrid/treegrid.css">
<script type="text/javascript" src="../js/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="../js/jquery.easyui.min.js"></script>
<script type="text/javascript" src="../js/treegrid-dnd.js"></script>
<script type="text/javascript">
$(function(){
//初始化弹出对话框
$('#win').window('close');
$('#tt').treegrid({
// data:data,
url:'catalogListItem',
method:'post',
dataType:'json',
rownumbers: true,
singleSelect:true,
idField: 'id',
treeField: 'title',
animate:true,
columns:[[
{field:'id',title:'ckc',checkbox:true},
{field:'title',title:'分类名称',width:400,align:'left',editor:'text'},
{field:'sortid',title:'排序值',width:100,align:'left',editor:'text'},
{field:'creatorNick',title:'创建者',width:100},
{field:'createdTime',title:'创建时间',width:220},
{field:'operate',title:'操作',width:220,
formatter: function(value,row,index){
var html='';
html+='<a onclick="showedit(\'编辑\','+row.id+')" >编辑 </a> ';
//html+=value+'<a onclick="editrow('+row+')" >编辑 </a> <a id="cancel" onclick="cancel()"></a>';
if(row.level==0){
html+=' <a href="#" onclick="Confirm(\'确认删除这个分类及其子类\','+row.id+')">删除</a> ';
html+='<a href="#" onclick="showedit(\'新建\','+row.id+')">新建子节点</a> ';//默认只有二级节点
}
else
html+=' <a href="#" onclick="Confirm(\'确认删除这个记录\','+row.id+')">删除</a> ';
return html;
}
}
]],
onLoadSuccess: function(row){
//$(this).treegrid('enableDnd', row?row.id:null);
//上面的代码是demo中的,但是对于要保存更改到数据库显然走不通,需要向其他办法
//启用拖动排序
enableDnd($('#tt'));
}
});
});
//进入修改/添加 type:操作类型 id:编辑时,当前记录的id;添加时当前记录的id(添加第一级节点id要作特殊处理)
function showedit(type,id){
$("#form")[0].reset();
$('#win').window('open');
if(type=='编辑'){
$.ajax({
url:'catalogGet?id='+id,
type:'post',
dataType:'json',
cache:false,
success:function(data){
$("#title").val(data[0].title);
$("#sortid").val(data[0].sortid);
$("#id").val(id);
}
});
}
else
{
$("#parentId").val(id);
}
}
//保存
function save(){
var title= $("#title").val();
var sortid=$("#sortid").val();
var id=$("#id").val();
var parentId=$("#parentId").val();
$.ajax({
url:'catalogEdit',
data:{"title":title,"sortid":sortid,"id":id,"parentId":parentId},
type:'post',
dataType:'json',
success:
function(data)
{
if(data.result){
$('#win').window('close');
$('#tt').treegrid('reload');
}
else
alert(data.result);
}
});
}
//是否删除
function Confirm(msg,id) {
$.messager.confirm("确认", msg, function (r) {
if (r) {
//请求
$.ajax({url:'catalogDelete?id='+id,
type:'post',
dataType: 'json',
success://
function (data) {
if(data){
$('#tt').treegrid('reload');
}
else
alert("faile");
}
});
}
});
return false;
}
想到拖动的话,一定会用到jquery easyui 中draggable这个,但是这也不会写啊,看看demo按照那个写了一个,不合适,放弃了。想着着一定会有哪位这方面的前辈写好了,就各种百度和google,经过各种实验,找到一个就是上面 onLoadSuccess 里的 enableDnd($('#tt'));摘自一个论坛http://www.jeasyui.com/forum/index.php?topic=575.0
function enableDnd(t) {
var nodes = t.treegrid('getPanel').find('tr[node-id]');
nodes.find('span.tree-hit').bind('mousedown.treegrid', function() {
return false;
});
nodes.draggable({
disabled: false,
revert: true,
cursor: 'pointer',
proxy: function(source) {
var p = $('<div class="tree-node-proxy tree-dnd-no"></div>').appendTo('body');
p.html($(source).find('.tree-title').html());
p.hide();
return p;
},
deltaX: 15,
deltaY: 15,
onBeforeDrag: function() {
$(this).next('tr.treegrid-tr-tree').find('tr[node-id]').droppable({ accept: 'no-accept' });
},
onStartDrag: function() {
$(this).draggable('proxy').css({
left: -10000,
top: -10000
});
},
onDrag: function(e) {
$(this).draggable('proxy').show();
this.pageY = e.pageY;
},
onStopDrag: function() {
$(this).next('tr.treegrid-tr-tree').find('tr[node-id]').droppable({ accept: 'tr[node-id]' });
}
}).droppable({
accept: 'tr[node-id]',
onDragOver: function(e, source) {
var pageY = source.pageY;
var top = $(this).offset().top;
var bottom = top + $(this).outerHeight();
$(source).draggable('proxy').removeClass('tree-dnd-no').addClass('tree-dnd-yes');
$(this).removeClass('row-append row-top row-bottom');
if (pageY > top + (bottom - top) / 2) {
if (bottom - pageY < 5) {
$(this).addClass('row-bottom');
} else {
$(this).addClass('row-append');
}
} else {
if (pageY - top < 5) {
$(this).addClass('row-top');
} else {
$(this).addClass('row-append');
}
}
},
onDragLeave: function(e, source) {
$(source).draggable('proxy').removeClass('tree-dnd-yes').addClass('tree-dnd-no');
$(this).removeClass('row-append row-top row-bottom');
},
onDrop: function(e, source) {
var action, point;
if ($(this).hasClass('row-append')) {
action = 'append';
} else {
action = 'insert';
point = $(this).hasClass('row-top') ? 'top' : 'bottom';
}
$(this).removeClass('row-append row-top row-bottom');
// alert(action + ":" + point);
// your logic code here
// do append or insert action and reload the treegrid data
//==================================
//做自己的逻辑处理
var src = $('#tt').treegrid('find', $(source).attr('node-id'));
var dest = $('#tt').treegrid('find', $(this).attr('node-id'));
// alert(src.title+","+dest.title);
$.ajax({
url: 'updateCatalogList',
dataType: 'json',
type:'post',
data: {
"srcId": src.id,
"destId": dest.id
},
success:function(data){
if(data.result)
{
$('#tt').treegrid('reload'); //重新加载treegrid
}
}
});
//====================
}
});
}
写入自己的程序,完全可以,拖动的效果有了,拖动的处理时间自己写“//============”之间的就是逻辑代码,具体就是向后台传送拖拽节点的标识信息(一般是id)和拖拽的目标节点的标识信息,即srcId和destId后台在做处理。
<div id="win" title="新建/编辑分类" class="easyui-window" style="width:300px;height:180px;">
<form id="form" style="padding:10px 20px 10px 40px;">
<p>分类名称: <input id="title" name="title" type="text"></p>
<p>排序值: <input id="sortid" name="sortid" type="text"></p>
<input id="id" name="id" type="hidden">
<input id="parentId" name="parentId" type="hidden">
<div style="padding:5px;text-align:center;">
<a href="#" class="easyui-linkbutton" icon="icon-ok" onclick="save()">确定</a>
<a href="#" class="easyui-linkbutton" icon="icon-cancel" onclick="javascript: $('#win').window('close');">取消</a>
</div>
<input id="id" name="id" type="hidden">
</form>
</div>
<table id="tt" class="easyui-treegrid" cellpadding="0" cellspacing="0" border="0" style="width100%;height:450px"></table>
接下来看一下数据源,我的数据源用的json格式,也是demo的给的样例格式。如下:
var data=[{
"id":1,
"name":"C",
"size":"",
"date":"02/19/2010",
"children":[{
"id":2,
"name":"Program Files",
"size":"120 MB",
"date":"03/20/2010",
"children":[{
"id":21,
"name":"Java",
"size":"",
"date":"01/13/2010",
"state":"closed",
"children":[{
"id":211,
"name":"java.exe",
"size":"142 KB",
"date":"01/13/2010"
},{
"id":212,
"name":"jawt.dll",
"size":"5 KB",
"date":"01/13/2010"
}]
},{
"id":22,
"name":"MySQL",
"size":"",
"date":"01/13/2010",
"state":"closed",
"children":[{
"id":221,
"name":"my.ini",
"size":"10 KB",
"date":"02/26/2009"
},{
"id":222,
"name":"my-huge.ini",
"size":"5 KB",
"date":"02/26/2009"
},{
"id":223,
"name":"my-large.ini",
"size":"5 KB",
"date":"02/26/2009"
}]
}]
},{
"id":3,
"name":"eclipse",
"size":"",
"date":"01/20/2010",
"children":[{
"id":31,
"name":"eclipse.exe",
"size":"56 KB",
"date":"05/19/2009"
},{
"id":32,
"name":"eclipse.ini",
"size":"1 KB",
"date":"04/20/2010"
},{
"id":33,
"name":"notice.html",
"size":"7 KB",
"date":"03/17/2005"
}]
}]
}];
这就有一点需要注意你传过来的每条数据对象需要有对应的属性(children和state),state属性控制节点的关闭状态。因为只是照猫画虎,也没多想,我就直接把后台的所有数据直接一次性封装好,送给前台了。
注意:1.这在数据量极大地情况下是很低效的。一种思路就是异步加载子节点。
2.每次加载排序效果的好坏,还与系统定义的排序方式有关。
最后,虽简单的实现了功能,但是还有待改进。像 enableDnd($('#tt'));这个函数的东西,自己能看懂,但是还是自己写的少,以至于需要引用他人的。以后要多多加强一下。
Jquery easyui treegrid实现树形表格的行拖拽的更多相关文章
- jQuery EasyUI/TopJUI创建树形表格下拉框
jQuery EasyUI/TopJUI创建树形表格下拉框 第一种方法(纯HTML创建) <div class="topjui-row"> <div class= ...
- JQuery Easyui/TopJUI 基本树形表格的创建
<table data-toggle="topjui-treegrid" data-options="id:'menuTg', idField:'id', tree ...
- 第二百二十五节,jQuery EasyUI,PropertyGird(属性表格)组件
jQuery EasyUI,PropertyGird(属性表格)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 PropertyGird(属性表格)组件的 ...
- 第二百二十二节,jQuery EasyUI,DataGrid(数据表格)组件
jQuery EasyUI,DataGrid(数据表格)组件 学习要点: 1.加载方式 2.分页功能 本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于 Pa ...
- 第二百二十四节,jQuery EasyUI,ComboGrid(数据表格下拉框)组件
jQuery EasyUI,ComboGrid(数据表格下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 ComboGrid(数据表格下拉框)组件的 ...
- jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!)
jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!) 废话不多说,直接贴上代码 <table id="configEdatagrid&q ...
- JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)
前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...
- jqGrid之treeGrid及行拖拽
单纯的做个小记录 今天做功能用到了jqGrid里面的treeGrid,遇到几个问题,这里做下记录 treeGrid 树表格的应用在官网给出了很直白的例子: 1.http://blog.mn886.ne ...
- element ui + sortablejs实现表格的行列拖拽
<template> <div class="container"> <el-table :data="tableData" bo ...
随机推荐
- Git版本控制使用介绍
Git是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git与SVN的最主要的区别? Git是分布式的,SVN不是 Git没有一个全局的版本号,而SVN有 ...
- JAVA并行框架学习之ForkJoin
当硬件处理能力不能按照摩尔定律垂直发展的时候,选择了水平发展,多核处理器已经广泛应用.未来随着技术的进一步发展,可能出现成百上千个处理核心,但现有的程序运行在多核心处理器上并不能得到较大性能的提升,主 ...
- 通过移动的Mas接口发送短信
1. 首先,需要移动公司提供的用户名.密码.服务ID.接口Url等信息. 2. 将短信信息整理成XML格式的字符串,再转为byte数组,通过POST的方式,将短信发往Mas接口.需要引用"M ...
- Android handler Thread 修改UI Demo
/********************************************************************** * Android handler Thread 修改U ...
- ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问
环境: 192.168.2.10 192.168.2.11 实现:2.10 ssh无需密码登录到2.11 在2.10 ssh到2.11机器上,需要密码,这样对一些脚本工作不方便,因为需要密码,也就是需 ...
- BingWallpaper
桌面壁纸更换成Bing.com的每日图片 项目地址:https://github.com/atskyline/BingWallpaper 其实就只是一个脚本,只是觉得二进制文件使用比较方便,所以采用C ...
- PowerShell:Linux程序员喜欢的cmd增强版
Linux程序员有时偶尔使用Windows下的cmd工具,会被逼疯的,有些命令ls, cat, ps等已经条件反射一样使用. 但在cmd下,根本不知道该用什么命令,好在盖兹大叔照顾了此部分需求.从Vi ...
- opencv 在工业中的应用:圆孔定位
在工业中产品或者夹具上经常有圆形孔,我们可以利用这些孔来对产品或者夹具进行定位.我用OPENCV写了个DEMO 程序,介绍如下: (1)首先点击打开图像按钮打开一幅图像 (2)进行一些参数设置 (3) ...
- vs2013 报错AccessViolationException 解决方案
最近 用vs2013 vs2010开发一个web 项目的时候 报AccessViolationException 异常 ,找不到原因 后边网上看了解决方法,试了一下 解决了,具体什么原因搞不清. 下 ...
- 【原】Redis事务管理
Redis高级篇 事务 MULTI, EXEC, DISCARD and WATCH命令用于保证Redis中的事务处理 一个事务中的所有命令被序列化并串行执行. 事务的原子性. 用法 MULTI ...