三级联动

<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>
    &nbsp;  
  二级:<select name="base2" id="base2"><option value="0">-- 请选择 --</option>
  </select>
    &nbsp;  
  三级:<select name="base3" id="base3"><option value="0">-- 请选择 --</option>
  </select>
</body>
</html>
原文地址:https://www.cnblogs.com/ITzhangyunpeng/p/9365664.html