首页 > 代码库 > js基于json的级联下拉框

js基于json的级联下拉框

级联下拉列表是项目中常用到的。比如省市县,比如企业性质等,做成一个js通用组件,

在静态页出来后可以直接插入,将数据和html静态页做一个解耦。

贴出来抛砖引玉吧。

<html><script type="text/javascript">/**  基于json的级联下拉列表,支持初始化   调用eg:       var comboselect = ComboSelectFactory(data, ‘p1‘, ‘p2‘, ‘p3‘, ‘p4‘);          设定下拉列表value,text,parentid名称的方法eg:    comboselect.setProperties({id:‘id‘,text:‘text‘,parentid:‘parentid‘,defaultvalue:‘defaultvalue‘});       初始化下拉列表集合的方法eg:    comboselect.initSelect(‘gd‘); */  var ComboSelectFactory = function(data){    var comboselect = new ComboSelect(arguments);    return comboselect;}var ComboSelect = function(data){    this.myData = [].slice.call(data, 0, 1)[0];    this.ids = [].slice.call(data, 1);    this.setProperties({});}ComboSelect.prototype.setProperties = function(opt){    this.defaultvalue = opt.defaultvalue || -;    this.id = opt.id || id;    this.text = opt.text || categoryname;    this.parent = opt.parent || parentid;    for(var i=0, len=this.ids.length-1; i<len; i++){        var o = this.$(this.ids[i]);        this.addEventHandler(o, change, this.eventHandle(o,i));    }    this.initChild(null, 0);}ComboSelect.prototype.eventHandle = function(o,i) {    var self = this;    var oreg=o;    var index=i+1;    return function() {        self.initChild(oreg, index);    }}ComboSelect.prototype.initChild = function(oSelect, index){    var p = null == oSelect ? this.defaultvalue : oSelect.options[oSelect.selectedIndex].value;    var ds = this.getChilds(p);    this.clearSelect(index);    var child = this.$(this.ids[index]);    for(var i=0, len=ds.length; i<len; i++){        var currentObj = ds[i];        child.options[child.length] = new Option(currentObj[this.text], currentObj[this.id]);    }}ComboSelect.prototype.clearSelect = function(index) {    for(var i=index, len=this.ids.length; i<len; i++){        this.$(this.ids[i]).length=1;    }}ComboSelect.prototype.getChilds = function(p) {    var childs = [];    for(var i=0, len=this.myData.length; i<len; i++){        if(p == this.myData[i][this.parent]){            childs.push(this.myData[i]);        }    }    return childs;}ComboSelect.prototype.initSelect = function(id){    var parentids = [];    parentids = this.getParent(id);    for (var i=0, len=this.ids.length; i<len; i++){            if(i==0){            this.initChild(null, 0);        }else{            this.initChild(this.$(this.ids[i-1]),i);        }        this.$(this.ids[i]).value = parentids[i][this.id];    }}ComboSelect.prototype.getParent = function(id) {    var parents = [];    for(var i=0, len=this.myData.length; i<len; i++){        if(id == this.myData[i][this.id]){            if(this.myData[i][this.parent] == this.defaultvalue){                            parents.push(this.myData[i]);                break;            }else{                parents = this.getParent(this.myData[i][this.parent]);                            parents.push(this.myData[i]);            }        }    }    return parents;}ComboSelect.prototype.$ = function(sid) {    return document.getElementById(sid);}ComboSelect.prototype.addEventHandler = function(oTarget, sEventType, fnHandler) {    if (oTarget.addEventListener) {        oTarget.addEventListener(sEventType, fnHandler, false);    } else if (oTarget.attachEvent) {        oTarget.attachEvent("on" + sEventType, fnHandler);    } else {        oTarget["on" + sEventType] = fnHandler;    }}/*-- 扩展的级联 ---------------------------*/    var data = [];    data.push({id:cn, text:中国, parentid:-});    data.push({id:fj, text:福建, parentid:cn});    data.push({id:gd, text:广东, parentid:cn});    data.push({id:fz, text:福州, parentid:fj});    data.push({id:xm, text:厦门, parentid:fj});    data.push({id:ly, text:龙岩, parentid:fj});    data.push({id:fz-fq, text:福州1, parentid:fz});    data.push({id:fz-mh, text:福州2, parentid:fz});    data.push({id:fz-cl, text:福州3, parentid:fz});    data.push({id:xm-dn, text:厦门1, parentid:xm});    data.push({id:xm-jm, text:厦门2, parentid:xm});    data.push({id:xm-xl, text:厦门3, parentid:xm});    data.push({id:yl-xl, text:龙岩1, parentid:ly});    data.push({id:yl-lc, text:龙岩2, parentid:ly});    data.push({id:yl-sh, text:龙岩3, parentid:ly});    data.push({id:yl-wp, text:龙岩4, parentid:ly});    data.push({id:gz, text:广州, parentid:gd});    data.push({id:sz, text:深圳, parentid:gd});    data.push({id:mx, text:梅县, parentid:gd});    data.push({id:gz-fq, text:广州1, parentid:gz});    data.push({id:gz-mh, text:广州2, parentid:gz});    data.push({id:gz-cl, text:广州3, parentid:gz});    data.push({id:sz-dn, text:深圳1, parentid:sz});    data.push({id:sz-jm, text:深圳2, parentid:sz});    data.push({id:sz-xl, text:深圳3, parentid:sz});    data.push({id:mx-xl, text:梅县1, parentid:mx});    data.push({id:mx-lc, text:梅县2, parentid:mx});    data.push({id:mx-sh, text:梅县3, parentid:mx});    data.push({id:mx-wp, text:梅县4, parentid:mx});    data.push({id:am, text:美国, parentid:-});    data.push({id:ny, text:纽约, parentid:am});    data.push({id:hsd, text:华盛顿, parentid:am});function makeArray(arg1, arg2){    return [ this, arg1, arg2 ];}//在onload后执行window.onload = function() {    comboselect = ComboSelectFactory(data, p1, p2, p3, p4);    comboselect.setProperties({id:id,text:text});}</script><body>       <select id="p1"><option>-选择-</option></select><br/>       <select id="p2"><option>-选择-</option></select><br/>       <select id="p3"><option>-选择-</option></select><br/>       <select id="p4"><option>-选择-</option></select>   </body>  </html>

 

js基于json的级联下拉框