zoukankan      html  css  js  c++  java
  • 【JavaScript】下拉联动回显问题

    首先是多级下拉联动实现:

    这是DOM结构:

    <div>
        <label style="margin-left: 10px;display: inline-block;"><span style="color: red;">*</span>&nbsp;故障类别1:</label>
        <select id="faultCategory1" style=" 49%;border: black 1px solid;">
            <option value ="0">请选择</option>
        </select>            
    </div>
    <div>
        <label style="margin-left: 10px;display: inline-block;"><span style="color: red;">*</span>&nbsp;故障类别2:</label>
        <select id="faultCategory2" style=" 49%;border: black 1px solid;">
            <option value ="0">请先选择(故障类别1)</option>
        </select>            
    </div>
    <div>
        <label style="margin-left: 10px;display: inline-block;"><span style="color: red;">*</span>&nbsp;故障类别3:</label>
        <select id="faultCategory3" style=" 49%;border: black 1px solid;">
            <option value ="0">请先选择(故障类别2)</option>
        </select>            
    </div>
    <div>
        <label style="margin-left: 10px;display: inline-block;"><span style="color: red;">*</span>&nbsp;故障类别4:</label>
        <select id="faultCategory4" style=" 49%;border: black 1px solid;">
            <option value ="0">请先选择(故障类别3)</option>
        </select>            
    </div>

    首先绑定这些Selector:

    var $faultCategory1 = $('#faultCategory1'); // 故障类别1
    var $faultCategory2 = $('#faultCategory2'); // 故障类别2
    var $faultCategory3 = $('#faultCategory3'); // 故障类别3
    var $faultCategory4 = $('#faultCategory4'); // 故障类别4

    第一个下拉是直接请求即可:

    dms.sendAjaxRequset({
        url : dms.getDmsPath()["claimUsed"] + "/claimfaultdata/all/queryfaultcgy1",
        async : false,
        timeout: 3000, //超时时间设置为3秒;
        contentType: "application/json",
        type: 'GET',
        success: function(result) {
            console.log(JSON.stringify(result));
            let opt = '';
            for (let i = 0; i < result.length; i++) {
                opt += '<option value="' + result[i].FAULT_CODE + '">' + result[i].FAULT_NAME + '</option>';
            }
            $faultCategory1.find('option:eq(0)').after(opt);
        },
        error : function (p1, p2, p3) {
            console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
        }
    });

    第二个就需要靠change事件监听改变,然后取第一个下拉选中的值来请求获取:

    如果改变的是默认值,就不请求接口加载下拉

    但是每一次改变选择都需要清空之前加载的下拉内容

    $faultCategory1.change(function () {
        let faultCode = $faultCategory1.find('option:selected').val();
        // 类别3和类别4 清除
        $faultCategory3.find('option:eq(0)').nextAll().remove();
        $faultCategory4.find('option:eq(0)').nextAll().remove();
        $faultCategory2.find('option:eq(0)').nextAll().remove();
        if (faultCode == 0) return;
        setTimeout(function () {
            dms.sendAjaxRequset({
                url : dms.getDmsPath()["claimUsed"] + "/claimfaultdata/all/queryfaultcgy2/" + faultCode,
                async : false,
                timeout: 3000, //超时时间设置为3秒;
                contentType: "application/json",
                type: 'GET',
                success: function(result) {
                    console.log(JSON.stringify(result));
                    let opt = '';
                    for (let i = 0; i < result.length; i++) {
                        opt += '<option value="' + result[i].FAULT_CODE + '">' + result[i].FAULT_NAME + '</option>';
                    }
                    $faultCategory2.find('option:eq(0)').after(opt);
                },
                error : function (p1, p2, p3) {
                    console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
                }
            });
        }, 200);
    });

    以此类推3和4:

    // 故障类别3
    $faultCategory2.change(function () {
        let faultCode = $faultCategory2.find('option:selected').val();
        // 类别4 清除
        $faultCategory3.find('option:eq(0)').nextAll().remove();
        $faultCategory4.find('option:eq(0)').nextAll().remove();
        if (faultCode == 0) return;
        setTimeout(function () {
            dms.sendAjaxRequset({
                url : dms.getDmsPath()["claimUsed"] + "/claimfaultdata/all/queryfaultcgy3/" + faultCode,
                async : false,
                timeout: 3000, //超时时间设置为3秒;
                contentType: "application/json",
                type: 'GET',
                success: function(result) {
                    console.log(JSON.stringify(result));
                    let opt = '';
                    for (let i = 0; i < result.length; i++) {
                        opt += '<option value="' + result[i].FAULT_CODE + '">' + result[i].FAULT_NAME + '</option>';
                    }
                    $faultCategory3.find('option:eq(0)').after(opt);
                },
                error : function (p1, p2, p3) {
                    console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
                }
            });
        }, 200);
    });
    // 故障类别4
    $faultCategory3.change(function () {
        let faultCode = $faultCategory3.find('option:selected').val();
        $faultCategory4.find('option:eq(0)').nextAll().remove();
        if (faultCode == 0) return;
        setTimeout(function () {
            dms.sendAjaxRequset({
                url : dms.getDmsPath()["claimUsed"] + "/claimfaultdata/all/queryfaultcgy4/" + faultCode,
                async : false,
                timeout: 3000, //超时时间设置为3秒;
                contentType: "application/json",
                type: 'GET',
                success: function(result) {
                    console.log(JSON.stringify(result));
                    let opt = '';
                    for (let i = 0; i < result.length; i++) {
                        opt += '<option value="' + result[i].FAULT_CODE + '">' + result[i].FAULT_NAME + '</option>';
                    }
                    $faultCategory4.find('option:eq(0)').after(opt);
                },
                error : function (p1, p2, p3) {
                    console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
                }
            });
        }, 200);
    });

    编辑页面下,接口会提供已经选中的值,要实现下拉列表选中的状态:

    这里的解决办法是直接在加载的时候就设置好

    这是另外一个下拉的列表,参数有变动,就不好封装函数处理,直接裸写了

    setTimeout(function () {
        dms.sendAjaxRequset({
            url : dms.getDmsPath()["claimUsed"] + "/claimBaseData/10011001/vrtSel",
            async : false,
            timeout: 3000, //超时时间设置为3秒;
            contentType: "application/json",
            type: 'GET',
            success: function(resultI) {
                console.log(JSON.stringify(resultI));
                let opt = '';
                for (let i = 0; i < resultI.length; i++) {
                    if (vrt == resultI[i].ITEM_CODE || vrt == resultI[i].VRT) {
                        vrt = resultI[i].VRT;
                        opt += '<option value="' + resultI[i].ITEM_CODE + '" vrt="' + resultI[i].VRT + '" selected>' + resultI[i].DESC_ZH + '</option>';
                        
                        dms.sendAjaxRequset({
                            url : dms.getDmsPath()["claimUsed"] + "/claimBaseData/10011001/" + vrt + "/vfgSel",
                            async : false,
                            timeout: 3000, //超时时间设置为3秒;
                            contentType: "application/json",
                            type: 'GET',
                            success: function(resultJ) {
                                // console.log('VFG-list:' + 'vfg - ' + vfg  + JSON.stringify(result));
                                let opt = '';
                                for (let j = 0; j < resultJ.length; j++) {
                                    // opt += '<option value="' + result[i].ITEM_CODE + '" vfg="' + result[i].VFG + '">' + result[i].DESC_ZH + '</option>';
                                    if (resultJ[j].VFG == vfg || resultJ[j].ITEM_CODE == vfg) {
                                        vfg = resultJ[j].VFG;
                                        opt += '<option value="' + resultJ[j].ITEM_CODE + '" vfg="' + resultJ[j].VFG + '" selected>' + resultJ[j].DESC_ZH + '</option>';
                                        
                                        dms.sendAjaxRequset({
                                            url : dms.getDmsPath()["claimUsed"] + "/claimBaseData/10011001/" + vfg + "/cccSel",
                                            async : false,
                                            timeout: 3000, //超时时间设置为3秒;
                                            contentType: "application/json",
                                            type: 'GET',
                                            success: function(resultK) {
                                                // console.log('CCC-list:' + 'ccc - '  + ccc +JSON.stringify(result));
                                                let opt3 = '';
                                                for (let k = 0; k < resultK.length; k++) {
                                                    // opt += '<option value="' + result[i].ITEM_CODE + '" ccc="' + result[i].CCC + '">' + result[i].DESC_ZH + '</option>';
                                                    if (resultK[k].CCC == ccc || resultK[k].ITEM_CODE == ccc) {
                                                        opt3 += '<option value="' + resultK[k].ITEM_CODE + '" ccc="' + resultK[k].CCC + '" selected>' + resultK[k].DESC_ZH + '</option>';
                                                        continue; // break;
                                                    }
                                                    opt3 += '<option value="' + resultK[k].ITEM_CODE + '" ccc="' + resultK[k].CCC + '">' + resultK[k].DESC_ZH + '</option>';
                                                }
                                                $CCC.find('option:eq(0)').after(opt3);
                                            },
                                            error : function (p1, p2, p3) {
                                                console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
                                            }
                                        });
                                        
                                        continue;
                                    }
                                    opt += '<option value="' + resultJ[j].ITEM_CODE + '" vfg="' + resultJ[j].VFG + '">' + resultJ[j].DESC_ZH + '</option>';
                                }
                                $VFG.find('option:eq(0)').after(opt);
                            },
                            error : function (p1, p2, p3) {
                                console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
                            }
                        });
    
                        continue;
                    }
                    opt += '<option value="' + resultI[i].ITEM_CODE + '" vrt="' + resultI[i].VRT + '">' + resultI[i].DESC_ZH + '</option>';
                }
                $VRT.find('option:eq(0)').after(opt);
            },
            error : function (p1, p2, p3) {
                console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
            }
        });
    }, 350);

    故障类别是比较固定的,这里就可以封装调用了

    /**
     * 解决故障类别回显问题
     * @param {Object} i 对应接口的1,2,3,4
     * @param {Object} p 接口的url参数
     * @param {Object} targetElement 目标下拉的JqDom对象
     */
    function promiseForSelectShow(i, pa1, pa2, targetElement) {
        dms.sendAjaxRequset({
            url : dms.getDmsPath()["claimUsed"] + "/claimfaultdata/all/queryfaultcgy"+ i + "/" + pa1,
            async : false,
            timeout: 3000, //超时时间设置为3秒;
            contentType: "application/json",
            type: 'GET',
            success: function(result) {
                // console.log(JSON.stringify(result));
                let opt = '';
                for (let i = 0; i < result.length; i++) {
                    if (result[i].FAULT_CODE == pa2 ) { // || result[i]..FAULT_NAME == p
                        opt += '<option value="' + result[i].FAULT_CODE + '" selected>' + result[i].FAULT_NAME + '</option>';
                        continue;
                    }    
                    opt += '<option value="' + result[i].FAULT_CODE + '">' + result[i].FAULT_NAME + '</option>';
                }
                targetElement.find('option:eq(0)').after(opt);
            },
            error : function (p1, p2, p3) {
                console.log(JSON.stringify(p1) + '
    ' + JSON.stringify(p2) + '
    ' + JSON.stringify(p3) + '
    ');
            }
        });
    }
    
    promiseForSelectShow(2, qf1, qf2, $faultCategory2);
    promiseForSelectShow(3, qf2, qf3, $faultCategory3);
    promiseForSelectShow(4, qf3, qf4, $faultCategory4);
  • 相关阅读:
    Servlet生命周期
    DAO 开发模式的几个类
    Iterator用法
    mysql相似于oracle的to_char() to_date()方法
    Java Web页面跳转
    JSP 连接MySQL 5.1
    采用DOM进行表格的修改操作
    使用css让XML文件按照HTML的风格显示出来
    正则表达式Regular Expression
    什么是“堆”,"栈","堆栈","队列",它们的区别
  • 原文地址:https://www.cnblogs.com/mindzone/p/14611868.html
Copyright © 2011-2022 走看看