浅析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 相关文章推荐
extjs grid取到数据而不显示的解决
Dec 29 Javascript
js或css文件后面跟参数的原因说明
Jan 09 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
Apr 17 Javascript
使用js获取地址栏中传递的值
Jul 02 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
DOM基础教程之事件对象
Jan 20 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 Javascript
Angular+Node生成随机数的方法
Jun 16 Javascript
node 标准输入流和输出流代码实例
Sep 19 Javascript
vue实现登录功能
Dec 31 Vue.js
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
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
PHP多线程类及用法实例
2014/12/03 PHP
PHP制作万年历
2015/01/07 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
微信小程序删除处理详解
2017/08/16 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
深入理解Python中的内置常量
2017/05/20 Python
python取代netcat过程分析
2018/02/10 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Python中无限循环需要什么条件
2020/05/27 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
水污染治理专业毕业生推荐信
2013/11/14 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书