自定义三级下拉框字典

自定义三级下拉框字典

在做用户定制内容的时候,遇到一个需求,要做一个可以自定义内容的三级下拉框,用户可以自己添加、删除、修改、移动每一级下拉框中的内容。规则如下:
同级下拉框内容不能出现重复,不同父级的除外;每一级下拉框都必须有值,不能为空,且每个一级下拉框都必须有对应的二级和三级下拉框值。

分隔符号的意义:
$ 分隔每一个下拉框的值,
# 分隔具有相同父级的次级下拉框值,
| 分隔具有相同父级的同级下拉框值。

数据库字段存储格式:
F1|F2$F1S1|F1S2#F2S1|F2S2$F1S1T1|F1S1T2#F1S2T1|F1S2T2#F2S1T1|F2S1T2#F2S2T1|F2S2T2

说明:
First级x项: F1|F2 $
First级Second级x项:F1S1|F1S2 # F2S1|F2S2 $
First级Second级Third级x项:F1S1T1|F1S1T2#F1S2T1|F1S2T2#F2S1T1|F2S1T2#F2S2T1|F2S2T2

有个需要注意的地方,三级下拉框由每个#分隔开的值依次对应二级下拉框值中的一项,就是说从三级下拉框值中是无法区分它是属于哪个一级下拉框值的。

HTML:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>用户自定义三级下拉框</title>
        <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="//code.jquery.com/jquery-1.12.4.js"></script>
        <script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <script type="text/javascript" src="../js/customize_select.js"></script>
        <link rel="stylesheet" href="../css/customize_select.css" />
    </head>
    <body>
        <br/>
        <div style="display: inline-block;color:#4682B4;">
            <div style="display: inline-block;">
                <div style="display: inline-block;">
                    <span>新增一级字典</span>
                    <input type="text" id="MainIpt" />
                    <input type="hidden" id="MainIptHidden" />
                </div>
                <div style="margin-top: 10px;">
                    <span style="line-height: 78px;vertical-align: top;">已选一级字典</span>
                    <select id="MainSlt" size="6" style="width: 164px;" onchange="SltOnChange(1)">
                    </select>
                </div>
            </div>
            <div style="display: inline-block;margin-left: 10px;">
                <ul class="ulBtn">
                    <li><input type="button" class="btn" id="MainAdd" value="添加" style="margin-left: 10px;" onclick="InsertDict('MainIpt', 'MainIptHidden', 1)" /></li>
                    <li><input type="button" class="btn" id="MainEdit" value="修改" style="margin-left: 10px;" onclick="EditDict('MainIpt', 'MainIptHidden', 1)" /></li>
                    <li><input type="button" class="btn" id="MainUp" value="上移" style="margin-left: 10px;" onclick="MoveDict(-1, 'MainIptHidden', 1, 'MainSlt')" /></li>
                    <li><input type="button" class="btn" id="MainDown" value="下移" style="margin-left: 10px;" onclick="MoveDict(1, 'MainIptHidden', 1, 'MainSlt')" /></li>
                    <li><input type="button" class="btn" id="MainDelete" value="删除" style="margin-left: 10px;" onclick="DeleteDict('MainIptHidden', 1, 'MainSlt')" /></li>
                </ul>
            </div>
            <div style="display: inline-block;margin-left: 30px;">
                <div style="display: inline-block;">
                    <span>新增二级字典</span>
                    <input type="text" id="SecondIpt" />
                    <input type="hidden" id="SecondIptHidden" />
                </div>
                <div style="margin-top: 10px;">
                    <span style="line-height: 78px;vertical-align: top;">已选二级字典</span>
                    <select id="SecondSlt" size="6" style="width: 164px;" onchange="SltOnChange(2)">
                    </select>
                </div>
            </div>
            <div style="display: inline-block;margin-left: 10px;">
                <ul class="ulBtn">
                    <li><input type="button" class="btn" id="SecondAdd" value="添加" style="margin-left: 10px;" onclick="InsertDict('SecondIpt', 'SecondIptHidden', 2)" /></li>
                    <li><input type="button" class="btn" id="SecondEdit" value="修改" style="margin-left: 10px;" onclick="EditDict('SecondIpt', 'SecondIptHidden', 2)" /></li>
                    <li><input type="button" class="btn" id="SecondUp" value="上移" style="margin-left: 10px;" onclick="MoveDict(-1,'SecondIptHidden', 2, 'SecondSlt')" /></li>
                    <li><input type="button" class="btn" id="SecondDown" value="下移" style="margin-left: 10px;" onclick="MoveDict(1,'SecondIptHidden', 2, 'SecondSlt')" /></li>
                    <li><input type="button" class="btn" id="SecondDelete" value="删除" style="margin-left: 10px;" onclick="DeleteDict('SecondIptHidden', 2, 'SecondSlt')" /></li>
                </ul>
            </div>
            <div style="display: inline-block;margin-left: 30px;">
                <div style="display: inline-block;">
                    <span>新增三级字典</span>
                    <input type="text" id="ThirdIpt" />
                    <input type="hidden" id="ThirdIptHidden" />
                </div>
                <div style="margin-top: 10px;">
                    <span style="line-height: 78px;vertical-align: top;">已选三级字典</span>
                    <select id="ThirdSlt" size="6" style="width: 164px;" onchange="SltOnChange(3)">
                    </select>
                </div>
            </div>
            <div style="display: inline-block;margin-left: 10px;">
                <ul class="ulBtn">
                    <li><input type="button" class="btn" id="ThirdAdd" value="添加" style="margin-left: 10px;" onclick="InsertDict('ThirdIpt', 'ThirdIptHidden', 3)" /></li>
                    <li><input type="button" class="btn" id="ThirdEdit" value="修改" style="margin-left: 10px;" onclick="EditDict('ThirdIpt', 'ThirdIptHidden', 3)" /></li>
                    <li><input type="button" class="btn" id="ThirdUp" value="上移" style="margin-left: 10px;" onclick="MoveDict(-1,'ThirdIptHidden', 3, 'ThirdSlt')" /></li>
                    <li><input type="button" class="btn" id="ThirdDown" value="下移" style="margin-left: 10px;" onclick="MoveDict(1,'ThirdIptHidden', 3,'ThirdSlt')" /></li>
                    <li><input type="button" class="btn" id="ThirdDelete" value="删除" style="margin-left: 10px;" onclick="DeleteDict('ThirdIptHidden', 3,'ThirdSlt')" /></li>
                </ul>
            </div>
            <div>
                <ul style="list-style-type: none;padding: 0;margin: 0;line-height: 27px;">
                    <li style="text-align: center;line-height: 50px;margin-top: 20px;">
                        <input type="button" id="submitBtn" value="提 交" onclick="FucSubmit()" class="btn" style="width: 66px;height: 31px;" />
                    </li>
                    <li style="text-align: center;line-height: 50px;">
                        <input type="button" id="prodSelect" value="展 示" onclick="AppendDctMain()" class="btn" style="width: 66px;height: 31px;" />
                    </li>
                </ul>
            </div>
        </div>
        <br/><br/>
        <br/>
        <div id="prodSltDiv" style="color:#4682B4;">
            <div>
                数据库相应字段值:<span id="dictData"></span>
            </div>
            <br/>
            <span>请选择:</span>
            <div style="display: -webkit-inline-box;">
                <div>
                    <select id="OneSlt" style="width: 200px;" onchange="AppendDctSecond()"></select>
                </div>
                <div>
                    <select id="TwoSlt" style="width: 200px;margin-left: 8px;" onchange="AppendDctThird()"></select>
                </div>
                <div>
                    <select id="ThreeSlt" style="width: 200px;margin-left: 8px;" ></select>
                </div>
            </div>
        </div>
    </body>
</html>

页面CSS:

<style type="text/css">
        .btn{
            border-radius: 3px;
            border-color: #4682B4;
            background-color: #fff;
            color: #4682B4;
            border: 1px solid;
            width: 44px;
            height: 21px;
            padding: 0;         
        }
        .btn:hover
        { 
            background-color:#4682B4;
            color: #fff;
        }
        .dropdown-menuNew {
            position: absolute;
            left: 0;
            z-index: 1000;
            display: none;
            float: left;
            min-width: 201px;
            padding: 5px 0;
            margin: 2px 0 0 59px;
            font-size: 14px;
            text-align: left;
            list-style: none;
            background-color: #fff;
            -webkit-background-clip: padding-box;
            background-clip: padding-box;
            border: 1px solid #ccc;
            border: 1px solid rgba(0,0,0,.15);
            border-radius: 4px;
            -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
            box-shadow: 0 6px 12px rgba(0,0,0,.175);
        }
        .ulBtn{
            list-style-type: none;
            padding: 0;
            margin: 0;
            line-height: 30px;
        }
        </style>

页面JS(可以单独写出来到一个js文件中,此处为直接嵌入html中):

<script type="text/javascript">
        //一级字典下拉框对象
        var objMainSlt = document.getElementById('MainSlt');
        //二级字典下拉框对象
        var objSecondSlt = document.getElementById('SecondSlt');
        //三级字典下拉框对象
        var objThirdSlt = document.getElementById('ThirdSlt');
        //三级数据字典存储集合
        var listThirdDDT = [];
        //添加函数
        function InsertDict(valIptId,hidIptId,dictIndex) {
            //过滤前后空格换行等空白字符
            var inputvalue = document.getElementById(valIptId).value.replace(/(^\s*)|(\s*$)/g, "");
            inputvalue = inputvalue.replace((/,/g), ",").replace((/$/g), "").replace((/#/g), "#").replace((/'/g), "’").replace((/</g), "〈").replace((/>/g), "〉");
            var objIptHid = document.getElementById(hidIptId);
            if (inputvalue.length > 0 && CheckValue(inputvalue,dictIndex))
            {
                if(dictIndex == 1){
                    if (objIptHid.value.length > 0) 
                    {
                        objIptHid.value += "|" + inputvalue;
                    }
                    else {
                        objIptHid.value += inputvalue;
                    }
                }else if(dictIndex == 2 ){
                    if(objMainSlt.selectedIndex >= 0)
                    {
                        var listDDT = objIptHid.value.split('#');
                        objIptHid.value = "";               
                        if (listDDT[objMainSlt.selectedIndex] ? listDDT[objMainSlt.selectedIndex].length > 0 : false ) 
                        {
                            listDDT[objMainSlt.selectedIndex] += "|" + inputvalue;
                        }
                        else {
                            listDDT[objMainSlt.selectedIndex] = inputvalue;
                        }
                        var listJoin =  listDDT.join("#");
                        objIptHid.value = listJoin;
                    }else if(objMainSlt.length ==0){
                         alert("请先输入一级字典");
                    }
                }else if(dictIndex == 3 ){
                    if(objSecondSlt.selectedIndex >= 0 && objMainSlt.selectedIndex >= 0 && inputvalue.length > 0)
                    {
                        objIptHid.value = "";
                        var tempDDT = [];
                        //确定对应的一级字典
                        if (listThirdDDT[objMainSlt.selectedIndex]) {
                            tempDDT = listThirdDDT[objMainSlt.selectedIndex].split("#");
                        } else{
                            listThirdDDT[objMainSlt.selectedIndex] = "";                            
                        }
                        //确定对应的二级字典
                        if (tempDDT[objSecondSlt.selectedIndex]) {
                            tempDDT[objSecondSlt.selectedIndex] += "|" + inputvalue;
                        } else{
                            tempDDT[objSecondSlt.selectedIndex] = inputvalue;
                        }
                        listThirdDDT[objMainSlt.selectedIndex] = tempDDT.join("#");
                        objIptHid.value = listThirdDDT.join("#");
                    }else if(objMainSlt.length ==0 || objSecondSlt.length ==0){
                         alert("请先输入一级字典和二级字典");
                    }
                }
                AppendDictList(hidIptId,dictIndex);
           }        
        }
        //初始化已选字典单选下拉框
        function AppendDictList(hidIptId,dictIndex) {
            var objIptHid = document.getElementById(hidIptId);
            var listDDT;
            if(dictIndex == 1){
                objMainSlt.innerHTML = "";
                listDDT = objIptHid.value.split('|');
                for (i = 0; i < listDDT.length; i++) {
                    var opt = document.createElement("OPTION");
                    opt.value = listDDT[i];
                    if (opt.value.length > 0) {
                        objMainSlt.add(opt, i);
                        opt.innerText = listDDT[i];
                    }
                    if (i == 0) {
                        opt.selected = true;
                    }
                }
            }else if(dictIndex == 2 && objMainSlt.selectedIndex >= 0){
                objSecondSlt.innerHTML = "";
                listDDT = objIptHid.value.split('#');
                if (listDDT[objMainSlt.selectedIndex]) {
                    var listTempDDT = listDDT[objMainSlt.selectedIndex].split('|');
                    for (i = 0; i < listTempDDT.length; i++) {
                        var opt = document.createElement("OPTION");
                        opt.value = listTempDDT[i];
                        if (opt.value.length > 0) {
                            objSecondSlt.add(opt, i);
                            opt.innerText = listTempDDT[i];
                        }
                        if (i == 0) {
                            opt.selected = true;
                        }
                    }
                }
            }else if(dictIndex == 3){
                objThirdSlt.innerHTML = "";
                if(objSecondSlt.selectedIndex >= 0 && objMainSlt.selectedIndex >= 0)
                {
                    if (listThirdDDT[objMainSlt.selectedIndex]) {
                        var listDDT = listThirdDDT[objMainSlt.selectedIndex].split('#');
                        if (listDDT[objSecondSlt.selectedIndex]) {
                            var listTempTwoDDT = listDDT[objSecondSlt.selectedIndex].split('|');
                            for (i = 0; i < listTempTwoDDT.length; i++) {
                                var opt = document.createElement("OPTION");
                                opt.value = listTempTwoDDT[i];
                                if (opt.value.length > 0) {
                                    objThirdSlt.add(opt, i);
                                    opt.innerText = listTempTwoDDT[i];
                                }
                                if (i == 0) {
                                    opt.selected = true;
                                }
                            }
                        }
                    }
                }
            }
        }
        //检查新增字典是否合法
        function CheckValue(checkvalue,dictIndex) {
            //字符数检查
            var str, Num = 0;
            for (j = 0; j < checkvalue.length; j++) {
                str = checkvalue.substring(j, j + 1);
                if (str <= "~")  //对双字节字特殊处理
                    Num += 1;
                else
                    Num += 2;
                if (Num > 50) {
                    alert("备选值最多为50个英文字符或25个中文字符!");
                    return false;
                }
            }
            //保留字符检查
            str = "";
            if (checkvalue.indexOf("'") > -1) {
                str = "请不要在新增项中使用\'字符";
            }else if (checkvalue.indexOf("|") > -1) {
                str = "请不要在新增项中使用\|字符";
            } else if(checkvalue.indexOf("#") > -1){
                str = "请不要在新增项中使用\#字符";
            }else if (checkvalue.indexOf("$") > -1) {
                str = "请不要在新增项中使用\$字符";
            } 
            if(str != ""){
                alert(str);
                return false;
            }
            //是否存在重复项检查
            var listDDT;
            if (dictIndex == 1) {
                listDDT = document.getElementById("MainIptHidden").value.split('|');
                for (i = 0; i < listDDT.length; i++) {
                    if (checkvalue == listDDT[i]) {
                        alert("一级字典已存在相同的值。");
                        return false;
                    }
                }
            } else if(dictIndex == 2){
                if(objMainSlt.selectedIndex >= 0)
                {
                    listDDT = document.getElementById("SecondIptHidden").value.split('#');
                    if (listDDT[objMainSlt.selectedIndex] ? listDDT[objMainSlt.selectedIndex].length > 0 : false ) {
                        var tempDDTSecond = listDDT[objMainSlt.selectedIndex].split('|');
                        for (i = 0; i < tempDDTSecond.length; i++) {
                            if (checkvalue == tempDDTSecond[i]) {
                                alert("二级字典已存在相同的值。");
                                return false;
                            }
                        }
                    }
                }
            } else if(dictIndex == 3){
                if (listThirdDDT[objMainSlt.selectedIndex]) {
                    var tempDDTthird = listThirdDDT[objMainSlt.selectedIndex].split("#");
                    if (tempDDTthird[objSecondSlt.selectedIndex]) {
                        var TempArray = tempDDTthird[objSecondSlt.selectedIndex].split('|');
                        for (i = 0; i < TempArray.length; i++) {
                            if (checkvalue == TempArray[i]) {
                                alert("三级字典已存在相同的值。");
                                return false;
                            }
                        }
                    }
                }
            }
            return true;
        }
        //切换选中项时
        function SltOnChange(sltIndex){
            var objPrePreSlt = document.getElementById('MainSlt');
            var objPreSlt = document.getElementById('SecondSlt');
            if(sltIndex == 1){
                //重新初始化二级字典
                AppendDictList('SecondIptHidden', 2);
                //重新初始化三级字典
                AppendDictList('ThirdIptHidden', 3);

            }else if(sltIndex == 2){
                //重新初始化三级字典
                AppendDictList('ThirdIptHidden', 3);
            }
        }
        //修改选中的数据字典
        function EditDict(valIptId,hidIptId,dictIndex){
            //过滤前后空格换行等空白字符
            var inputvalue = document.getElementById(valIptId).value.replace(/(^\s*)|(\s*$)/g, "");
            inputvalue = inputvalue.replace((/,/g), ",").replace((/$/g), "").replace((/#/g), "#").replace((/'/g), "’").replace((/</g), "〈").replace((/>/g), "〉");
            var objIptHid = document.getElementById(hidIptId);
            var editedValue = "";
            if (inputvalue.length > 0 && CheckValue(inputvalue,dictIndex))
            {
                if(dictIndex == 1){
                    for(i=0;i<objMainSlt.length;i++){
                        if(objMainSlt[i].selected){
                            editedValue += editedValue == "" ? inputvalue : "|" + objMainSlt[i].value;
                        }else{
                            editedValue += editedValue == "" ? inputvalue : "|" + objMainSlt[i].value;
                        }
                    }
                    objIptHid.value = editedValue;
                }else if(dictIndex == 2 && objMainSlt.selectedIndex >= 0){
                    for(i=0;i<objSecondSlt.length;i++){
                        if(objSecondSlt[i].selected){
                            editedValue += editedValue == "" ? inputvalue : "|" + objSecondSlt[i].value;
                        }else{
                            editedValue += editedValue == "" ? inputvalue : "|" + objSecondSlt[i].value;
                        }
                    }
                    var listDDT = objIptHid.value.split("#")
                    listDDT[objMainSlt.selectedIndex] = editedValue;
                    objIptHid.value = listDDT.join("#");
                }else if(dictIndex == 3 && objMainSlt.selectedIndex >= 0 && objSecondSlt.selectedIndex >= 0){
                    for(i=0;i<objThirdSlt.length;i++){
                        if(objThirdSlt[i].selected){
                            editedValue += editedValue == "" ? inputvalue : "|" + objThirdSlt[i].value;
                        }else{
                            editedValue += editedValue == "" ? inputvalue : "|" + objThirdSlt[i].value;
                        }
                    }
                    var listDDT = listThirdDDT[objMainSlt.selectedIndex].split("#");
                    listDDT[objSecondSlt.selectedIndex] = editedValue;
                    listThirdDDT[objMainSlt.selectedIndex] = listDDT.join("#");
                    objIptHid.value = listThirdDDT.join("#");                   
                }
                AppendDictList(hidIptId,dictIndex);
            }
        }
        //上下移动数据字典
        function MoveDict(ud,hidIptId,dictIndex,sltId) {
            var objIptHid = document.getElementById(hidIptId);
            var objSlt = document.getElementById(sltId);
            var moveIndex = -1;
            //切换下拉框中选项的顺序
            for (i = 0; i < objSlt.length; i++) {
                var values = i + (ud);
                if (objSlt.item(i).selected && values >= 0 && values < objSlt.length) {
                    moveIndex = i;
                    objSlt.item(i).selected = false;
                    var strHtml = objSlt.item(i).outerHTML;
                    objSlt.item(i).outerHTML = objSlt.item(values).outerHTML;
                    objSlt.item(values).outerHTML = strHtml;
                    objSlt.item(values).selected = true;
                    break;
                }
            }
            if (dictIndex == 1) {
                //移动一级字典时,修改二级字典
                 if (moveIndex != -1) {
                    var listSecondDDT = document.getElementById("SecondIptHidden").value.split("#");
                    var curIndexDict = listSecondDDT[moveIndex];
                    listSecondDDT[moveIndex] = listSecondDDT[moveIndex + (index)];
                    listSecondDDT[moveIndex + (index)] = curIndexDict;

                    document.getElementById("SecondIptHidden").value = listSecondDDT.join("#");
                }
                //移动一级字典时,修改三级字典
                if (moveIndex != -1) {
                    var curIndexDict = listThirdDDT[moveIndex];
                    listThirdDDT[moveIndex] = listThirdDDT[moveIndex + (index)];
                    listThirdDDT[moveIndex + (index)] = curIndexDict;
                    document.getElementById("ThirdIptHidden").value = listThirdDDT.join("#");
                }
                //重新初始化二级字典
                AppendDictList('SecondIptHidden', 2);
                //重新初始化三级字典
                AppendDictList('ThirdIptHidden', 3);                
            } else if(dictIndex == 2){
                //移动二级字典时,修改三级字典
                if (listThirdDDT[objMainSlt.selectedIndex]) {
                    var tempDDT = listThirdDDT[objMainSlt.selectedIndex].split("#");
                    if (moveIndex != -1) {
                        var curIndexDict = tempDDT[moveIndex];
                        tempDDT[moveIndex] = tempDDT[moveIndex + (index)];
                        tempDDT[moveIndex + (index)] = curIndexDict;
                    }
                    listThirdDDT[objMainSlt.selectedIndex] = tempDDT.join("#");
                    objIptHid.value = listThirdDDT.join("#");
                }
                //重新生成三级字典
                AppendDictList('ThirdIptHidden', 3);

            }else if(dictIndex == 3){
                var tempDDT = listThirdDDT[objMainSlt.selectedIndex].split("#");
                //清空当前操作的字典字符数组值,用于重新赋值
                tempDDT[objSecondSlt.selectedIndex] = "";
                for (i = 0; i < objSlt.length; i++) {
                    if (i == objSlt.length - 1) {
                        tempDDT[objSecondSlt.selectedIndex] += objSlt.item(i).value;
                    } else {
                        tempDDT[objSecondSlt.selectedIndex] += objSlt.item(i).value + "|";
                    }
                }
                //三级字典存储值
                listThirdDDT[objMainSlt.selectedIndex] = tempDDT.join("#");
                //传入后台的隐藏域赋值
                objIptHid.value = listThirdDDT.join("#");
            }
        }
        //删除数据字典
        function DeleteDict(hidIptId,dictIndex,sltId) {
            var objIptHid = document.getElementById(hidIptId);
            var objSlt = document.getElementById(sltId);
            var deleteIndex = "";
            //删除下拉框选中的值
            for (i = 0; i < objSlt.length; i++) {
                if (objSlt.item(i).selected) {
                    deleteIndex = i;
                    objSlt.remove(i);
                    if (objSlt.length > 0) {
                        if (i == objSlt.length ) {
                            objSlt.item(i-1).selected = true;
                        } else{
                            objSlt.item(i).selected = true;
                        }
                    }
                    break;
                }
            }           
            if (dictIndex == 1) {
                //删除一级字典
                var listDT = objIptHid.value.split("|");
                listDT.splice(deleteIndex,1);
                objIptHid.value = listDT.join("|");
                //删除二级字典
                var listSecDT = document.getElementById("SecondIptHidden").value.split("#");
                listSecDT.splice(deleteIndex,1);
                document.getElementById("SecondIptHidden").value = listSecDT.join("#");
                //删除三级字典
                if (listThirdDDT.length) {
                    listThirdDDT.splice(deleteIndex, 1);
                    document.getElementById("ThirdIptHidden").value = listThirdDDT.join("#");
                }
                //重新初始化二级字典
                AppendDictList('SecondIptHidden', 2);
                //重新初始化三级字典
                AppendDictList('ThirdIptHidden', 3);
            } else if(dictIndex == 2){
                //删除二级字典
                var listSecDT = document.getElementById("SecondIptHidden").value.split("#");
                if (objMainSlt.selectedIndex >= 0) {
                    var tempDT = listSecDT[objMainSlt.selectedIndex].split("|");
                    tempDT.splice(deleteIndex,1);

                    listSecDT[objMainSlt.selectedIndex] = tempDT.join("|");
                }
                document.getElementById("SecondIptHidden").value = listSecDT.join("#");
                //删除三级字典
                if (listThirdDDT.length > 0 && objMainSlt.selectedIndex >= 0) {
                    if(listThirdDDT[objMainSlt.selectedIndex]){
                        var tempDT = listThirdDDT[objMainSlt.selectedIndex].split("#");
                        tempDT.splice(deleteIndex, 1);

                        listThirdDDT[objMainSlt.selectedIndex] = tempDT.join("#");
                        document.getElementById("ThirdIptHidden").value = listThirdDDT.join("#");                       
                    }
                }
                //重新初始化三级字典
                AppendDictList('ThirdIptHidden', 3);
            } else if(dictIndex == 3){
                //删除三级字典
                if (listThirdDDT.length > 0 && objMainSlt.selectedIndex >= 0) {
                    var tempDT = listThirdDDT[objMainSlt.selectedIndex].split("#");
                    var tempDT2 = tempDT[objSecondSlt.selectedIndex].split("|");
                    tempDT2.splice(deleteIndex, 1);

                    tempDT[objSecondSlt.selectedIndex] = tempDT2.join("|")
                    listThirdDDT[objMainSlt.selectedIndex] = tempDT.join("#");
                    document.getElementById("ThirdIptHidden").value = listThirdDDT.join("#");
                }
            }   
        }
        //提交事件
        function FucSubmit(){
            var firstVal = document.getElementById("MainIptHidden").value;
            var secondVal = document.getElementById("SecondIptHidden").value;
            var thirdVal = document.getElementById("ThirdIptHidden").value;
            var firstDT = firstVal.split("|");
            var secondDT = secondVal.split("#");            
            var thirdDT = thirdVal.split("#");

            if (firstVal.length <= 0) {
                alert("一级字典值不能为空!")
                return false;
            } else{
                if(secondVal.length > 0 && secondVal.length >= firstDT.length){
                    for (i=0; i< firstDT.length; i++) {
                        if(secondDT[i]){
                            if (secondDT[i] == "") {
                                alert("一级字典中第 " + (i+1) + " 项下的二级字典值不能为空!")
                                return false;
                            }                   
                        }
                        else{
                            alert("一级字典中第 " + (i+1) + " 项下的二级字典值不能为空!")
                            return false;
                        }
                    }
                }else{
                    alert("二级字典值不能为空!")
                    return false;                   
                }
            }
            //三级字典检查
            if(thirdVal.length > 0){
                var tempDT2 = [];
                var k = 0;
                for (var i = 0; i < secondDT.length; i++) {
                    var tempList = secondDT[i].split('|');
                    for (var j = 0; j < tempList.length; j++) {
                        tempDT2[k] = tempList[j];
                        k++;
                    }
                }
                for (var i = 0; i < thirdDT.length; i++) {
                    if (thirdDT.length != tempDT2.length || thirdDT[i] == "") {
                        alert("三级字典值不能为空!");
                        return false;
                    }
                }
            }else{
                alert("三级字典值不能为空!")
                return false;
            }
            document.getElementById("dictData").innerHTML = firstVal + "$" + secondVal + "$" + thirdVal;
            $("#prodSelect,#prodSltDiv").css("display","")
        }
        //一级字典下拉框对象
        var objOneSlt = document.getElementById('OneSlt');
        //二级字典下拉框对象
        var objTwoSlt = document.getElementById('TwoSlt');
        //三级字典下拉框对象
        var objThreeSlt = document.getElementById('ThreeSlt');
        //展示事件
        //三级下拉框初始化
        function AppendDctMain(){
            objOneSlt.innerHTML = '';
            objTwoSlt.innerHTML = '';
            objThreeSlt.innerHTML = '';
            $("div").remove(".slt-main");

            var dtData = document.getElementById("dictData").innerHTML;
            var strDict = dtData.split('$');
            var strDictFirst = strDict[0].split('|');
            var strDictSecond = strDict[1].split('#');

            for (let i =0; i <strDictFirst.length; i++)
            {
                var opt = document.createElement("OPTION");
                if (strDictSecond[i])
                {
                    opt.value = strDictSecond[i];
                    objOneSlt.appendChild(opt);
                    opt.innerHTML = strDictFirst[i];
                }
            }
            if (objOneSlt.length > 0)
            {
                objOneSlt.item(0).selected = true;
                creatSelect("OneSlt","AppendDctSecond");
                AppendDctSecond();
            }
        }
        //三级下拉框二级字典初始化
        function AppendDctSecond() {
            var dtData = document.getElementById("dictData").innerHTML;
            var strDict = dtData.split('$');
            objTwoSlt.innerHTML = '';
            $("#TwoSlt").next().remove(".slt-main");
            if (strDict.length > 0) {
                var secDct = strDict[1].split('#');
                //获取三级字典
                var preThirdDct = strDict[2].split('#');
                var secDctIn = [];
                var thirdDct = [];
                var alength = 0;
                for (var i = 0; i < secDct.length; i++) {
                    alength = secDct[i].split('|').length;
                    secDctIn[i] = preThirdDct.splice(0, alength);
                    thirdDct[i] = secDctIn[i].join('#');
                }
                var thirdDctChose = thirdDct[objOneSlt.selectedIndex].split('#');

                var selectedDictValue = secDct[objOneSlt.selectedIndex].split('|');
                var opt = document.createElement("OPTION");
                opt.innerHTML = "全部";
                opt.value = "全部";
                objTwoSlt.appendChild(opt);

                for (i = 0; i < selectedDictValue.length; i++)
                {
                    var opt = document.createElement("OPTION");
                    opt.value = thirdDctChose[i];
                    if (opt.value.length > 0)
                    {
                        opt.innerHTML = selectedDictValue[i];
                        objTwoSlt.appendChild(opt);
                    }
                }
                if (objTwoSlt.length > 0)
                {
                    objTwoSlt.item(0).selected = true;
                    creatSelect("TwoSlt","AppendDctThird");
                    AppendDctThird();
                }

            }
        }
        //三级下拉框三级字典初始化
        function AppendDctThird() {
            var dtData =  document.getElementById("dictData").innerHTML;
            var strDict = dtData.split('$');
            objThreeSlt.innerHTML = '';
            $("#ThreeSlt").next().remove(".slt-main");
            if (objTwoSlt.value != "全部") {
                //获取三级字典
                var secDct = strDict[1].split('#');
                var preThirdDct = strDict[2].split('#');
                var secDctIn = [];
                var thirdDct = [];
                var alength = 0;
                for (var i = 0; i < secDct.length; i++) {
                    alength = secDct[i].split('|').length;
                    secDctIn[i] = preThirdDct.splice(0, alength);
                    thirdDct[i] = secDctIn[i].join('#');
                }
                var thirdDctChose = thirdDct[objOneSlt.selectedIndex].split('#');
                var sltIndex = objTwoSlt.selectedIndex-1;
                var selectedDictValue = thirdDctChose[sltIndex].split('|');

                var opt = document.createElement("OPTION");
                opt.innerHTML = "全部";
                opt.value = "全部";       
                objThreeSlt.appendChild(opt);

                for (i = 0; i < selectedDictValue.length; i++)
                {
                    var opt = document.createElement("OPTION");
                    opt.value = selectedDictValue[i];
                    if (opt.value.length > 0)
                    {
                        objThreeSlt.appendChild(opt);
                        opt.innerHTML = selectedDictValue[i];
                    }
                }
                if (objThreeSlt.length > 0)
                {
                    objThreeSlt.item(0).selected = true;
                }
            }
            creatSelect("ThreeSlt");
        }
        </script>

html中引用的本地js和css文件是一个对下拉框的美化,方法creatSelect()为美化下拉框的调用方法。

customize_select.css


* {
    margin: 0;
    list-style: none;
    padding: 0;
}

body {
    font-family: Helvetica, arial, sans-serif;
}

.slt-main{
        background-color: #FFFFFF;
        border: 1px solid #4682B4;
        box-shadow: 0 0 2px #4682B4;
        border-radius: 5px;
        font-size: 17px;
        height: 30px;
        position: relative;
        width: 200px;
        -webkit-user-select: none;
        -moz-user-select: none;
        -khtml-user-select: none;
        -ms-user-select: none;
    }
    .slt-arrow{
        border-top: 7px solid #4682B4;
        border-left: 7px solid transparent;
        border-right: 7px solid transparent;
        cursor: pointer;
        height: 0px;
        position: absolute;
        top: 12px;
        right: 10px;
        width: 0px;
        z-index: 7;
    }
    .slt-arrow.reverse {
        border-top: 7px solid transparent;
        border-bottom: 7px solid #4682B4;
        top: 4px;
    }
    .slt-set{
        background-color: #FFFFFF;
        border-radius: 5px;
        color: #4682B4;
        cursor: pointer;
        height: 27px;
        line-height: 27px;
        overflow: hidden;
        position: relative;
        padding: 0 35px 0 15px;
        width: 150px;
        z-index: 5;
    }
    .slt-block{
        background-color: #FFFFFF;
        border-left: 1px solid #4682B4;
        border-right: 1px solid #4682B4;
        border-bottom: 1px solid #4682B4;
        border-radius: 5px;
        box-shadow: 0 0 2px #4682B4;
        left: -1px;
        line-height: 20px;
        position: absolute;
        top: 32px;
        width: 200px;
    }
    .slt-list{
        cursor: pointer;
        margin: 15px 0 7px;
        list-style-type: none;
    }
    .slt-item{
        color: #4682B4;
        padding: 6px 15px;
    }
    li.slt-item.active{
        background-color: rgb(45, 178, 255);
        color: #FFFFFF;     
    }
    .slt-item:hover{
        background-color: rgb(45, 178, 255);
        color: #FFFFFF;
    }
    ul.slt-list::-webkit-scrollbar {
        width: 12px;
    }
    ul.slt-list::-webkit-scrollbar-thumb {
        border-radius: 10px;
        -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,0.5);
    }

customize_select.js:

var num = 0;

function creatSelect(strId,relatedFunc) {
    var objSlt = $("#" + strId);
    objSlt.css("display", "");
    var strSltDefault = '<div id="creatSlt' + num + '" class="slt-main" style="' +objSlt.attr("style") + '"><div class="slt-arrow"></div><div class="slt-set"></div><div class="slt-block" style="display: none;"><ul class="slt-list" style="height: 200px; overflow: auto;"></ul></div><div>'
    objSlt.css("display", "none");
    objSlt.after(strSltDefault);
    var objSltOptList = objSlt.find("option");
    var objCreat = $("#creatSlt" + num);
    var strLi = "";
    for(let i = 0; i < objSltOptList.length; i++) {
        var objLi = $(objSltOptList[i]);
        if(objLi.prop("selected") || objLi.attr("selected")) {
            strLi += '<li class="slt-item active" value="' + objLi.attr("value") + '">' + objLi.text() + '</li>'
            objSlt.next("div").find(".slt-set").text(objLi.text());
        } else {
            strLi += '<li class="slt-item" value="' + objLi.attr("value") + '">' + objLi.text() + '</li>'
        }       
    }
    objSlt.next("div").find(".slt-list").append(strLi);

    $("#creatSlt" + num).bind("click", function() {
        $(".slt-block").css("display", "none");
        $(".slt-arrow").removeClass("reverse");
        if($(this).find(".slt-block").css("display") == "none") {
            $(this).find(".slt-block").css("display", "block")
            $(this).find(".slt-arrow").addClass("reverse");
        } else {
            $(this).find(".slt-block").css("display", "none")
            $(this).find(".slt-arrow").removeClass("reverse");
        }
    });
    objCreat.find(".slt-block").bind("click", function(e) {
        var src;
        if(e.target) {
            src = $(e.target);
        } else {
            src = $(e.srcElement);
        }
        objCreat.find(".slt-set").text(src.text());
        objCreat.find(".slt-list .active").removeClass("active");
        src.addClass("active");
        objSlt.get(0).selectedIndex = src.index();
        if(relatedFunc){
            eval(relatedFunc+"()");
        }
    });
    num++;
}

$(document).bind("click",
    function(e) {
        if(!$(e.target).is(".slt-set") && !$(e.target).is(".slt-arrow") && !$(e.target).is(".slt-main")) {
            $(".slt-block").css("display", "none")
            $(".slt-arrow").removeClass("reverse");
        }
    }
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值