js JavaScript 联动的封装类,不管几级都可以,数据采用非Ajax方式,随意添加联动
2009-05-06
js JavaScript 联动的封装类,不管几级都可以,数据采用非Ajax方式,随意添加联动
关键字: js javascript 联动 封装类 数据 ajax 添加 联动 来自蜗牛乖乖
黑色头发:http://heisetoufa.javaeye.com/
- <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 = [];
- 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>
- <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>
- var one = new Linkage('base1', 'base2', data2);
- one.init();
- var two = new Linkage('base2', 'base3', data3);
- two.init();
- //每增加一级联动,就要 new 一下就可以了
黑色头发:http://heisetoufa.javaeye.com/