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

这是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. [ROI 2018] Innophone 题解

    [ROI 2018] Innophone 看了半天网上仅有的一篇题解--才堪堪写出来 不过在LOJ上看提交,全是 KTT,看得我瑟瑟发抖(不会 题意翻译 在平面上有一些点,你需要在这个平面上任意确定一 ...

  2. java小记-scanner

    不想打字也是我的罪过吗? 作业2: 老师的代码: 结果 我的代码看起来冗余: 想说的: 我的本意是以为scanner只能记录一个数,然后就想着输入两次就能算两个数了,但没想到人家只是让你输就完了.不要 ...

  3. pytest系列之-mark功能的使用

    功能使用: 标记用例,按正常.异常用例划分等级进行标记,或者按照模块进行划分. 标记后,可以执行部分用例. 例如: 你有以下用例,文件目录结构如下: testcase ----user ----man ...

  4. WIN10 家庭版 罗技G hub 安装提示不兼容当前操作系统解决方法

    WIN10 家庭版 罗技G hub 安装提示不兼容当前操作系统解决方法 解决方法: 下载Onboard Memory Manager就可以. --

  5. idea中vue的启动方式

    1.选取 2.添加 3.配置 4.启动 启动前先 在终端  执行   npm  install  命令  再启动

  6. Vue 3深度探索:自定义渲染器与服务端渲染

    title: Vue 3深度探索:自定义渲染器与服务端渲染 date: 2024/6/14 updated: 2024/6/14 author: cmdragon excerpt: 这篇文章介绍了如何 ...

  7. MySQL条件判断IF,CASE,IFNULL语句详解

    MySQL条件判断IF,CASE,IFNULL语句详解 1.IF语句的基本用法IF(condition, true_statement, false_statement);condition: 条件表 ...

  8. Linux Driver : gpio-keys

    Linux Driver : gpio-keys的解析 背景 在阅读高通设备树配置一个按键的时候,没有找到按键是在什么时候进行处理的.因此根据仅有的线索gpio-key.c进行分析,发现根据之前的学习 ...

  9. Freertos学习:08-信号量

    --- title: rtos-freertos-08-ipc-semaphore date: 2020-06-23 11:01:12 categories: tags: - freertos - i ...

  10. STM32 CubeMX 学习:000-搭建开发环境

    背景 了解了 STM32 标准库以后,为了紧跟发展的潮流,我们以 CubeMx为基础 开始进行 Hal(Hardware Abstract Layer, 硬件抽象层)库的学习. CubeMx 是一个 ...