zoukankan      html  css  js  c++  java
  • 基于jquery来制作动态加载树

      最近更新的后台树节点的加载方式。因为以前用的是jquery-treeview插件。 但是上网查了下资料,发现用它来实现树节点的动态加载还是挺麻烦的。于是我自己写了个动态加载的方式。下面贴代码。

    css样式:

    .treeview li{background: url(static/images/treeview-default-line0.gif) 0 0 no-repeat; margin: 0; padding: 4px 0pt 4px 16px; margin-left:5px;}
    .treeview li img{ margin-right:5px; margin-left:5px;}
    .hitarea{background: url(static/images/treeview-black.gif) -64px -25px no-repeat; height: 16px; width: 16px; margin-left: -16px; float: left; cursor: pointer;}
    .expandable-hitarea{background-position: -80px -3px;}

    js代码:

    for(var i=0; i<data.length; i++){
        $("#tree").append(createANode(data[i]))
    }
    function createANode(nodeInfo, rootNode) {
        var icon_name;
        if(nodeInfo.type == 0) {
            icon_name = 'icon1.png';
        }
        else if(nodeInfo.type == 2){
            icon_name = 'icon3.gif';
        }
        else{
            icon_name = 'icon2.png';
        }
    
        var tree_url = '/admin/web/channel/home/' + nodeInfo.id + '/';
        var icon_url = '/static/images/' + icon_name;
    
        if (nodeInfo.have_children == false) {
            var parentNode = $('<li></li>');
            var html = '<a href= " ' + tree_url + '" target = "django_channel"> ' +'<img  src = "' + icon_url +'" >' + nodeInfo.name + '</a>';
            parentNode.append(html);
        } else {
            var parentNode = $('<li class="expandable"></li>');
            var html = ' <div class="hitarea expandable-hitarea"></div><a href = " ' + tree_url + '" target = "django_channel">' + '<img  src = "' + icon_url + '" >'+ nodeInfo.name + '</a><ul style="display: none;"></ul>';
            parentNode.append(html);
            var nodeId = nodeInfo.id;
            //这里是绑定树节点的展开事件。
            parentNode.find("div").bind("click", function(event) {
                    if($(this).attr("class")=="hitarea expandable-hitarea") {
                        $(this).removeClass().addClass("hitarea collapsable-hitarea").parent().removeClass().addClass("collapsable").find("ul").show();
                    } else {
                        $(this).removeClass().addClass("hitarea expandable-hitarea").parent().removeClass().addClass("expandable").find("ul").hide(); 
                    }
                })
            
            parentNode.bind("click", function(event) {
               event.stopPropagation();   
               var dataUrl = "api/channel_tree/" + nodeId + "/";
               $.ajaxSettings.async = false;
               $.ajax({
                   type: "get",
                   url: dataUrl,
                   success: function(json) {
                       var obj = eval('(' + json + ')');
                       var nodes = eval('(' + obj.data + ')');
                       for(var j=0; j<nodes[0].children.length; j++) {
                           createANode(nodes[0].children[j], parentNode);
                       }
                   }
               })        
               parentNode.unbind("click");
            })
            
        }
        if(rootNode) {
            rootNode.children().last().append(parentNode);
        } else
            return parentNode;
    }

    本来想用事件委托来做事件绑定的,但是发现用事件委托时不可行的。所以别吐槽这种绑定时间的方式太费性能。

    后台把第一层数据通过模板写在页面中

    数据:

    [{"children": [], "name": "\u72d0\u9996", "parent": -1, "have_children": true, "desc": "", "type": 0, "id": 1, "is_subject": false}, {"children": [], "name": "\u65b0\u95fb", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 2, "is_subject": false}, {"children": [], "name": "\u4f53\u80b2", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 3, "is_subject": false}, {"children": [], "name": "\u5a31\u4e50", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 4, "is_subject": false}, {"children": [], "name": "\u8d22\u7ecf", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 5, "is_subject": false}, {"children": [], "name": "\u79d1\u6280", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 7, "is_subject": false}, {"children": [], "name": "\u519b\u4e8b", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 8, "is_subject": false}, {"children": [], "name": "\u661f\u5ea7", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 9, "is_subject": false}, {"children": [], "name": "\u56fe\u5e93", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 10, "is_subject": false}, {"children": [], "name": "\u6d4b\u8bd5", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 11, "is_subject": false}, {"children": [], "name": "\u5973\u4eba", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 326, "is_subject": false}, {"children": [], "name": "\u5176\u5b83", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 328, "is_subject": false}, {"children": [], "name": "\u6e20\u9053", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 561, "is_subject": false}, {"children": [], "name": "\u65e0\u7ebf", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 564, "is_subject": false}, {"children": [], "name": "\u5fae\u535a", "parent": -1, "have_children": false, "desc": null, "type": 0, "id": 565, "is_subject": false}, {"children": [], "name": "\u5e7f\u544a", "parent": -1, "have_children": true, "desc": null, "type": 0, "id": 577, "is_subject": false}].

    之后的数据通过绑定点击事件来获取接口数据。

    给出第一个节点的数据:

    {
    "status": 0,
    "data": "[{\"children\": [{\"children\": [], \"name\": \"\\u6b63\\u6587\\u9875\\u63a8\\u8350\", \"parent\": 1, \"have_children\": false, \"desc\": \"\", \"type\": 1, \"id\": 465, \"is_subject\": false}, {\"children\": [], \"name\": \"UC\", \"parent\": 1, \"have_children\": false, \"desc\": \"\", \"type\": 1, \"id\": 588, \"is_subject\": false}], \"name\": \"\\u72d0\\u9996\", \"parent\": -1, \"have_children\": true, \"desc\": \"\", \"type\": 0, \"id\": 1, \"is_subject\": false}]"
    }。

    具体生成数据方式不给出了。

     

  • 相关阅读:
    679 怎样杀死害虫?(对付一个系统最好的方式是“围城必阙”)
    678 "流浪地球"为什么是个好地方?(系统越复杂拥有好运气的机会也就越大)
    677 人类为什么会养猫?(做一件事理性的原因的背后往往还隐藏着自己都不曾发现的感性原因)
    职场人必知的三原则
    677 怎样当一个少数派?(越在意,越出众)
    675 为什么会有“黑天鹅”?(行为和对行为后果的负责与否决定了很多黑天鹅出现概率)
    不做特殊论者(没有所谓的理所当然,你所谓的成功很有可能只是因为运气)
    事实和观点(就事论事,事实有真假,观点无对错)
    一个程序员的价值观总结
    669 创新也是搞政治?(如何创新)
  • 原文地址:https://www.cnblogs.com/zzcflying/p/2618343.html
Copyright © 2011-2022 走看看