js基于json的级联下拉框
2021-06-27 09:04
标签:listener eve efault 福建 targe elf 下拉 cal 方法 级联下拉列表是项目中常用到的。比如省市县,比如企业性质等,做成一个js通用组件, 在静态页出来后可以直接插入,将数据和html静态页做一个解耦。 贴出来抛砖引玉吧。 js基于json的级联下拉框 标签:listener eve efault 福建 targe elf 下拉 cal 方法 原文地址:http://www.cnblogs.com/PPBoy/p/7147483.htmlhtml>
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; ilen; 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; ilen; 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; ilen; i++){
this.$(this.ids[i]).length=1;
}
}
ComboSelect.prototype.getChilds = function(p) {
var childs = [];
for(var i=0, len=this.myData.length; ilen; 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; ilen; 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; ilen; 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中表单的聚焦失焦事件
下一篇:require.js