zoukankan      html  css  js  c++  java
  • javascript实例学习之一——联动下拉框

    经常碰到这样的需求,如省市_城市_乡镇下拉框。后一个下拉框的内容会根据前一个的改变而改变,之前的解决方法往往是在前一个改变的时候,向后台发送请求临时获取对应的内容。这样每触发一次就会网络请求一次,这种方法显然不甚合理,下面使用下拉js实现的联动下拉框,只需要在页面加载的时候将数据准备好,根据数据key值的巧妙设置来实现联动。

    联动下拉框的html代码

    <!DOCTYPE html>
    <html lang="zh_CN">
    <head>
        <meta charset="UTF-8">
        <title>下拉框联动效果</title>
        <script src="js/mySelects.js"></script>
    </head>
    <body>
        <div id="div1"></div>
    </body>
    </html>
    联动下拉框html代码

    联动下拉框的js代码

    document.addEventListener('DOMContentLoaded',function(){
        console.log('domContentLoaded');
        var mySels=new Sels({'id':'div1','level':'3'});
        //第一级下拉框的数据
        mySels.add('1',['1','2','3']);
        //第二级下拉框的数据,1_i对应第一级下拉框第i个选中项
        mySels.add('1_1',['1_1','1_2','1_3']);
        mySels.add('1_2',['2_1','2_2','2_3']);
        mySels.add('1_3',['3_1','3_2','3_3']);
        //第三级下拉框的数据,1_i_j对应第一级下拉框第i个选中项,第二级下拉框第j个选中项的数据
        mySels.add('1_1_1',['1_1_1','1_1_2','1_1_3']);
        mySels.add('1_1_2',['1_2_1','1_2_2','1_2_3']);
        mySels.add('1_1_3',['1_3_1','1_3_2','1_3_3']);
        mySels.add('1_2_1',['2_1_1','2_1_2','2_1_3']);
        mySels.add('1_2_2',['2_2_1','2_2_2','2_2_3']);
        mySels.add('1_2_3',['2_3_1','2_3_2','2_3_3']);
        mySels.add('1_3_1',['3_1_1','3_1_2','3_1_3']);
        mySels.add('1_3_2',['3_2_1','3_2_2','3_2_3']);
        mySels.add('1_3_3',['3_3_1','3_3_2','3_3_3']);
        mySels.init(this.level);
    },false);
    
    //联动下拉菜单对应的类,level代表多少级下拉菜单
    function extendOptions(oldOpt,newOpt){
        //如果没有就添加,如果有就替换
        for(var key in newOpt){
            oldOpt[key]=newOpt[key];
        }
    }
    /**
    *option 构造联动下拉菜单的初始化参数,其中以下两项是必须的:
    *id:联动下拉菜单父元素的id
    *level:联动下拉菜单包含几级下拉菜单
    */ 
    function Sels(option){
        extendOptions(this,option);
        this.oParent=document.getElementById(this.id);
        this.data={};
        //构造函数没有执行完,对象还未创建,因此不能调用相关函数?
        this.selects=this.oParent.getElementsByTagName('select');
    }
    
    Sels.prototype={
        constructor:Sels,
        add:function(key,value){
            this.data[key]=value;
        },
        init:function(level){
            var that=this;
            for(var i=1;i<=this.level;i++){
                var oSel=document.createElement('select');
                var oOpt=new Option('默认','默认');
                oSel.add(oOpt,undefined);
                oSel.index=i;
                //为其指定change事件
    
                oSel.addEventListener('change',function(){
                    //内部函数的this指向的是当前的select对象
                    that.change(this.index);
                },false);
                this.oParent.appendChild(oSel);
            }
    
            //为第一个下拉框添加选项
            var arr=this.data['1'];
            for(i=0,len=arr.length;i<len;i++){
                oOpt=new Option(arr[i],arr[i]);
                this.selects[0].add(oOpt,undefined);
            }
    
        },
        //index代表当前发生change事件是在第几级下拉框,其后的下拉框需要对该事件做出相应
        change:function(index){
            var str='1';
            for(var i=0;i<index;i++){
                str+='_'+this.selects[i].options.selectedIndex;
            }
            if(this.data[str]){
                this.selects[index].options.length=1;
                var arr=this.data[str];
                for(var i=0;i<arr.length;i++){
                    var oOpt=new Option(arr[i],arr[i]);
                    this.selects[index].add(oOpt,undefined);
                }
                this.selects[index].options[1].selected=true;
                //之后的一次联动
                index++;
                if(index<this.selects.length){
                    this.change(index);
                }
            }else{
                //说明选择的是默认
                //此时,将后面的选项都仅保留“默认”这一项即可
                for(var i=index;i<this.selects.length;i++){
                    this.selects[i].options.length=1;
                }
    
            }
        },
    };
    联动下拉框js代码

    相关知识点整理:

    1.利用data的key值来实现联动

    2.面向对象的思路

  • 相关阅读:
    1.01与37.8
    CakePHP 2.x CookBook 中文版 第七章 模型 之 检索数据
    CakePHP 2.x CookBook 中文版 第七章 模型
    CakePHP 2.x CookBook 中文版 第七章 模型 之 数据校验
    CakePHP 2.x CookBook 中文版 第五章 控制器 之 请求和响应对象
    CakePHP 2.x CookBook 中文版 第五章 控制器 之 脚手架
    CakePHP 2.x CookBook 中文版 第七章 模型 之 保存数据
    CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的结构
    Zend Studio 10 phpFormatter 错误的解决
    CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的文件夹结构
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/5228005.html
Copyright © 2011-2022 走看看