/** * 定义一个类型 * @constructor */ var thisObj; function Tree() { this.Items = {}; this.PItems = []; this.args = arguments; //层级对象ID this.selectValue = "id"; //设置对象的值是id,还是text thisObj = this; } Tree.prototype.add = function(id,iArray){ this.Items[id] = iArray; } Tree.prototype.addItem = function (pid, id, name) { this.Items[id] = {"id":id, "pid":pid, "name":name}; if(typeof(this.PItems[pid]) == "undefined") this.PItems[pid] = new Array(); this.PItems[pid].push(id); } Tree.prototype.Exists = function(id){ if(typeof(this.Items[id]) == "undefined") return false; return true; } Tree.prototype.ExistsByPid = function (pid) { if(typeof(this.PItems[pid]) == "undefined") return false; return true; } Tree.prototype.getItemsById = function (id) { if(typeof(this.Items[id]) == "undefined") return []; return this.getItemsByPid(this.Items[id]["pid"]); } Tree.prototype.getItemsByPid = function (pid) { var data = []; if(typeof(this.PItems[pid]) == "undefined") return data; var _id_; for(var i = 0; i < this.PItems[pid].length; i++) { _id_ = this.PItems[pid][i]; data.push(this.Items[_id_]); } return data; } Tree.prototype.bindEvent = function () { if(!this.args || this.args.length==0) return; for(var i=0; i < this.args.length; i++){ document.getElementById(this.args[i]).addEventListener("change", thisObj.setSelectItems(this.args[i]), false); } } Tree.prototype.test = function (index) { alert(index); } Tree.prototype.getSelectedValue = function (objectId) { return document.getElementById(objectId).value; } Tree.prototype.setSelectedValue = function (objSelect, val) { for (var i = 0; i < objSelect.options.length; i++) { if (objSelect.options[i].value == val) { objSelect.options[i].selected = true; return true; } } return false; } Tree.prototype.setSelectItems = function (objectId, selectId) { if(!document.getElementById(objectId)) return; var pidIndex=0, idIndex=0; for(var i=0; i < this.args.length; i++){ if(objectId==this.args[i]){ if(idIndex>0) pidIndex = idIndex-1; else pidIndex=0; break; } idIndex++; } //移除后面的值 for(var i=idIndex; i < this.args.length; i++){ this.clearSelectItems(document.getElementById(this.args[i]), 1); } //alert("idIndex="+idIndex+",pidIndex="+pidIndex) //取得上级pid值 var pid = 0; if(idIndex!=0) pid = this.getSelectedValue(this.args[pidIndex]); this.addSelectItems(document.getElementById(this.args[idIndex]), pid, undefined, false); //设置当前选择项的选中值 if(this.setSelectedValue(document.getElementById(this.args[idIndex]), selectId) && idIndex < this.args.length){ this.addSelectItems(document.getElementById(this.args[idIndex+1]), selectId, undefined, true) } } Tree.prototype.clearSelectItems = function (objSelect, offset) { if(!objSelect || !objSelect.options) return; var maxIndex = objSelect.options.length-1; if(maxIndex==0 || maxIndex < offset ) return; for (var i = maxIndex; i > offset-1; i--) { objSelect.options.remove(i) } } Tree.prototype.addSelectItems = function (objSelect, pid, selectId, append) { //需要先移除原来的选项 append = append||false; if(append) this.clearSelectItems(objSelect, 1); //如果没有pid数据,直接返回 if(!this.ExistsByPid(pid) || this.PItems[pid].length==0) return; //加入选择项 var count = this.PItems[pid].length; var _id_ for(var i=0; i < count; i++) { _id_ = this.PItems[pid][i]; var varItem = new Option(this.Items[_id_]["name"], this.Items[_id_]["id"]); objSelect.options.add(varItem); } //设置选中值 if(selectId) this.setSelectedValue(objSelect, selectId); } Tree.prototype.show = function () { //如果有参数则重新绑定对象 if(arguments && arguments.length>0) this.args = arguments; //无对象ID则退出 if(!this.args || this.args.length==0) return; this.setSelectItems(this.args[0],undefined); //this.bindEvent(); } /////////////// 下面为具体数据 /////////////////////// ///投保区域选择 var area_tree = new Tree("area_province","area_city"); area_tree.addItem("0", "12", "上海"); area_tree.addItem("12", "13", "上海全市"); area_tree.addItem("0", "1", "浙江省"); area_tree.addItem("1", "3", "杭州市"); area_tree.addItem("1", "11", "湖州市"); area_tree.addItem("1", "7", "嘉兴市"); area_tree.addItem("1", "10", "金华市"); area_tree.addItem("1", "8", "丽水市"); area_tree.addItem("1", "5", "宁波市"); area_tree.addItem("1", "6", "绍兴市"); area_tree.addItem("1", "9", "台州市"); area_tree.addItem("1", "4", "温州市"); area_tree.show();