浅析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 相关文章推荐
Javascript的各种节点操作实例演示代码
Jun 27 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
jQuery验证元素是否为空的两种常用方法
Mar 17 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
JS设计模式之数据访问对象模式的实例讲解
Sep 30 Javascript
IntelliJ IDEA 安装vue开发插件的方法
Nov 21 Javascript
Vue组件通信之Bus的具体使用
Dec 28 Javascript
利用原生JS实现欢乐水果机小游戏
Apr 23 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
PHP连接MongoDB示例代码
2012/09/06 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
python如何通过protobuf实现rpc
2016/03/06 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
python 日志增量抓取实现方法
2018/04/28 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
大学生学习计划书
2014/09/15 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
泰山导游词
2015/02/02 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python