<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<title>试试</title>
<style type="text/css">
* {
font-size: 12px;
font-family: "courier new";
}
select {
120px;
}
</style>
</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 = [];
objobj = 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>
<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>