浅析jQuery EasyUI中的tree使用指南


Posted in Javascript onDecember 18, 2014

本文记录的是带领成员开发一个小模块功能的时候,需要用到弹出窗口加载树状级联单位选择,最后决定用采用jQuery+EasyUI插件进行开发。但是在使用EasyUI中tree的插件时,碰到了不少麻烦。为了提供弹出树的显示速度,就采用异步加载数节点值,首先先加载根节点,然后根据点击的节点展开加载子节点。

往往结果和预期的都不一样,困惑了几天,展开后子节点是动态加载了,但是收缩后无法清空之前填充的数据;第二次在展开时,子节点又被重复加载了一遍,造成了数据重复显示,并没有提供清除子节点的方法。想尽了各种办法来解决这个问题,只能换另一种形式加载子节点的值了,把每一个节点值保存起来,判断是否已经存在,存在就不在去加载。

两种方法见实例:

var treeTitle = '选择列表';

var treeUrl = '../DataAshx/getTreeNode.ashx?pid=-1';

var nodeExp=false;

var nodekeep="";

var rows;

var noinf=0;

$(function() {

    $('#treewindow').window({

        title: treeTitle,

        width: 400,

        height: 400,

        modal: true,

        shadow: false,

        closed: true,

        resizable: false,

        maximizable: false,

        minimizable: false,

        collapsible: false

    });

});

function treeWindowOpen(name,rowIndx) {

    $('#treewindow').window('open');

    nodekeep="";

    nodeExp=false;

    rows=rowIndx.toString();

    $('#basetree').tree({

        checkbox: true,

        animate: true,

        url: treeUrl+"&coln="+escape(name.toString()),

        cascadeCheck: true,

        onlyLeafCheck: false,

        onBeforeExpand: function(node, param) {

//------------第一种方法:异步加载子节点值-------------

//            $('#basetree').tree('options').url = "../DataAshx/getTreeNode.ashx?pid=" + node.id+"&coln="+escape(name.toString());

//------------第二种方法:Ajax方法返回子节点Json值,使用append方法加载子节点       

        $.ajax({

                type: "POST",

                url: "../DataAshx/getTreeNode.ashx?pid=" + node.id+"&coln="+escape(name.toString())+"&casn="+escape(node.attributes.cas.toString()),

                cache: false,

                async: false,

                dataType: "json",

                success: function(data) {

                    if(nodekeep.indexOf(node.id)==-1)

                    {

                     append(data, node);

                     nodeExp = true;

                    }

                }

            });

            $("#radCollapse").removeAttr("checked");

        },

        onLoadError:function(Error)

        {

            $.messager.alert('提示', '查询语句出错', 'error');

            if(nodeExp==false)

            {

                $("#basetree").children().remove();

            }

        },

        onLoadSuccess:function(success)

        {

            var child=$("#basetree").children().length;

            noinf++;

            if(child==0&&noinf>1)

            {

                $.messager.alert('提示', '数据不存在', 'Info');

            }

        }

    });

}

function treeWindowClose() {

    $('#treewindow').window('close');

    nodekeep="";

    nodekeep=false;

}

function treeWindowSubmit() {

    var nodes = $('#basetree').tree('getChecked');

    var info = '';

    if (nodes.length > 0) {

        for (var i = 0; i < nodes.length; i++) {

            if (info != '') { info += ','; }

            info += nodes[i].text;

        }

        //alert(JSON.stringify(nodes));

    }

    else {

        var node = $('#basetree').tree('getSelected');

        if (node != null) {

            info = node.text;                

        }

    }

    $("#"+rows).val(info);

    $('#treewindow').window('close');

    nodekeep="";

    nodeExp=false;

}

//全部展开

function collapseAll() {

    $("#radCollapse").attr("checked", "checked");

    var node = $('#basetree').tree('getSelected');

    if (node) {

        $('#basetree').tree('collapseAll', node.target);

    } else {

        $('#basetree').tree('collapseAll');

    }

}

//全部收缩

function expandAll() {

    var node = $('#basetree').tree('getSelected');

    if (node) {

        $('#basetree').tree('expandAll', node.target);

    } else {

        $('#basetree').tree('expandAll');

    }

}

//增加子节点

function append(datas,cnode) {

    var node = cnode;

    $('#basetree').tree('append', {

        parent: node.target,

        data: datas

    });

    nodekeep+=","+node.id;

}

//重新加载

function reload() {

    var node = $('#basetree').tree('getSelected');

    if (node) {

        $('#basetree').tree('reload', node.target);

    } else {

        $('#basetree').tree('reload');

    }

}

//删除子节点

function remove() {

    var node = $('#basetree').tree('getSelected');

    $('#basetree').tree('remove',node.target);

}

页面getTreeNode.ashx返回树节点JSON格式数据:

<%@ WebHandler Language="C#" Class="getTreeNode" %>

using System;

using System.Collections;

using System.Data;

using System.Linq;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Xml.Linq;

using System.Collections.Generic;
public class getTreeNode : IHttpHandler, System.Web.SessionState.IRequiresSessionState

{

    public void ProcessRequest(HttpContext context)

    {

        context.Response.ContentType = "text/plain";

        DataTable dt = (DataTable)context.Session["viewmaintain"];

        string parentId = string.Empty;

        string resultStr = string.Empty;

        string attributes = string.Empty;

        string colName = string.Empty;

        string sql = string.Empty;

        string Casname = string.Empty;

        bool colt = false;

        string icon = "icon-profile";

        if (!string.IsNullOrEmpty(context.Request.QueryString["pid"]))

        {

            parentId = context.Request.QueryString["pid"].ToString();

        }

        if ((!string.IsNullOrEmpty(context.Request.QueryString["coln"])) && (string.IsNullOrEmpty(context.Request.QueryString["casn"])))

        {

            colName = HttpUtility.UrlDecode(context.Request.QueryString["coln"].ToString()); 

            if (dt != null)

            {

                bool pt = true;

                while (pt)

                {

                    for (int i = 0; i < dt.Rows.Count; i++)

                    {

                        Casname = dt.Rows[i]["view_colname"].ToString();

                        if (dt.Rows[i]["view_colname"].ToString() == colName)

                        {

                            if (dt.Rows[i]["view_cas"].ToString() != null&&dt.Rows[i]["view_cas"].ToString() !="")

                            {

                                colName = dt.Rows[i]["view_cas"].ToString();

                            }

                            else

                            {

                                colt = true;

                                sql = dt.Rows[i]["view_sql"].ToString();

                                pt = false;

                            }

                            break;

                        }

                    }

                }

            }

        }

        if ((!string.IsNullOrEmpty(context.Request.QueryString["casn"])) && (!string.IsNullOrEmpty(context.Request.QueryString["coln"])))

        {

           string casnName = HttpUtility.UrlDecode(context.Request.QueryString["casn"].ToString());

           colName = HttpUtility.UrlDecode(context.Request.QueryString["coln"].ToString()); 

            if (dt != null)

            {

                for (int i = 0; i < dt.Rows.Count; i++)

                {

                    Casname = dt.Rows[i]["view_colname"].ToString();

                    if (dt.Rows[i]["view_cas"].ToString() == casnName && casnName != colName)

                    {

                        colt = true;

                        sql = dt.Rows[i]["view_sql"].ToString();

                        break;

                    }

                }

            }

        }

        try

        {

            if (parentId != "" && colt == true)

            {

                //此处省略得到数据列表的代码

                List<TreeInfo> ltree = DAL_TreeInfo.GetItemValue(parentId, sql);

                resultStr = "";

                resultStr += "[";

                if (ltree.Count > 0)

                {

                    foreach (TreeInfo item in ltree)

                    {

                        attributes = "";

                        attributes += "{\"cas\":\"" + Casname;

                        attributes += "\",\"val\":\"" + item._text + "\"}";

                        resultStr += "{";

                        resultStr += string.Format("\"id\": \"{0}\", \"text\": \"{1}\", \"iconCls\": \"{2}\", \"attributes\": {3}, \"state\": \"closed\"", item._id, item._text, icon, attributes);

                        resultStr += "},";

                    }

                    resultStr = resultStr.Substring(0, resultStr.Length - 1);

                }

                resultStr += "]";

            }

            else

            {

                resultStr = "[]";

            }

        }

        catch (Exception ex)

        {

            resultStr = "出错";

        }

        context.Response.Write(resultStr);

    }

    public bool IsReusable

    {

        get

        {

            return false;

        }

    }

}

 

关键性的代码都已经在上面了,目前也就只能想到这种办法来解决了,有时间的话可以给tree扩展一下,添加一个清除子节点的方法,这样应该实现起来会更容易方便。

小弟在此献丑了,不知道各位专家、同仁有没有遇到类似的问题,或者有其它更好的解决办法,欢迎在这交流。

Javascript 相关文章推荐
xml 封装与解析(javascript和C#中)
Jul 26 Javascript
Jquery优化效率 提升性能解决方案
Sep 06 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
Apr 21 Javascript
jquery增加时编辑jqGrid(实例代码)
Nov 08 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
May 12 Javascript
详解JavaScript中this关键字的用法
May 26 Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 Javascript
canvas红包照片实例分享
Feb 28 Javascript
three.js 入门案例详解
Jan 23 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
axios 实现post请求时把对象obj数据转为formdata
Oct 31 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 #Javascript
JavaScript获取Url里的参数
Dec 18 #Javascript
Javascript实现单张图片浏览
Dec 18 #Javascript
VS2008中使用JavaScript调用WebServices
Dec 18 #Javascript
JavaScript中window.showModalDialog()用法详解
Dec 18 #Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 #Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 #Javascript
You might like
与数据库连接
2006/10/09 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
python3简单实现微信爬虫
2015/04/09 Python
python对html代码进行escape编码的方法
2015/05/04 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
人力资源管理专业求职信
2014/07/23 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
逃课检讨书
2015/01/26 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
党委工作总结2015
2015/04/27 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis