jquery.simple.tree插件,更简单,兼容性更好的无限树插件!

在这里介绍一款小巧,功能强大,能拖拽,支持异步,且兼容性更高的jquery Tree插件:

效果如下:

选择:

 

拖拽:

 

 

jquery.simple.tree.官网地址: http://news.kg/wp-content/uploads/tree/(貌似已经打不开),不过因为操作比较简单,所以我们暂且用之。

前面讲过jquery EasyUI Tree插件,简单易用,但经过测试仍有诸多缺点,

  例如:

  1、兼容IE8的AJAX有问题。

  2、如果异步返回数据较慢,将可能导致加载失败。

  3、我们只使用其中的Tree功能,但其体积实在有点庞大。...

而我们需要的是,兼容性好,异步,体积小(用Tree的场景实在比较少,所以还是专用的代码文件比较好。)

好了,我们开始jquery.simple.tree之旅:

首先,要加载文件,一共三个:CSS、Jquery主文件、还有其本身的js文件;

然后,是定义Tree的代码;

最后,写出这根树的根节点HTML代码;

前台代码如下:

html代码
<!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 runat="server">
    
<title>区域选择</title>
    
<link rel="stylesheet" href="/js/simpletree/jquery.simple.tree.css" />
    
<script type="text/javascript" src="/js/jquery1.4.2.min.js"></script>
    
<script type="text/javascript" src="/js/simpletree/jquery.simple.tree.js"></script>
    
<script type="text/javascript">
        
var simpleTreeCollection;
        $(document).ready(function(){
            simpleTreeCollection = $('.simpleTree').simpleTree({
                autoclose: true,
                afterClick:function(node){                   
                    alert("您选择了:" + $('span:first',node).text() + "id为:" + $('span:first',node).attr("id").substr(2));//此处为何要“.substr(2)”,是因为特殊原因,稍后可以得到解释.如果你仅仅需要取文字,这里可以不取ID。                
                },
                afterDblClick:function(node){
                    
//alert("text-"+$('span:first',node).text());//双击事件
                },
                afterMove:function(destination, source, pos){
                    
//alert("destination-"+destination.attr('id')+" source-"+source.attr('id')+" pos-"+pos);//拖拽事件
                },
                afterAjax:function()
                {
                    
//alert('Loaded');
                },
                animate:true
                
//,docToFolderConvert:true
            });
        });
    
</script>
</head>
<body>
<ul class="simpleTree">
    
<li class="root"><span>区域选择</span>
        
<ul>            
            
<li id="root0" class="open"><span>中国</span>
                
<ul class="ajax">
                    
<li id='0'>{url:/common/GetGroupHtmlByPid.ashx?pid=0}</li>
                
</ul>
            
</li>            
        
</ul>
    
</li>
</ul>
</body>
</html>

后台响应代码:

GetGroupHtmlByPid.ashx.cs
    public class GetGroupHtmlByPid : IHttpHandler
    {
        GroupManager group;
        
public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            
int parentId = -1;
            
int type = 0;
            
string resultStr = string.Empty;
            
if (!context.Request.QueryString["pid"].IsNullOrEmpty())
            {
                Int32.TryParse(context.Request.QueryString["pid"], out parentId);
            }
            
if (!context.Request.QueryString["type"].IsNullOrEmpty())
            {
                Int32.TryParse(context.Request.QueryString["type"], out type);
            }

            
if (parentId >= 0)
            {
                
try
                {
                    group = new GroupManager((GroupType)type);
                    var subAg = group.AllGroups.Where(c => c.ParentId == parentId);
                    resultStr += "<ul>";
                    
foreach (Base_group item in subAg)
                    {
                        resultStr += "<li id=\"" + item.GroupId + "\"><span id=\"1_" + item.GroupId + "\">" + item.GroupName + "</span>";//这里可以解释前台代码为何要.substr(2);
                        resultStr += "<ul class='ajax'><li>{url:/common/GetGroupHtmlByPid.ashx?pid=" + item.GroupId + "}</li></ul>";
                        resultStr += "</li>";
                    }
                    resultStr += "</ul>";
                }
                
catch (Exception ex)
                {                    
                }
            }
            context.Response.Write(resultStr);
        }

        
public bool IsReusable
        {
            
get
            {
                
return false;
            }
        }
    }

 

后台看起来有点别扭,因为这个插件本身只支持HTML节点加载的,不过网上有人进行扩展了,用了JSON,不过个人感觉这对速度影响实在微乎其微,还是直接封装出HTML代码的。

总结一下jquery.simple.tree插件的优缺点:

优点:体积小,兼容性高,可异步,支持拖拽。

缺点:如果初始化的时候就需要异步加载,则需要手动更改它的几行代码。例如我的例子中。

本插件还有一个特别的功能,支持拖拽,可以用于后台维护无限分类,非常方便,有待读者自己去发掘,希望本文能够抛砖引玉,对你有所帮助!

源插件下载地址:http://plugins.jquery.com/project/SimpleTree

我的修改后的下载地址:simpletree.rar

我只修改了2行代码,以便在第一次初始化时就加载异步的内容。

 

续----拖拽操作客户端及脚本:

请注意,拖拽操作,如果你要移动到某一位置,则应该看到该位置出现一根横向的线线才可以.

我们知道拖拽有了被拖拽的节点ID,及拖拽目的节点ID,拖拽操作会触发afterMove(destination, source, pos)这个事件,于是我们需要做两件事:

    一,创建一个input,以保存操作数,再写一个响应拖拽的函数;

    二,创建一个保存按钮,发送最后操作的结果到服务器端.

函数如下(为了方便看清楚,我把整段都搬来):

 

页面脚本
    <script type="text/javascript">
        
var simpleTreeCollection;
        $(document).ready(
function(){
            simpleTreeCollection 
= $('.simpleTree').simpleTree({
                autoclose: 
true,
                afterClick:
function(node){                   
                    alert(
"您选择了:" + $('span:first',node).text() + "id为:" + $('span:first',node).attr("id").substr(2));//此处为何要“.substr(2)”,是因为特殊原因,稍后可以得到解释.如果你仅仅需要取文字,这里可以不取ID。                
                },
                afterDblClick:
function(node){
                    
//alert("text-"+$('span:first',node).text());//双击事件
                },
                afterMove:
function(destination, source, pos){
                    moveNode(source.attr(
'id'),destination.attr('id'));//拖拽事件响应
                },
                afterAjax:
function()
                {
                    
//alert('Loaded');
                },
                animate:
true
                
//,docToFolderConvert:true
            });
        });
        
//响应函数
        function moveNode(sourceId,destId){
            
var recs = $("#moveRecs").val();
            
var strs = recs.match(eval("/\\|"+sourceId+",\\w+\\d+\\|/g"));
            
if(strs != null){//源id有过一次拖动,则删除之
                recs = recs.replace(strs,"|");
                $(
"#moveRecs").val(recs);
            }      
            $(
"#moveRecs").val($("#moveRecs").val() + sourceId + "," + destId + "|");//用栅栏把操作数隔开。
        }
    
</script>

 

 

在HTML页,我们加入两个控件,在页面结束后,绑定保存事件:

 

HTML片断
<body>
<ul class="simpleTree">
    ...........
</ul><input type="text" id="moveRecs" value="|" style="display:"/><input type="button" id="btnSaveActions" value="保存当前移动" />
</body>
</html>
<script language="javascript">
    $(
"#btnSaveActions").click(function(){
        $.get(
"/common/SaveMoveActions.aspx", {
                                
"actions":$('#moveRecs').val()
                                }, 
function (returnvalue){
                                
//返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等.                
                                    alert(returnvalue);
        });
    });
</script>

 

 

OK,客户端完成,接下来如何响应客户端请求,及如何做相关的数据处理操作,因为各人数据表及数据逻辑不尽相同,所以这里没有给出服务器端的操作代码。

posted @ 2010-09-02 10:44 活跃的毛虫 阅读(9211) 评论(29) 编辑 收藏

 回复 引用 查看   
#1楼 2010-09-02 11:02 超级奶崽      
不错啊
 回复 引用 查看   
#2楼[楼主] 2010-09-02 11:09 菜鸟毛      
引用超级奶崽:不错啊

是啊,小巧精干.容易上手啊.

 回复 引用 查看   
#3楼 2010-09-02 11:15 allentranks      
@超级奶崽
永州人吧?

 回复 引用 查看   
#4楼 2010-09-02 11:23 疯非子      
很实用
 回复 引用 查看   
#5楼 2010-09-02 12:18 oec2003      
收藏
 回复 引用 查看   
#6楼 2010-09-02 12:45 icjyw.com      
很好用
 回复 引用 查看   
#7楼 2010-09-02 13:13 q455923354      
后台看起来有点别扭,因为这个插件本身只支持HTML节点加载的,不过网上有人进行扩展了,用了JSON<strong><a href="http://www.uggbootsinde.com/">ugg stiefel</a></strong>不过个人感觉这对速度影响实在微乎其微,还是直接封装出HTML代码的。
 回复 引用 查看   
#8楼 2010-09-02 13:34 猫之良品      
我觉得用JSON会更好,这不是因为效率问题,是代码可以更明确。HTML总是会有机会修改的。
 回复 引用 查看   
#9楼 2010-09-02 13:50 vebest      
加入收藏

 回复 引用 查看   
#10楼 2010-09-02 14:15 飞阿飞      
谢谢,找这个好欠了!
 回复 引用 查看   
#11楼[楼主] 2010-09-02 15:07 菜鸟毛      
引用猫之良品:我觉得用JSON会更好,这不是因为效率问题,是代码可以更明确。HTML总是会有机会修改的。

如果是JSON,需要写个扩展的方法,难度也不是很大,园子里就能找到.在这里找到了,晕.http://www.javaeye.com/topic/249851

 回复 引用 查看   
#12楼 2010-09-02 15:24 front2010      
实际用easyui的tree插件也不错,单独使用的话大小也只有17K。只要将文件拷出来就行。同easyui的整个包一起使用但单独加载也行:
using('tree',function(){ // 单独加载TREE插件
$('#tt').tree(...);
});

 回复 引用 查看   
#13楼[楼主] 2010-09-02 15:29 菜鸟毛      
引用front2010:
实际用easyui的tree插件也不错,单独使用的话大小也只有17K。只要将文件拷出来就行。同easyui的整个包一起使用但单独加载也行:
using('tree',function(){ // 单独加载TREE插件
$('#tt').tree(...);
});

不过我测试了,兼容性不是太好,测试浏览器有IE6,7,8,FF,Chrome.
尤其是做异步返回的时候.有时成功,有时失败,跟踪程序发现,程序已经发送给客户端了,但有时候客户端就是不能成功显示.

 回复 引用 查看   
#14楼 2010-09-02 22:26 BillGan      
下载的JQUERY MIN 142 拖动出错!
 回复 引用 查看   
#15楼[楼主] 2010-09-03 08:42 菜鸟毛      
引用BillGan:下载的JQUERY MIN 142 拖动出错!

请问你用的什么浏览器.我测试用的Ie6,7,FF,Chrome,均能通过测试!

 回复 引用 查看   
#16楼 2010-09-03 09:16 braden      
好东西,多谢分享
 回复 引用 查看   
#17楼 2010-09-03 09:27 BillGan      
引用菜鸟毛:
引用BillGan:下载的JQUERY MIN 142 拖动出错!

请问你用的什么浏览器.我测试用的Ie6,7,FF,Chrome,均能通过测试!

我用的是IE8,你不是说JQUERY EASYUI TREE IE8兼容性不好嘛,这个SIMPLE的应该是兼容的吗?

 回复 引用 查看   
#18楼 2010-09-03 09:33 深海沉      
这个控件还不错,我对这个也做过扩展。
 回复 引用 查看   
#19楼 2010-09-03 10:49 海底咸鱼      
拖动节点以后,要保存新的树结构,这个实现也很重要
 回复 引用 查看   
#20楼[楼主] 2010-09-03 21:16 菜鸟毛      
引用BillGan:
引用菜鸟毛:
引用BillGan:下载的JQUERY MIN 142 拖动出错!

请问你用的什么浏览器.我测试用的Ie6,7,FF,Chrome,均能通过测试!

我用的是IE8,你不是说JQUERY EASYUI TREE IE8兼容性不好嘛,这个SIMPLE的应该是兼容的吗?

没错,IE8我也测试了,没有发现任何问题.

 回复 引用 查看   
#21楼[楼主] 2010-09-03 21:30 菜鸟毛      
引用海底咸鱼:拖动节点以后,要保存新的树结构,这个实现也很重要

我想,实现并不是太难,基本上思路是两种:
第一种是拖动后,立即向服务器发送保存请求.
第二种是把这些拖动记录下来,比如记录到某个input中,最后给个"保存"按钮,把这些拖动记录发送到服务器,当然,要是能在客户端做一些运算更好,例如,拖动了节点a,后来某次操作又拖动节点a,那么只记录最后一次操作,又或者,有两次操作是互逆的,如拖动节点a,之后又拖回来,这两步操作可以清除.

 回复 引用 查看   
#22楼 2010-09-04 10:29 front2010      
为什么大家都热衷于拖动,殊不知这种操作虽好,却很容易出错。为防止用户操作出现差错,以另一种修改方式代替也好。
 回复 引用 查看   
#23楼 2010-11-25 23:14 楠德一见      
我的问题是:当这个树很长,将滚动条移动到中间,然后点击最后的节点,就会出现点击的节点不对,滚动条自动跑到上边或是下边。我的是IE8
 回复 引用 查看   
#24楼 2011-03-29 22:49 万里沙来手一挥      
ZTree怎么样?
 回复 引用 查看   
#25楼 2011-04-13 13:14 DreamFly2011      
大哥,问一下啊,这个tree能实现查找节点吗?查找定位到节点...如果可以的话,大哥帮帮小弟的忙,不甚感激!
 回复 引用 查看   
#26楼[楼主] 2011-04-13 16:11 活跃的毛虫      
引用DreamFly2011:大哥,问一下啊,这个tree能实现查找节点吗?查找定位到节点...如果可以的话,大哥帮帮小弟的忙,不甚感激!

查找节点,是在本Tree中吗,应该可以,但前提是要已加载了的节点.
因为是异步加载.

 回复 引用 查看   
#27楼 2011-12-17 22:57 aspirant      
很好,这片文章对我帮助很大,我已经根据楼主的代码做出来了,谢谢楼主!~
 回复 引用 查看   
#28楼 2012-01-05 12:44 webglcn      
楼主有兴趣一起重新维护这个开源东西吗
 回复 引用 查看   
#29楼[楼主] 2012-01-06 11:32 活跃的毛虫      
@webglcn
可以啊,我已经有一些小的修改版本了,不过目前还仅限于自己用.

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1815742 Pja9c7DoFU8=