`
zhang745309
  • 浏览: 8057 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

JQuery实现Tree

    博客分类:
  • js
 
阅读更多

第一步: 定义tree 的一些通用属性

     var treeDefaultProps = {
    fontSize: 12,
    indent: 15, //层级间缩进量
    height: 22, //条目的高度
    spacing: 5, //行元素间距离
    expandLevel: 1, //默认展开级别   
    cookieId: undefined, //是否将当前节点展开与否状态写入COOKIE, null不写入,若写入应指定些树的ID,以便与其它树实例区分
    animateSpeed: 100, //动画速度, 为0则无动画
    urlTarget: "_self", //绑定URL时,HREF目标
    //控制图片相关
    expandImg: "images/expand.png",
    collapseImg: "images/collapse.png",
    nodeImg: "images/node.png",
    picTopPos: 0, //控制图片上下的定位距离,为负数上移,正数下移
    fieldNameMap: { // 数据对象成员变量名映射
        id: "id",
        label: "label",
        url: "url",
        action: "action",
        img: "img",
        subTree: "subTree"
    }
};

 

 

第二步: 扩展Jquery方法

   if (jQuery) {
    (function($){
     //jquery扩展方法
        $.fn.extend({
         //tree扩展方法的名称,data 数据   properties  属性
            tree: function(data, properties, render){
                // 如果未传入配置属性对象,使用默认属性对象
                var _properties = properties ? properties : treeDefaultProps;
                // 要显示树的容器;调用者对象
                var _container = this;
                //  _container.css("font-size", _properties.fontSize);
                //渲染行的类实例
                var _renderer = new Renderer(_properties);
                //渲染行的方法
                var _render = render ? render : defaultRender;               
                // 构建树DOM节点方法() ; 构造树
                //nodeList 接点列表 level 层 (表示画到了第几层) ul指定li的ul
                function drawNode(nodeList, level, ul){
                 //循环nodeList
                    for (var i = 0; i < nodeList.length; i++) {
                        //生成LI并设置样式及属性
                        var li = $("<li></li>").appendTo(ul);
                        //white-space:nowrap 不换行 line-height 行高  padding-left 左填充
                        li.css("list-style", "none").css("white-space:nowrap");
                        li.css("line-height", _properties.height + "px");
                        li.css("padding-left", _properties.indent);
                        //将li添加到传进来的ul当中
                        li.appendTo(ul);
                        //li当前的级别
                        li.level = level;
                        li.data = nodeList[i];
                        li.renderer = _renderer;
                       
                        var curDataId = nodeList[i][_properties.fieldNameMap.id];
                        li.id = ul.id ? ul.id + "." + curDataId : curDataId;
                        li.attr("id", li.id);
                       
                        //判断是否有子树
                        var curLiSubTree = nodeList[i][_properties.fieldNameMap.subTree];
                        li.hasChildren = curLiSubTree && curLiSubTree.length > 0;
                       
                        // 如果有子菜单
                        if (li.hasChildren) {
                            // 初始化子层容器UL
                            var subUL = $("<ul style='margin:0;padding:0'></ul>").attr("id", li.id);
                            subUL.id = li.id;
                            li.ul = subUL;
                            // 处理UL可见性, 因为UL内对象在当前级的下级,所以将level+1做为级别参数
                            ulVisible(subUL, level + 1);
                        }
                       
                        addControlImg(li); // 添加控制图片
                        _render(li);
                       
                        if (li.hasChildren) {//递归处理,生成下级菜单
                            drawNode(curLiSubTree, level + 1, subUL);
                            subUL.appendTo(li);
                        }
                    }
                }
                
                //添加控制图片
                function addControlImg(li){
                    //$("<img />").attr("src", "images/node.png").appendTo(li);
                    if (li.hasChildren) {
                        var img;
                        if (li.ul.visible) {//如果可见,显示减号
                            img = _renderer.addImg(li, _properties.collapseImg, _properties.picTopPos);
                        } else {//如果不可见,显示加号图片
                            img = _renderer.addImg(li, _properties.expandImg, _properties.picTopPos);
                        }
                       
                        //展开折叠树的事件
                        img.click(function(){
                            var _thisImg = this;
                            //处理动画bug$("img, input").css("position", "") 去掉img 和input 的posttion属性
                            _properties.animateSpeed > 0 && (Browser.isIE(6) || Browser.isIE(7)) && $("img, input").css("position", "");
                            //slideToggle jquery 的动画方法_properties.animateSpeed 动画执行的时间,function方法是执行完成的回调方法
                            $(this).parent().children("ul").slideToggle(_properties.animateSpeed, function(){
                             //完成图片的切换
                                _thisImg.src = _thisImg.src.endWith(_properties.expandImg) ? _properties.collapseImg : _properties.expandImg;
                                //重新设置img 和position 的  position 属性
                                _properties.animateSpeed > 0 && (Browser.isIE(6) || Browser.isIE(7)) && $("img, input").css("position", "relative");
                            });
                        });
                    } else {
                        _renderer.addImg(li, _properties.nodeImg, _properties.picTopPos);
                    }
                }
               
                // 处理UL可见性
                function ulVisible(ul, level){
                    if (_properties.cookieId) { //如果状态写入COOKIE,根据COOKIE值确定
                    } else { //根据展开级别属性确定
                        if (level > _properties.expandLevel) {
                            ul.css("display", "none");
                            ul.visible = false;
                        } else {
                            ul.css("display", "");
                            ul.visible = true;
                        }
                    }
                }
               
                //开始生成树
                var rootUL = $("<ul style='margin:0;padding:0;'></ul>").css("margin-left", -parseInt(_properties.indent) + "px").appendTo(_container);
                drawNode(data, 1, rootUL);
            }
        });
    })(jQuery);
};

 

/**
 * 条目渲染类
 * @param {Object} prop
 */
var Renderer = function(prop){
    this._properties = prop;
    // 向条目行中加入图片
    this.addImg = function(o, src, pos, alignType){
        pos = pos ? parseInt(pos) : 0;
        var img = $("<img/>").css("margin-right", parseInt(this._properties.spacing) + "px")//.css("position", "relative").css("top", pos + "px");
        img.attr("src", src);
        alignType && img.attr("align", alignType);
        img.appendTo(o);
  img.removeAttr("height");
  img.removeAttr("width");
        return img;
    }
   
    // 向行中加入文本
    this.addLabel = function(o, text, callback, eventType){
        var span = $("<span></span>").html(text).css("margin-right", parseInt(this._properties.spacing) + "px").css("cursor", "default").appendTo(o);
        if (callback) {
            eventType = eventType ? eventType : "click";
            span.bind(eventType, callback);
            span.css("cursor", "pointer");
        }
        return span;
    }
   
    //向行中加入链接
    this.addLink = function(o, text, href, target){
        var link = $("<a></a>").html(text);
        link.attr("href", href);
        link.attr("target", target);
        o.append(link);
        return link;
    }
   
    // 向行中加入复选框
    this.addCheckbox = function(o, pos, id, callback, eventType){
        pos = pos ? parseInt(pos) : 0;
        id = id ? id : o.id;
        var input = $("<input type='checkbox'/>").css("position", "relative").css("top", pos + "px").css("margin-right", parseInt(this._properties.spacing) + "px");
        if (id) {
            input.attr("id", id);
        }
        if (callback) {
            eventType = eventType ? eventType : "click";
            input.bind(eventType, callback);
        }
       
        input.appendTo(o);
        return input;
    }
}

/**
 * 默认渲染条目方法
 */
function defaultRender(item){
    var prop = item.renderer._properties;
   
    var action = item["data"][prop.fieldNameMap.action];
    var url = item["data"][prop.fieldNameMap.url];
   
    // 如果指定了URL字段,绑定URL
    if (url && url.trim().length > 0) {
        item.renderer.addLink(item, item["data"][prop.fieldNameMap.label], url, prop.urlTarget);
    } else if (action && action.trim().length > 0) { //如果有ACTION字段绑定ACTION
        item.renderer.addLabel(item, item["data"][prop.fieldNameMap.label], function(){
            if (typeof(action) == "string") {
                eval(action);
            } else if (action instanceof Function) {
                action.call(this);
            }
        });
    } else {
        item.renderer.addLabel(item, item["data"][prop.fieldNameMap.label]);
    }
}

 

 

数据:

 

  
var sampleData = [{
    id: '001',
    label: '系统管理',
    url: '',
    action: 'alert("hello");',
    img: '',
    subTree: [{  //下级菜单
        id: '101',
        label: '用户管理',
        url: '',
        action: '',
        img: '',
        subTree: [{  //下级菜单
            id: '1011',
            label: '外网用户',
            url: 'http://www.baidu.com'
        }]
    }, {
        id: '102',
        label: '角色管理',
        url: '',
        action: '',
        img: ''
    }]
}, {
    id: '002',
    label: '基础数据',
    subTree: [{  //子元素
        id: '201',
        label: '部门设置'
    }, {
        id: '202',
        label: '设备型号设置',
        subTree: [{
            id: '2021',
            label: '设备型号'
        }, {
            id: '2022',
            label: '配件型号'
        }]
    }]
}];

 

分享到:
评论

相关推荐

    json jquery simple tree 源码

    在"json jquery simple tree 源码"中,这个扩展实现了将JSON数据用于jQuery Simple Tree的功能。JSON格式的数据非常适合异步加载,因为它可以高效地编码和解码,而且体积小,适合在网络上传输。在描述中提到,它可以...

    jquery.tree 树

    首先,jQuery.tree的核心功能是通过jstree库实现的。jstree是一个轻量级的JavaScript库,提供了一整套完善的API和多种可定制的配置选项,用于创建具有拖放、搜索、多选、上下文菜单等丰富功能的树结构。它的优点在于...

    扩展了一棵jquery的树插件SimpleTree(jquery.simple.tree.js),支持json数据,checkbox树,以及异步加载,

    **jQuery SimpleTree 插件详解** `jQuery SimpleTree` 是一个功能丰富的JavaScript插件,它扩展了jQuery库,为开发者提供了构建交互式树形结构的能力。这个插件特别之处在于它支持JSON数据格式,可以创建带有复选框...

    jquery.tree.js树形导航菜单插件

    jQuery.tree.js是基于jQuery库的一个插件,它利用JavaScript的事件驱动和DOM操作能力,实现了动态生成和管理树形导航菜单的功能。该插件不仅提供了丰富的配置选项,还支持各种交互效果,如点击展开/折叠节点、拖放...

    jquery checktree

    jQuery CheckTree是一个专门用于创建这种功能的插件,它使得在网页上实现可勾选的树形结构变得非常方便。本文将深入探讨jQuery CheckTree的工作原理、主要功能以及如何在项目中进行应用。 首先,让我们了解jQuery ...

    jquery.tree控件

    **jQuery Tree 控件详解** jQuery Tree控件是一种用于在网页上展示层次结构数据的JavaScript组件,它基于流行的jQuery库构建,提供了丰富的交互性和可定制性。这个控件可以帮助开发者轻松地创建可折叠、可展开的树...

    jqury 文件树jquery.fileTree

    jQuery 文件树(jQuery.fileTree)是一款基于 jQuery JavaScript 库的插件,用于在网页中以树形结构展示文件和目录。这款插件以其简洁、高效和易于定制的特点,深受开发者喜爱,尤其适用于需要用户交互式浏览和选择...

    jquery.checktree.js(添加默认选中功能,补:例子)

    总结起来,jQuery Checktree是一个强大的树形选择工具,通过“jquery.checktree.js”的改进,现在可以实现节点的默认选中,增强了用户体验。配合“checktree.css”和“test.html”,我们可以快速理解和应用这个插件...

    jquery_tree 树形组件

    Light Treeview是jQuery Tree组件的一种实现,它以其轻量级和简洁的代码著称,适用于那些对性能有较高要求或者希望快速集成的项目。它提供了基本的展开/折叠节点、点击事件处理等核心功能,同时也支持自定义样式,...

    jQUERY TREE

    动态生成树.rar"可能包含了使用jQuery实现树形结构的实例代码,可以解压查看具体实现细节。而"JqueryTree脚本.doc"则可能是关于jQuery Tree的使用指南或教程,包括如何初始化、添加节点、删除节点、展开/折叠节点等...

    jQuery jsTree大集合

    jsTree是一款基于jQuery的开源树形插件,它提供了丰富的功能和自定义选项,可以轻松实现网页中的可交互、动态展示的树结构。jsTree支持HTML、JSON等多种数据源,并且提供了搜索、拖放、上下文菜单、多选、异步加载等...

    全网jquery.tree树形菜单打包下载(zTree&jquery-ui&treeview共四种)

    在IT领域,jQuery Tree是一种广泛使用的前端技术,用于创建交互式的树形菜单。这个压缩包包含四个不同的jQuery树形插件:zTree、jQuery UI Treeview、jQuery UI Draggable Tree和jQuery Simple Treeview。这些插件各...

    jquery jstree

    **jQuery jsTree 知识详解** `jQuery jsTree` 是一个...通过熟练掌握jsTree的使用,可以提升项目的用户体验,实现更加直观和便捷的操作。不过,考虑到技术的不断发展,建议使用最新稳定版本以获取最佳性能和兼容性。

    jquerytree async 异步

    jQueryTree的异步加载功能主要通过API中的`data-url`属性实现,这个属性可以设置一个URL,当用户展开树形结构的某个节点时,jQueryTree会发送一个Ajax请求到该URL,获取子节点的数据。 **配置异步加载** 在使用...

    jquery tree样式多样

    本文将深入探讨jQuery Tree的核心特性、样式定制以及如何利用JQuery zTree v3.3实现多样化样式。 首先,jQuery Tree的基本概念是将HTML元素转化为可展开/折叠的节点结构,通常用于展现层级关系的数据,如目录结构、...

    jquery tree层进式导航树

    在本文中,我们将深入探讨jQuery Tree的实现原理、特点以及如何利用cookie实现记录用户上次查看的位置。 首先,jQuery UI 1.9.1是jQuery的一个扩展库,提供了丰富的用户界面组件,包括拖放功能、对话框、滑块、...

    一个精简的jquery生成tree例子

    标签"jquery tree"进一步明确了这个示例的焦点,即使用jQuery来实现树形视图。 文件"jqTree"可能是包含这个例子的源代码或者相关资源。通常,这样的文件可能包括HTML文件用于展示结构,CSS文件用于样式,以及...

    Jquery-tree.rar

    《jQuery Tree插件详解及其应用》 在前端开发中,数据的展示往往需要有层次结构,比如文件系统、组织架构等。此时,树形结构就成为了一种理想的展示方式。jQuery Tree是基于jQuery的一个插件,它使得在网页中创建...

    jquery file tree

    **jQuery File Tree 插件详解** `jQuery File Tree` 是一个流行的前端文件浏览器插件,它利用 jQuery 库提供了一种交互式的、树状的文件系统导航方式。这个插件适用于那些需要在网页中展示服务器目录结构的应用场景...

Global site tag (gtag.js) - Google Analytics