JQATT全称(JqueryAjaxTreeTable)控件

效果图如下

 

另外两个图片也一起传上来吧,各位另存一下就好

 

(function (JQ) {

    //JQ.fn.extend({

    JQ.fn.JQAjaxTreeTable = function (Options) {

        var _thisTable = JQ(this);
        /*
        * Options的属性 Options.dataPrimaryKey //数据的主键名 Options.fnFormatData
        * //格式化数据显示效果的方法 Options.addImgSrc //+号图片的地址 Options.subImgSrc
        * //-号图片的地址
        */

        Options.dataPrimaryKey = Options.dataPrimaryKey || "id";
        Options.addImgSrc = Options.addImgSrc || "/images/p.gif";
        Options.subImgSrc = Options.subImgSrc || "/images/s.gif";
        Options.sendToServerData = {};
        /**
        * 格式化tr内容的方法 data 是后台传输过来的参数
        */
        Options.fnFormatData = Options.fnFormatData
					|| function (itemdata, index, formatMethod) {
					    for (var p in itemdata) {
					        s += formatMethod("<td>{0}<td>", itemdata[p]);
					    }
					    return s;
					};

        // 渲染子节点
        function RenderChild(responseText) {

            var $thisTR = this.$tr;

            var CurrentRowData = this.CurrentRowData; // 被点击行的数据,通过ajax的context传递过来

            var CurrentRowId = CurrentRowData[Options.dataPrimaryKey]; // 被点击行的主键值

            var parendids = $thisTR.attr("parentid") || "_p0"; // 被点击行的父辈
            var re = /\_p/ig; // 创建正则表达式模式。
            var r = parendids.match(re); // 尝试去匹配搜索字符串。
            var level = r.size(); // 总共有几个_p 也就是有几级
            var result = eval("( " + responseText + ")"); // 把客户端返回的字符串解析一下.

            var $treeimg = $thisTR.find("img.treeimg");

            //判断是 -号图片就直接收缩起来.
            if ($treeimg.attr("src") == Options.subImgSrc) {
                //收缩操作,找到所有的字系列
                $treeimg.attr("src", Options.addImgSrc);

                var childtr = _thisTable.find("tr[parentid*='_p" + CurrentRowId + "_p']");
                childtr.remove();

            } else {
                // 展开操作
                $treeimg.attr("src", Options.subImgSrc);

                for (var i = 0; i < result.length; i++) {
                    var rowdata = result[i];

                    if (isempty(rowdata)) continue;

                    var newtr = format("<tr parentid='{0}_p{1}' ></tr>",
								parendids,
                                rowdata[Options.dataPrimaryKey]);

                    newtr = JQ(newtr);
                    newtr.data(rowdata); // 把数据绑定到tr上
                    var s = format("<td>" +
                        "<span style='width:{1}px;display: inline-block;text-align: right;'><img alt='' class='treeimg'  src='{0}' /></span>" +
                        "</td>", Options.addImgSrc, level * 20);

                    s += Options.fnFormatData(rowdata, i, format);

                    newtr.append(s);
                    $thisTR.after(newtr);

                    // 给新增加的行添加上单击事件处理方法 
                    newtr.find("img.treeimg").click(onImgClick);
                }


            }

        }

        // 使用示例
        // var template = "{0}欢迎你在{1}上给{0}留言,交流看法";
        // var author = "晴枫";
        // var site = "枫芸志";
        // var msg = String.format(template, author, site);
        function format(src) {
            if (arguments.length == 0)
                return null;
            var args = Array.prototype.slice.call(arguments, 1);
            return src.replace(/\{(\d+)\}/g, function (m, i) {
                return args[i];
            });
        };

        function isempty(obj) {
            if (obj == null || obj == "" || obj == undefined) {
                return true;
            }

            for (var p in obj) {
                return false; //有属性就是false
            }
            return true;
        }

        // 当+号被点击时触发
        function onImgClick() {

            // this 指向的是当前被点击的+号图片
            var $thisTR = JQ(this).parents("tr");

            var CurrentRowData = $thisTR.data();

            if (isempty(CurrentRowData)) {
                CurrentRowData = { dataId: $thisTR.attr("dataid") };
            } else {
                CurrentRowData.dataId = CurrentRowData.Id || CurrentRowData.dataId;
            }



            // 加个参数OptionMethod=GetChildrenTrData一起传到后台
            CurrentRowData.OptionMethod = "GetChildrenTrData";

            //每次都传递到后台的参数
            for (var p in Options.sendToServerData) {
                CurrentRowData[p] = Options.sendToServerData[p];
            }

            var d = {
                type: "post",
                context: {
                    "$tr": $thisTR,
                    "CurrentRowData": CurrentRowData
                }, // 把当前点击的Tr 传递到ajax回调函数中
                data: CurrentRowData,
                success: RenderChild
            };
            if (Options.url) {
                d.url = Options.url;
            }
            JQ.ajax(d); 

        }



        function fristLoad() {
            var $fristtr = _thisTable.find("tr:first");
            var CurrentRowData = {};
            CurrentRowData.OptionMethod = "GetChildrenTrData";
            CurrentRowData.dataId = 0;
            var d = {
                type: "post",                
                context: {
                    "$tr": $fristtr,
                    "CurrentRowData": CurrentRowData
                }, // 把当前点击的Tr 传递到ajax回调函数中
                data: CurrentRowData,
                success: RenderChild
            };
            if (Options.url) {
                d.url = Options.url;
            }

            JQ.ajax(d);
        }


        fristLoad();

        _thisTable.find("tr img.treeimg").click(onImgClick);

    }

    //   });

})(jQuery || JQ || $);


 

 控件初成,代码简单.就是为了给你的table加上树的功能...为了提高客户端效率,,采用ajax技术从后台动态读取数据..

控件本身使用方法如下;

 html部分

<div id="mainContent">
  <table width="100%" id="tablist"  cellspacing="0" cellpadding="0" border="1" bordercolorlight="#DDDDDD" class="datatable" bordercolordark="#FFFFFF">
     <tr>
     <th width="5%">序号</th>
     <th width="65%">类型名称</th>
     <th width="10%">实体产品</th>
     <th width="20%">操作</th> 
    </tr>
  </table>
 
</div>

就是部分

 <script type="text/javascript"> 
        JQ("#mainContent table").JQAjaxTreeTable({
            addImgSrc: "../images/p.gif",
            subImgSrc: "../images/s.gif",
            url:"后台ajax页面取数据的地方",
            dataPrimaryKey:"Id",
            fnFormatData: function (itemdata, index, formatMethod) 
            {
                return formatMethod("<td><input type='hidden' value='{0}' >{2} </td>" +
                                        "<td>{3} </td>" +
                                    "<td><a href=product_type_edit.aspx?id={4}>编辑</a> <a href='#' οnclick='Del(this,{4})'>删除</a> <a href='product_type_edit.aspx?parentId={4}'>添加子系列</a> </td> "
                                    , itemdata.id
                                    , 0
                                    , itemdata.TypeName
                                    , itemdata.IsEntityProduct
                                    , itemdata.Id);
            }
        }); 
    </script>


 后台提供数据的方法如下依asp.net为例,,当然改成java也能用,返回的格式一定是json数据才好处理哦,至于怎么拼装成json各位就自己发挥吧,微笑

 

protected void Page_Load(object sender, EventArgs e)
{

//这个控件会传递一个参数dataId到后台,因为id用的太多了,容易混乱所以就用dataId了..
            string Id = Request["dataId"];
//再传递第二个参数OptionMethod其值永为GetChildrenTrData
            if (Request["OptionMethod"] == "GetChildrenTrData")
            {
                GetChildren(Id);
                Response.End();
                return;
            }
}

 private void GetChildren(string id)
        {
            Shop.BLL.Product.ProductType data = new Shop.BLL.Product.ProductType();
            List<Model.Product.ProductType> list1 = data.GetAllByWhere("ParentId = '" + id + "' order by id desc");
            int ln = list1.Count;
            string[] js = new string[ln];

            for (int i = 0; i < ln; i++)
            {
                js[i] = string.Empty;
                Model.Product.ProductType pt = list1[i];
                js[i] += string.Format("TypeName:'{0}',ParentId:'{1}',IsEntityProduct:'{2}',Id:'{3}'" 
                                        , pt.TypeName
                                        , pt.ParentId
                                        , (pt.IsEntityProduct.ToString() == "1" ? "是" : "否")
                                        , pt.Id);
                //  js[i] +=string.Format("<a href=product_type_edit.aspx?id={0}>编辑</a><a href='#' οnclick='Del({0})'>删除</a> <a href='product_type_edit.aspx?parentId={0}'>添加子系列</a>", pt.Id.ToString());
                // js[i].AppendFormat("<a href=product_type_edit.aspx?id={0}>编辑</a>");
            }
            Response.Write("[{" +
                                string.Join(" },{ ", js) +
                           "}]");
        }


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值