JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动


html代码
复制代码 代码如下:

<html>
<head>
<meta http-equiv=Content-Type content=text/html; charset=utf-8 />
<title>试试</title>
</head>
<script type="text/javascript">
var data = {
1 : a001,
2 : a002,
3 : a003,
4 : a004,
5 : a005,
6 : a006
};
var data2 = {
1 : { 101 : a101, 102 : a102, 103 : a103, 104 : a104 },
2 : { 201 : a201, 202 : a202, 203 : a203, 204 : a204 },
3 : { 301 : a301, 302 : a302, 303 : a303, 304 : a304 },
4 : { 401 : a401, 402 : a402, 403 : a403, 404 : a404 },
5 : { 501 : a501, 502 : a502, 503 : a503, 504 : a504 },
6 : { 601 : a601, 602 : a602, 603 : a603, 604 : a604 },
101 : { 10101 : a10101, 10102 : a10102, 10103 : a10103, 10104 : a10104 },
102 : { 10201 : a10201, 10202 : a10202, 10203 : a10203, 10204 : a10204 },
103 : { 10301 : a10301, 10302 : a10302, 10303 : a10303, 10304 : a10304 },
104 : { 10401 : a10401, 10402 : a10402, 10403 : a10403, 10404 : a10404 },
201 : { 20101 : a20101, 20102 : a20102, 20103 : a20103, 20104 : a20104 },
202 : { 20201 : a20201, 20202 : a20202, 20203 : a20203, 20204 : a20204 },
203 : { 20301 : a20301, 20302 : a20302, 20303 : a20303, 20304 : a20304 },
204 : { 20401 : a20401, 20402 : a20402, 20403 : a20403, 20404 : a20404 },
301 : { 30101 : a30101, 30102 : a30102, 30103 : a30103, 30104 : a30104 },
302 : { 30201 : a30201, 30202 : a30202, 30203 : a30203, 30204 : a30204 },
303 : { 30301 : a30301, 30302 : a30302, 30303 : a30303, 30304 : a30304 },
304 : { 30401 : a30401, 30402 : a30402, 30403 : a30403, 30404 : a30404 },
401 : { 40101 : a40101, 40102 : a40102, 40103 : a40103, 40104 : a40104 },
402 : { 40201 : a40201, 40202 : a40202, 40203 : a40203, 40204 : a40204 },
403 : { 40301 : a40301, 40302 : a40302, 40303 : a40303, 40304 : a40304 },
404 : { 40401 : a40401, 40402 : a40402, 40403 : a40403, 40404 : a40404 },
501 : { 50101 : a50101, 50102 : a50102, 50103 : a50103, 50104 : a50104 },
502 : { 50201 : a50201, 50202 : a50202, 50203 : a50203, 50204 : a50204 },
503 : { 50301 : a50301, 50302 : a50302, 50303 : a50303, 50304 : a50304 },
504 : { 50401 : a50401, 50402 : a50402, 50403 : a50403, 50404 : a50404 },
601 : { 60101 : a60101, 60102 : a60102, 60103 : a60103, 60104 : a60104 },
602 : { 60201 : a60201, 60202 : a60202, 60203 : a60203, 60204 : a60204 },
603 : { 60301 : a60301, 60302 : a60302, 60303 : a60303, 60304 : a60304 },
604 : { 60401 : a60401, 60402 : a60402, 60403 : a60403, 60404 : a60404 }
};
window.$ = function(id) {
if(typeof id == string) {
return document.getElementById(id);
}
return id;
}
/**
* 事件处理工具类
*
* @author bao110908
*/
var Event = function(){}
Event = {
/**
* 为 element 使用 handler 处理程序添加至 event 事件
* 兼容 IE 及 Firefox 等浏览器
*
* 例如为 botton 对象添加 onclick 事件,使用 clickEvent
* 方法作为处理程序:
* Event.addEvent(botton, click, clickEvent);
*
* @param element 需要添加事件的对象(Object)
* @param event 需要添加的事件名称(String),不加“on”
* @param handler 需要添加的方法引用(Function)
*/
addEvent : function(element, event, handler) {
if(element.attachEvent) {
element.attachEvent(on + event, handler);
} else if (element.addEventListener) {
element.addEventListener(event, handler, false);
} else {
element[on + event] = handler;
}
},
/**
* 添加事件处理程序时,只能添加一个方法的引用,并不能给
* 方法加上参数 。比如定义了 clickEvent(str) 这个方法,现
* 在要将其作为 obj 的 onclick 的事件处理程序,就可以用:
* obj.onclick = Event.getFuntion(null, clickEvent, str);
*/
getFunction : function(obj, fun) {
var args = [];
obj = obj || window;
for(var i = 2; i < arguments.length; i++) {
args.push(arguments[i]);
}
return function() {
fun.apply(obj, args);
};
}
}
/**
* 联动处理类
*
* @param first 第一个 select 的 ID
* @param second 第二个 select 的 ID
* @param dataSet 第二个 select 的数据
*
* @author bao110908
*/
var Linkage = function(first, second) {
this.first = $(first);
this.second = $(second);
}
/**
* 初始化第一个 select 的数据
*/
Linkage.initFirst = function(first, dataSet) {
var base = $(first);
base.options.length = 1;
for(var k in dataSet) {
var opt = new Option(dataSet[k], k);
base.options[base.options.length] = opt;
}
}
Linkage.prototype = {
// 初始化
init : function() {
this.addOnChange();
},
// 为第一个 select 添加 onchange 事件
addOnChange : function() {
Event.addEvent(this.first, change, Event.getFunction(this, this._onChangeEvent));
},
// onchange 事件处理
_onChangeEvent : function() {
this._defaultSelect();
var data = this._getData(this.first.value);
if(!data) {
return;
}
this.second.options.length = 1;
for(var k in data) {
var opt = new Option(data[k], k);
this.second.options[this.second.options.length] = opt;
}
},
// 获取数据,如果采用 Ajax 方式,需要进行更改
// Ajax 应返回 { 101 : {101 : a101, 102, a102 }} 这样的数据格式
// 然后再使用 eval(( + ajaxData + )); 转为 JSON 对象
_getData : function(value) {
return data2[value];
},
// 重新选择时的处理
_defaultSelect : function() {
this.second.selectedIndex = 0;
this.second.options.length = 1;
if(this.second.fireEvent) {
// IE
this.second.fireEvent(onchange);
} else {
// DOM 2
var event = document.createEvent(HTMLEvents);
event.initEvent(change, false, true);
this.second.dispatchEvent(event);
}
}
}
window.onload = function() {
Linkage.initFirst(base1, data);
var one = new Linkage(base1, base2);
one.init();
var two = new Linkage(base2, base3);
two.init();
}
</script>
<style type="text/css">
* {
font-size: 12px;
font-family: "courier new";
}
select {
width: 120px;
}
</style>
<body>
一级:<select name="base1" id="base1"><option value="0">-- 请选择 --</option></select>
 
二级:<select name="base2" id="base2"><option value="0">-- 请选择 --</option></select>
 
三级:<select name="base3" id="base3"><option value="0">-- 请选择 --</option></select>
</body>
</html>

Js代码
复制代码 代码如下:

var one = new Linkage(base1, base2, data2);
one.init();
var two = new Linkage(base2, base3, data3);
two.init();
//每增加一级联动,就要 new 一下就可以了