自定义下拉框类型source(树型)

  var imagePath = "";
  var barImg, spacerImg, rootImg;
  var teeImg, teePlusImg,teeMinusImg;
  var cornerImg, cornerPlusImg, cornerMinusImg;
  var folderImg, folderOpenImg, leafImg;

  imgAlign = ' align="absMiddle"';

/**
 * 构造函数,新建一个树节点
 */
function Folder(nodecode,description,parentId){
   this.code = nodecode;
   this.desc = description;
   this.parentId = parentId;
   if (parentId == null){
       this.layer = 1;
   }
}

function setImagePath(){
   barImg = imagePath+"images/menu_bar.gif";
   teeImg = imagePath+"images/menu_tee.gif";
   cornerImg = imagePath+"images/menu_corner.gif";
   spacerImg = imagePath+"images/menu_spacer.gif";
   rootImg = imagePath+"images/menu_root.gif";
   teePlusImg = imagePath+"images/menu_tee_plus.gif";
   teeMinusImg = imagePath+"images/menu_tee_minus.gif";
   cornerPlusImg = imagePath+"images/menu_corner_plus.gif";
   cornerMinusImg = imagePath+"images/menu_corner_minus.gif";
   folderImg = imagePath+"images/folder.gif";
   folderOpenImg = imagePath+"images/folder_open.gif";
   leafImg = imagePath+"images/file.gif";
}
function setColor(nodeCode){
   document.getElementById("fld_text_"+nodeCode).style.color = "#FF0000";
   if (document.getElementById("fld_text_"+preNodeCode) && nodeCode!=preNodeCode){
      document.getElementById("fld_text_"+preNodeCode).style.color = "#221133"; 
   }
   preNodeCode = nodeCode;
}

/**
 * 初始化打开一个节点
 */
function expandFolder(nodeCode, dropDown){
   var folder = getFolderByCode(nodeCode, dropDown);
   if (folder == null)   return;
   var ancestors = folder.getAncestors(dropDown);
   for (var i=0; i<ancestors.length; i++){
       ancestors[i].show(dropDown);
   }
   folder.clickNode(nodeCode, dropDown)
}
/**
 * 默认实现,点击节点名称
 */
function clickNode(nodeCode, dropDown){
   clickFolder(nodeCode, dropDown);
   setColor(nodeCode);
}
/**
 * 点击“文件夹”图片
 */
function clickFolder(nodeCode, dropDown){
   var folder = getFolderByCode(nodeCode, dropDown);
   if (folder.isOpen){
      hiddenFolder(folder, dropDown);
   }else{
      showFolder(folder, dropDown);
   }
}


Folder.prototype={
    draw : function(dropDown){
        var fathers = this.getAncestors(dropDown);
        var content = '';
        for (var i=fathers.length; i>0; i--){
            if (fathers[i-1].hasBrothers(dropDown)){
               content += '<img src="'+barImg+'" '+imgAlign+'>';
            }else{
               content += '<img src="'+spacerImg+'" '+imgAlign+'>';
            }
        }
        content += '<img id="nav_img_'+this.code+'" '+imgAlign+' src="';
        if (this.isLeafNode(dropDown)){
           if (this.hasBrothers(dropDown)){
              content += teeImg;
           }else{
              content += cornerImg;
           }
        }else{
           if (this.hasBrothers(dropDown)){
              content += teePlusImg;
           }else{
              content += cornerPlusImg;
           }
        }
        content += '" style="cursor:hand" border="0">';
        if (dropDown.multiple){
            content += '<input type="checkbox" name="menuCode" id="fld_chkbox_'+this.code+'" value="'+this.code+'" style="height:16px">';
        }
        content += '<span id="fld_text_'+this.code+'" style="cursor:hand">' + this.desc+'</span>';
        var elt = new Element("div", {id:"folder_"+this.code,"class":"treeNode"}).update(content);
        elt.setAttribute("noWrap","true");
        return elt;
    },
    hide : function(dropDown){
        this.isOpen = false;
        if (this.isLeafNode(dropDown)){
           return;
        }
        var object = document.getElementById("nav_img_"+this.code);
        if (this.hasBrothers(dropDown)){
            object.src = teePlusImg;
        }else{
            object.src = cornerPlusImg;
        }
        object = document.getElementById("fld_img_"+this.code);
        if (object){
            object.src = folderImg;
        }
        var grandson = this.getDescendants(dropDown);
        for (var i=0; i<grandson.length; i++){
            document.getElementById("folder_"+grandson[i].code).style.display = "none";
            grandson[i].isOpen = false;
            grandson[i].hide(dropDown);
        }
    },
    show : function(dropDown){
        this.isOpen = true;//alert(this.code+"show:"+this.isLeafNode(dropDown));
        if (this.isLeafNode(dropDown)){
            return;
        }
        var object = document.getElementById("nav_img_"+this.code);
        if (this.hasBrothers(dropDown)){
            object.src = teeMinusImg;
        }else{
            object.src = cornerMinusImg;
        }
        object = document.getElementById("fld_img_"+this.code);
        if (object){
            object.src = folderOpenImg;
        }
        var children = this.getChildren(dropDown);
        for (var i=0; i<children.length; i++){
            document.getElementById("folder_"+children[i].code).style.display = "block";
            object = document.getElementById("nav_img_"+children[i].code);
            if (children[i].isLeafNode(dropDown)){
                if (children[i].hasBrothers(dropDown)){
                   object.src = teeImg;
                }else{
                   object.src = cornerImg;
               }
            }else{
               if (children[i].hasBrothers(dropDown)){
                  object.src = teePlusImg;
               }else{
                  object.src = cornerPlusImg;
               }
            }
        }
     },
     getParent : function(dropDown){
        if (!dropDown.frozen){
            Dropdown_Tree.frozen(dropDown);
        }
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].code == this.parentId){
                return dropDown.options[i];
            }else if (dropDown.options[i].layer > this.layer+1){
                break;
            }
        }
        return null;
    },
    getAncestors : function(dropDown){
        var ancestors = new Array();
        var parent = this.getParent(dropDown);
        while (parent != null){
            ancestors.push(parent);
            parent = parent.getParent(dropDown);
        }
        return ancestors;
    },
    getChildren : function(dropDown){
        if (!dropDown.frozen){
            Dropdown_Tree.frozen(dropDown);
        }
        var children = new Array();
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].parentId == this.code){
                dropDown.options[i].layer = this.layer + 1;
                children.push(dropDown.options[i]);
            }else if (dropDown.options[i].layer > this.layer+1){
                break;
            }
        }
        return children;
    },
    getDescendants : function(dropDown){
        var descendants = new Array();
        var children = this.getChildren(dropDown);
        for (var i=0,len=children.length; i<len; i++){
            descendants.push(children[i]);
            descendants = descendants.concat(children[i].getDescendants(dropDown));
        }
        return descendants;
    },
    getBrothers : function(dropDown){
        if (!dropDown.frozen){
            Dropdown_Tree.frozen(dropDown);
        }
        var brothers = new Array();
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].parentId==this.parentId && dropDown.options[i]!=this){
                children.push(dropDown.options[i]);
            }else if (dropDown.options[i].layer > this.layer+1){
                break;
            }
        }
        return brothers;
    },
    hasBrothers : function(dropDown){
        if (!dropDown.frozen){
            Dropdown_Tree.frozen(dropDown);
        }
        var foundSelf = false;
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].parentId == this.parentId){
                if (dropDown.options[i].code == this.code){
                    foundSelf = true;
                }else if (foundSelf){
                    return true;
                }
            }else if (dropDown.options[i].layer > this.layer+1){
                break;
            }
        }
        return false;
    },
    isLeafNode : function(dropDown){
        if (!dropDown.frozen){
            Dropdown_Tree.frozen(dropDown);
        }
        for (var i=dropDown.options.length-1; i>=0; i--){
            if (dropDown.options[i].parentId == this.code){
               return false;
            }else if (dropDown.options[i].layer < this.layer){
                break;
            }
        }
        return true;
    },
    selectNode : function (dropDown){
        this.show(dropDown);
        var obj = document.getElementById("fld_chkbox_"+this.code);
        if (chkboxOperate > 0){
           var array = this.getDescendants(dropDown);
           for (i=0;i<array.length;i++){
               document.getElementById("fld_chkbox_"+array[i].code).checked = obj.checked;
           }
        }
        if (chkboxOperate==-1 || chkboxOperate==2){
           var array1 = this.getAncestors(dropDown);
           if (obj.checked){
               for (i=0; i<array1.length; i++){
                   document.getElementById("fld_chkbox_"+array1[i].code).checked = obj.checked;
               }
           }
        }
    }
}


/**选中Checkbox是否关联级联的节点
 * 0: 默认不关联,只选中自身
 * 1: 自动选中children
 * -1: 选中grand-parent
 * 2: 选中grand and children
 */
var chkboxOperate = 0;
function setChkboxOperate(operate){
   chkboxOperate = operate;
}

 

var Dropdown_Tree={
    /**protected**/
    getShowStr : function(dropDown){
        if (!dropDown.drawed){
            dropDown.drawed = true;
            this.drawTree(dropDown);
        }
        for (var i=0,len=dropDown.options.length; i<len; i++){
            var folderCode = dropDown.options[i].code;
            $("nav_img_"+folderCode).observe("click",function(event){
                var code = event.srcElement.id;
                code = code.substring("nav_img_".length, code.length);
                var folder = Dropdown_Tree.getFolderByCode(code, dropDown);
                if (folder.isOpen){
                    folder.hide(dropDown);
                }else{
                    folder.show(dropDown);
                }
                event.cancelBubble=true;
            });
            if (dropDown.multiple){
                $("fld_chkbox_"+folderCode).observe("click",function(event){
                    var code = event.srcElement.id;
                    code = code.substring("fld_chkbox_".length, code.length);
                    var folder = Dropdown_Tree.getFolderByCode(code, dropDown);
                    folder.selectNode(dropDown);
                    event.cancelBubble=true;
                });
            }
            $("fld_text_"+folderCode).observe("click",function(event){
                var code = event.srcElement.id;
                code = code.substring("fld_text_".length, code.length);
                var folder = Dropdown_Tree.getFolderByCode(code, dropDown);
                if (folder.isOpen){
                    folder.hide(dropDown);
                }else{
                    folder.show(dropDown);
                }
                Dropdown_Tree.selectItemOK(this, dropDown);
            });
        }
    },
    /**protected**/
    initSelectedItem : function(dropDown){
        var value_ = dropDown.valueObj.value;
        if (dropDown.multiple){
            value_ = value_.split("|");
            for (var i=0,len=value_.length; i<len; i++){
                var chkbox = $("fld_chkbox_"+value_[i]);
                if (chkbox != null){
                    chkbox.checked = true;
                }
            }
        }else{
            var textObj = $("fld_text_"+value_);
            if (textObj != null){
                textObj.setStyle({color:"#FF0000"});
            }
        }
    },
    drawTree : function(dropDown){
        setImagePath();
        if (dropDown.rootName){
            var content = '<img id="fldImgRoot" align="absMiddle" src="'+rootImg+'">'+ dropDown.rootName;
            var root = new Element("div", "tree_root_"+dropDown.loader).update(content);
            root.setStyle({cursor:'hand',fontSize:'15px'});
            dropDown.dispObj.appendChild(root);
        }
        var folders = this.getTopFolders(dropDown);
        for (var i=0,len=folders.length; i<len; i++){
            dropDown.dispObj.appendChild(folders[i].draw(dropDown));
            document.getElementById("folder_"+folders[i].code).style.display = "block";
            var descendants = folders[i].getDescendants(dropDown);
            for (var j=0,size=descendants.length; j<size; j++){
                dropDown.dispObj.appendChild(descendants[j].draw(dropDown));
            }
        }
    },
    selectItemOK : function(textObj, dropDown){
        var value = "", text = "";
        if (dropDown.multiple){
            var chkbox = textObj.previousSibling;
            chkbox.checked = !chkbox.checked;
            var children = dropDown.dispObj.childNodes;
            var folderChildren;
            for (var i=0,len=children.length; i<len; i++){
                folderChildren = children[i].childNodes;
                if (folderChildren[folderChildren.length-2].checked){
                    value += folderChildren[folderChildren.length-2].value + "|";
                    text += folderChildren[folderChildren.length-1].innerText + "|";
                }
            }
            if (value != ""){
                value = value.substring(0, value.length-1);
                text = text.substring(0, text.length-1);
            }
            dropDown.valueObj.value = value;
            dropDown.srcObj.value = text;
            cancelBubble(event);
        }else{
            var preTextObj = $("fld_text_"+dropDown.valueObj.value);
            if (preTextObj != null){
                preTextObj.setStyle({color:"#000000"});
            }
            text = textObj.innerText;
            value = textObj.id.substring("fld_text_".length, textObj.id.length);
            dropDown.srcObj.value = text;
            dropDown.valueObj.value = value;
        }
    },

    addItem : function(code,text,parentId,dropDown){
        var folder = new Folder(code,text,parentId);
        dropDown.options.push(folder);
    },
    frozen : function(dropDown){
        var temp = this.getTopFolders(dropDown);
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].layer == undefined){
                var parentId = dropDown.options[i].parentId;
                for (var j=0; j<temp.length; j++){
                    if (temp[j].code == parentId){
                        dropDown.options[i].layer = temp[j].layer + 1;
                        temp.push(dropDown.options[i]);
                    }
                }
            }
        }
        dropDown.options.sort(function(folder1,folder2){
            return folder1.layer - folder2.layer;
        });
        dropDown.frozen = true;
    },

    getTopFolders : function(dropDown){
        var folders = new Array();
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].parentId == null){
                folders.push(dropDown.options[i]);
            }
        }
        return folders;
    },
    getFolderByCode : function(code, dropDown){
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].code == code){
                return dropDown.options[i];
            }
        }
        return null;
    },
    getLayerFolders : function (layer, dropDown){
        if (!dropDown.frozen){
            this.frozen(dropDown);
        }
        var folders = new Array();
        for (var i=0,len=dropDown.options.length; i<len; i++){
            if (dropDown.options[i].layer == layer){
                folders.push(dropDown.options[i]);
            }else if (dropDown.options[i].layer > layer){
                break;
            }
        }
        return folders;
    }
}
Dropdown.prototype.setRootName=function(nodeName){
    this.rootName = nodeName;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值