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

这是DOM结构:

<div>
<label style="margin-left: 10px;display: inline-block;"><span style="color: red;">*</span>&nbsp;故障类别1:</label>
<select id="faultCategory1" style="width: 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="width: 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="width: 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="width: 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
});

第二个就需要靠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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
});
}, 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
});
}, 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
});
}, 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
}); 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
}); 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
});
}, 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) + '\n' + JSON.stringify(p2) + '\n' + JSON.stringify(p3) + '\n');
}
});
} promiseForSelectShow(2, qf1, qf2, $faultCategory2);
promiseForSelectShow(3, qf2, qf3, $faultCategory3);
promiseForSelectShow(4, qf3, qf4, $faultCategory4);

【JavaScript】下拉联动回显问题的更多相关文章

  1. JS 实现下拉框回显

    JS 实现下拉框回显 学习内容: 需求 总结: 学习内容: 需求 用 JS 实现下拉框回显 实现代码 <!DOCTYPE html> <html lang="en" ...

  2. Layui:select下拉框回显

    一..需求场景分析 基于Thymeleaf模板下的layui下选框回显. 二.获得一个Layui标配的下拉框,我们需要在html中填写的内容如下 <div class="layui-f ...

  3. vue 运用ElementUI,做select下拉框回显

    第一.加载的顺序,应该先加载下拉框要选择的数据,然后在通过编辑查询数据后回显. 第二.要保证select下拉的ID和v-model里边的id保持一致. 第三.elementUI就会自动的将数据回显了. ...

  4. AJAX二级下拉联动【XML方式】

    AJAX二级下拉联动案例 我们在购物的时候,常常需要我们来选择自己的收货地址,先选择省份,再选择城市- 有没有发现:当我们选择完省份的时候,出现的城市全部都是根据省份来给我们选择的.这是怎么做到的呢? ...

  5. 菜鸟学Java(七)——Ajax+Servlet实现无刷新下拉联动

    下拉联动的功能可以说非常的常用,例如在选择省.市等信息的时候:或者在选择大类.小类的时候.总之,下拉联动很常用.今天就跟大家分享一个简单的二级下拉联动的功能. 大类下拉框:页面加载的时候就初始化大类的 ...

  6. Ajax案例-基于XML,以POST方式,完成省份-城市二级下拉联动

    <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...

  7. Jquery Json 下拉联动

    #region dataTable转换成Json格式 /// <summary> /// dataTable转换成Json格式 /// </summary> /// <p ...

  8. 弹性ScrollView,和下啦刷新的效果类似 实现下拉弹回和上拉弹回

    今天做了一个弹性ScrollView,和下啦刷新的效果类似,我想这个很多需求都用的这种效果 其实这是一个自定义的scrollView,上代码,这是我写在一个公共的组件包里的 package com.p ...

  9. select下拉菜单反显不可改动,且submit能够提交数据

    首先通过后台funcA()将下拉菜单反显不可改动的数据response到disable.jsp页面,disable.jsp: <script> var data1=${result.obj ...

  10. 用NPOI导出Excel,生成下拉列表、以及下拉联动列表(第1篇/共3篇)

    最近帅帅的小毛驴遇到一个很奇葩的需求: 导出Excel报表,而且还要带下拉框,更奇葩的是,下拉框还是联动的. 小毛驴一天比较忙,所以这等小事自然由我来为她分忧了.经历了两天,做了几种解决方案,最后完美 ...

随机推荐

  1. 无需搭建环境,零门槛带你体验Open-Sora文生视频应用

    本文分享自华为云社区<Open-Sora 文生视频原来在AI Gallery上也能体验了>,作者:码上开花_Lancer. 体验链接:Open-Sora 文生视频案例体验 不久前,Open ...

  2. kettle从入门到精通 第六十二课 ETL之kettle job中发送邮件(带多个附件),闭坑指南

    1.今天群里一个朋友加我微信遇到问下向我求助.一顿测试下来发现原来是使用kettle姿势不对,对kettle没有完全驾驭导致的,今天和大家一起分享下这个问题. 2.先自我膨胀下,自从写kettle系列 ...

  3. C#.NET与JAVA互通之AES加密解密V2024

    C#.NET与JAVA互通之AES加密解密V2024 视频: 注意点: 1. KEY 和 IV 从字符串转byte数组时,双方要约定好编码,一般是UTF8. 2.明文从字符串转byte数组时,双方要约 ...

  4. ESM风潮下企业服务的最佳实践探讨

    甄知科技孵化于中国领先的IT咨询服务提供商-上海汉得信息技术股份有限公司,主打产品"燕千云"于2019年正式发布,持续迭代版本至今,燕千云作为企业数字化服务平台,燕千云的愿景和现状 ...

  5. 在线Token、随机密码生成工具

    在线生成自定义长度,包含大写或小写字母.数字或符号的随机字符串.无论你需要生成API访问令牌.账户激活令牌,还是随机密码字符串,它都能帮你快速完成. 在线Token.随机密码生成工具

  6. logback日志格式模板,基于TraceId搜索完整的请求链路日志

    logback日志格式模板,基于TraceId搜索完整的请求链路日志 日志打印格式:(可以基于TraceId:4d484c2a110eae9d来搜索完整的请求链路日志2023-08-28 15:06: ...

  7. 一文了解Spark引擎的优势及应用场景

    Spark引擎诞生的背景 Spark的发展历程可以追溯到2009年,由加州大学伯克利分校的AMPLab研究团队发起.成为Apache软件基金会的孵化项目后,于2012年发布了第一个稳定版本. 以下是S ...

  8. C# .NET 常见DeepCopy 深度拷贝的性能对比

    先上结论 Method Mean Error StdDev Gen0 Gen1 Allocated JSONConvert 2,273.02 ns 43.758 ns 52.091 ns 0.6599 ...

  9. EthernetIP IO从站设备数据 转 Modbus RTU TCP项目案例

    1         案例说明 1.   设置网关采集EthernetIP IO设备数据 2.   把采集的数据转成Modbus协议转发给其他系统. 2        VFBOX网关工作原理 VFBOX ...

  10. Linux设备模型:1、设计思想

    背景 搞Linux搞这么久,一直在调试各种各样的驱动.却发现对Linux驱动有太多不够了解的地方.因此转载了 蜗窝科技 的有关文章,作为学习. 内容有少量纠正,样式有做调整. 作者:wowo 发布于: ...