【JavaScript】下拉联动回显问题
首先是多级下拉联动实现:
这是DOM结构:
<div>
<label style="margin-left: 10px;display: inline-block;"><span style="color: red;">*</span> 故障类别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> 故障类别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> 故障类别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> 故障类别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】下拉联动回显问题的更多相关文章
- JS 实现下拉框回显
JS 实现下拉框回显 学习内容: 需求 总结: 学习内容: 需求 用 JS 实现下拉框回显 实现代码 <!DOCTYPE html> <html lang="en" ...
- Layui:select下拉框回显
一..需求场景分析 基于Thymeleaf模板下的layui下选框回显. 二.获得一个Layui标配的下拉框,我们需要在html中填写的内容如下 <div class="layui-f ...
- vue 运用ElementUI,做select下拉框回显
第一.加载的顺序,应该先加载下拉框要选择的数据,然后在通过编辑查询数据后回显. 第二.要保证select下拉的ID和v-model里边的id保持一致. 第三.elementUI就会自动的将数据回显了. ...
- AJAX二级下拉联动【XML方式】
AJAX二级下拉联动案例 我们在购物的时候,常常需要我们来选择自己的收货地址,先选择省份,再选择城市- 有没有发现:当我们选择完省份的时候,出现的城市全部都是根据省份来给我们选择的.这是怎么做到的呢? ...
- 菜鸟学Java(七)——Ajax+Servlet实现无刷新下拉联动
下拉联动的功能可以说非常的常用,例如在选择省.市等信息的时候:或者在选择大类.小类的时候.总之,下拉联动很常用.今天就跟大家分享一个简单的二级下拉联动的功能. 大类下拉框:页面加载的时候就初始化大类的 ...
- Ajax案例-基于XML,以POST方式,完成省份-城市二级下拉联动
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...
- Jquery Json 下拉联动
#region dataTable转换成Json格式 /// <summary> /// dataTable转换成Json格式 /// </summary> /// <p ...
- 弹性ScrollView,和下啦刷新的效果类似 实现下拉弹回和上拉弹回
今天做了一个弹性ScrollView,和下啦刷新的效果类似,我想这个很多需求都用的这种效果 其实这是一个自定义的scrollView,上代码,这是我写在一个公共的组件包里的 package com.p ...
- select下拉菜单反显不可改动,且submit能够提交数据
首先通过后台funcA()将下拉菜单反显不可改动的数据response到disable.jsp页面,disable.jsp: <script> var data1=${result.obj ...
- 用NPOI导出Excel,生成下拉列表、以及下拉联动列表(第1篇/共3篇)
最近帅帅的小毛驴遇到一个很奇葩的需求: 导出Excel报表,而且还要带下拉框,更奇葩的是,下拉框还是联动的. 小毛驴一天比较忙,所以这等小事自然由我来为她分忧了.经历了两天,做了几种解决方案,最后完美 ...
随机推荐
- [ROI 2018] Innophone 题解
[ROI 2018] Innophone 看了半天网上仅有的一篇题解--才堪堪写出来 不过在LOJ上看提交,全是 KTT,看得我瑟瑟发抖(不会 题意翻译 在平面上有一些点,你需要在这个平面上任意确定一 ...
- java小记-scanner
不想打字也是我的罪过吗? 作业2: 老师的代码: 结果 我的代码看起来冗余: 想说的: 我的本意是以为scanner只能记录一个数,然后就想着输入两次就能算两个数了,但没想到人家只是让你输就完了.不要 ...
- pytest系列之-mark功能的使用
功能使用: 标记用例,按正常.异常用例划分等级进行标记,或者按照模块进行划分. 标记后,可以执行部分用例. 例如: 你有以下用例,文件目录结构如下: testcase ----user ----man ...
- WIN10 家庭版 罗技G hub 安装提示不兼容当前操作系统解决方法
WIN10 家庭版 罗技G hub 安装提示不兼容当前操作系统解决方法 解决方法: 下载Onboard Memory Manager就可以. --
- idea中vue的启动方式
1.选取 2.添加 3.配置 4.启动 启动前先 在终端 执行 npm install 命令 再启动
- Vue 3深度探索:自定义渲染器与服务端渲染
title: Vue 3深度探索:自定义渲染器与服务端渲染 date: 2024/6/14 updated: 2024/6/14 author: cmdragon excerpt: 这篇文章介绍了如何 ...
- MySQL条件判断IF,CASE,IFNULL语句详解
MySQL条件判断IF,CASE,IFNULL语句详解 1.IF语句的基本用法IF(condition, true_statement, false_statement);condition: 条件表 ...
- Linux Driver : gpio-keys
Linux Driver : gpio-keys的解析 背景 在阅读高通设备树配置一个按键的时候,没有找到按键是在什么时候进行处理的.因此根据仅有的线索gpio-key.c进行分析,发现根据之前的学习 ...
- Freertos学习:08-信号量
--- title: rtos-freertos-08-ipc-semaphore date: 2020-06-23 11:01:12 categories: tags: - freertos - i ...
- STM32 CubeMX 学习:000-搭建开发环境
背景 了解了 STM32 标准库以后,为了紧跟发展的潮流,我们以 CubeMx为基础 开始进行 Hal(Hardware Abstract Layer, 硬件抽象层)库的学习. CubeMx 是一个 ...