Welcome 微信登录

首页 / 脚本样式 / JavaScript / 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 一下就可以了