下拉框联动方法封装

业务中经常需要对数据进行下拉框的联动选择操作,可以假设成省份城市 省份城市县这样的多级联动

客户那边提供的数据大多为excel,格式都属于标准一行列的

假设需要对省份城市进行联动 实现如下

 1  var pcd = [];
 2         pcd[0] = [‘北京‘, ‘北京‘];
 3         pcd[1] = [‘天津‘, ‘天津‘];
 4         pcd[2] = [‘河北‘, ‘石家庄‘];
 5         pcd[3] = [‘河北‘, ‘唐山‘];
 6         pcd[4] = [‘山西‘, ‘太原‘];
 7         pcd[5] = [‘辽宁‘, ‘沈阳‘];
 8         pcd[6] = [‘吉林‘, ‘长春‘];
 9         pcd[7] = [‘黑龙江‘, ‘哈尔滨‘];
10         pcd[8] = [‘上海‘, ‘上海‘];
11         pcd[9] = [‘江苏‘, ‘南京‘];
12         pcd[10] = [‘江苏‘, ‘无锡‘];
13         pcd[11] = [‘江苏‘, ‘苏州‘];
14         pcd[12] = [‘浙江‘, ‘杭州‘];
15         pcd[13] = [‘浙江‘, ‘宁波‘];
16         pcd[14] = [‘浙江‘, ‘温州‘];
17         pcd[15] = [‘安徽‘, ‘合肥‘];
18         pcd[16] = [‘福建‘, ‘福州‘];
19         pcd[17] = [‘江西‘, ‘南昌‘];
20         pcd[18] = [‘山东‘, ‘济南‘];
21         pcd[19] = [‘山东‘, ‘青岛‘];
22         pcd[20] = [‘河南‘, ‘郑州‘];
23         pcd[21] = [‘湖北‘, ‘武汉‘];
24         pcd[22] = [‘湖南‘, ‘长沙‘];
25         pcd[23] = [‘广东‘, ‘广州‘];
26         pcd[24] = [‘广东‘, ‘深圳‘];
27         pcd[25] = [‘广西‘, ‘南宁‘];
28         pcd[26] = [‘重庆‘, ‘重庆‘];
29         pcd[27] = [‘四川‘, ‘成都‘];
30         pcd[28] = [‘云南‘, ‘昆明‘];
31         pcd[29] = [‘陕西‘, ‘西安‘];
32
33         Array.prototype.contains = function (e) {
34             for (var i = 0; i < this.length; i++) {
35                 if (this[i] === e) {
36                     return true;
37                 }
38             }
39             return false;
40         }
41
42         document.getElementById("aprovincename").onchange = function () {
43             bindCity(this.value);
44         }
45         document.getElementById("acityname").onchange = function () {
46             bindDealer(this.value);
47         }
48
49         function bindProvince() {
50             var items = new Array();
51             var el = document.getElementById("aprovincename");
52             el.length = 0;
53             el.options.add(new Option(‘请选择省份‘, ‘0‘));
54             bindCity(0);
55             for (var i = 0, len = pcd.length; i < len; i++) {
56                 if (!items.contains(pcd[i][0])) {
57                     items.push(pcd[i][0]);
58                     el.options.add(new Option(pcd[i][0], pcd[i][0]));
59                 }
60             }
61         }
62         function bindCity(pid) {
63
64             var el = document.getElementById("acityname");
65             el.length = 0;
66             el.options.add(new Option(‘请选择城市‘, ‘0‘));
67
68             if (pid === 0) {
69                 return;
70             }
71             var items = new Array();
72             for (var i = 0, len = pcd.length; i < len; i++) {
73                 if (pcd[i][0] === pid && !items.contains(pcd[i][1])) {
74                     items.push(pcd[i][1]);
75                     el.options.add(new Option(pcd[i][1], pcd[i][1]));
76                 }
77             }
78         }
79
80         bindProvince();

基本需求就是这样的 在此基础上如果需要设置下拉框选项的value值为ID值 那么需要修改相应方法绑定的数据索引

把这部分功能参数封装一下,让其满足多级联动  

(function () {
    var Linkage = function (paras) {
        var _$ = function (id) {
            return document.getElementById(id);
        }
        var items = [],
            item = {},
            data = paras.data;
        var drop = function (options) {
            this.element = _$(options.id);
            this.text = options.text || ‘请选择‘;
            this.value = options.value || ‘0‘;
            options.selected && (this.selected = options.selected);
            options.filter && (this.filter = options.filter);
            options.datachange && (this.datachange = options.datachange);
            if (items.length > 0) {
                this.prevdrop = items[items.length - 1];
                var self = this;
                this.prevdrop.element.onchange = function () {
                    self.bind();
                }
                this.prevdrop.nextdrop = this;
                if (options.textIndex == undefined) {
                    options.textIndex = Math.max(this.prevdrop.textIndex, this.prevdrop.valueIndex) + 1;
                }
            }
            this.textIndex = options.textIndex || items.length;
            this.valueIndex = options.valueIndex || this.textIndex;
        };

        drop.prototype.bind = function () {
            var self = this,
                element = self.element,
                currentData = [],
                filterObj = {},
                nextbind = false;
            element.length = 0;
            element.options.add(new Option(self.text, self.value));

            self.nextdrop && self.nextdrop.bind();
            if (self.prevdrop && self.prevdrop.element.value == self.prevdrop.value) {
                self.datachange && self.datachange(self.element, []);
                return;
            }
            for (var i = 0; i < data.length; i++) {
                if (self.prevdrop) {
                    //如果此条数据在上级未使用跳过
                    if (self.prevdrop.element.value != data[i][self.prevdrop.valueIndex]) {
                        continue;
                    }
                    //如果上级存在过滤方法 执行
                    if (self.prevdrop.filter) {
                        var pf = self.prevdrop.filter(data[i]);
                        if (pf == undefined ? false : !pf) {
                            continue;
                        }
                    }
                }
                currentData.push(data[i]);
                var text = data[i][self.textIndex];
                //排重
                if (filterObj[text] != undefined)
                    continue;
                filterObj[text] = text;
                //如果存在过滤方法进行过来处理 调用方式有待优化
                if (self.filter) {
                    var f = self.filter(data[i]);
                    if (f == undefined ? false : !f) {
                        continue;
                    }
                }
                var option = new Option(text, data[i][self.valueIndex]);
                element.options.add(option);
                //如果是选定的内容 设置选项选中并设置调用下一个的绑定方法
                if (self.selected && (typeof self.selected == ‘function‘ ? self.selected() : self.selected) == text) {
                    option.selected = true;
                    nextbind = true;
                }
            }

            //如果选项中只有一个数据项 删除默认选项并设置调用下一个的绑定方法
            if (element.length == 2) {
                element.remove(0);
                nextbind = true;
            }
            self.datachange && self.datachange(element, currentData);
            if (nextbind) {
                self.nextdrop && self.nextdrop.bind();
            }
        }
        drop.prototype.gettext = function () {
            return this.element.options[this.element.selectedIndex].innerHTML;
        };

        var add = function (optons) {
            var d = new drop(optons);
            items.push(d);
            item[item.id] = d;
        }
        var bind = function () {
            items[0].bind();
            paras.success && paras.success();
        }
        for (var i = 0; i < paras.items.length; i++) {
            add(paras.items[i]);
        }
        bind();

        return {
            items: items,
            item: item,
            bind: bind
        }
    }
    window.AL = Linkage;

})();

调用方式:

//默认调用1
        AL({
            items: [{ id: ‘aprovincename‘ }, { id: ‘acityname‘ }],
            data: pcd,
            success: function () {
                console.log(‘执行完成‘);
            }
        });
        //默认调用2
        AL({
            items: [
            {
                id: ‘aprovincename‘,
                //过滤函数 只展示北京的数据
                filter: function (item) {
                    return item[0] == ‘北京‘;
                }
            }, { id: ‘acityname‘ }],
            data: pcd
        });

封装规则按照传递过来的对象数组顺序定义上下级关系,对象textIndex和valueIndex用于获取属于这个下拉框的索引值,默认情况使用当前对象的索引值,下一个取值为上一个最大索引+1;通过selected属性可以设置默认选择当前值

缺点:

  1.JS不怎么会 效果是实现了 不知道是不是有更好的实现方式

  2.数据格式支持上述pcd数组类的,喜欢后续能支持js对象,ajax请求接口拿到数据那种

  3.只支持select下拉框联动 无法用于自定义div类的联动

--博客园不会怎么插入代码 直接在页面上面看效果--

时间: 2024-08-12 00:00:53

下拉框联动方法封装的相关文章

基于bootstrap-multiselect.js的下拉框联动

背景:当option特别多时,一般的下拉框选择起来就有点力不从心了,所以使用multiselect是个很好的选择,可以通过输入文字来选择选项很方便,但是有一个需要下拉框联动,网上找了半天才找到解决方法,在此分享一下 1.先引入 <script src="~/Assets/js/bootstrap-multiselect.min.js"></script> <link href="~/Assets/css/bootstrap-multiselect

Java Swing应用程序 JComboBox下拉框联动查询

在web项目中,通过下拉框.JQuery和ajax可以实现下拉框联动查询. 譬如说,当你查询某个地方时,页面上有:省份:<下拉框省份> 市区:<下拉框市区> 县乡:<下拉框县乡> 街道:<街道下拉框> 查询 譬如说,你选择了省:江苏省,那么在市区中只会显示江苏省的市区 譬如:(网上的图) 具体详细实现可以参考,写得挺好的:http://blog.csdn.net/sinat_24491773/article/details/50810471 那么在swing

ajax技术实现登录判断用户名是否重复以及利用xml实现二级下拉框联动

今天学了ajax技术,特地在此写下来作为复习. 一.什么是ajax? 客户端(特指PC浏览器)与服务器,可以在[不必刷新整个浏览器]的情况下,与服务器进行异步通讯的技术  即,AJAX是一个[局部刷新]的[异步]通讯技术, 说白了就是局部刷新. 二.ajax的原理如下图 附上ajax与服务器之间的几种状态,但 4是所有浏览器都支持的的 三.ajax包含的技术如下图 四.ajax开发步骤 步一:创建ajax对象,例如:ajax = createAjax(); 步二:开启异步对象:例如:ajax.o

JQuery打造下拉框联动效果

做联动效果,若是用纯JavaScript来做,往往须要辅助页面保存须要刷新的结果集,然后渲染到原页面.考虑将须要动态刷新的内容自己主动拼接到前一个下拉框之后,当前一个下拉框onchange后,同级的后面的下拉框所有清除,然后又一次拼接刷新的内容.用JQuery实现比較easy,代码以省市联动效果为例实现. JSP页面代码例如以下: <li id="base"> <p>生源地:</p> <label> <select id="

利用下拉框的方法进行txt列表中内容的左右切换

利用下拉框的方法实现两个txt列表内内容的左右切换 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <select id="left" size="10" multiple="multiple" style=

月薪10K必备--C#下拉框联动

               下拉框联动 很多网站上都用到下拉框联动,就是第一个下拉框没有选择任何项,第二个下拉框就没有选项.这样的做法更加谨慎,更加紧密. 下面我就教大家怎么做下拉框联动: 首先在窗体的Load事件中给第一个下拉框赋选项 然后第一个下拉框就有选项了 然后我们在第一个下拉框的SelectedIndexChanged()事件中(也就是双击下拉框)写第二个下拉框的代码 这样的话,只要第一个下拉框没选中一项,第二个下拉框就不会有选择项! 下拉框联动就是这样,希望对读者多多少少有点帮助!

html年月日下拉联动菜单 年月日三下拉框联动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head><title>年月日三下拉框联动</title>

IE6浏览器下div无法遮盖select下拉框解决方法

IE6浏览器下div无法遮盖select下拉框解决方法:在IE6浏览器下,select下拉框无法被div遮盖,其他的主流浏览器都是正常的.这里简单介绍一下如何解决此问题.默认状态下IE6的表现: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.51texiao.cn

省份城市下拉框联动简单实例实现方法

效果如下 //定义字典 Dictionary<string, string> Address = new Dictionary<string, string>(); void loadData() { //这是你要添加的数据 //也可以选择动态添加但是考虑到数据不多不影响性能就这么做了 Address.Add("绵阳", "四川"); Address.Add("成都", "四川"); Address.A