layui表格中JS控制Switch开关联动切换逻辑
本文介绍在layui表格中通过JavaScript实现两个switch开关的联动控制。当主键开关开启时,自动将允许为空开关置为关闭并修改样式;当允许为空尝试开启时,若主键已开启则拦截操作并提示。核心涉及templet模板定义、form.on监听事件及DOM元素状态同步。
Switch开关联动需求说明
需求场景:在表格交互中,当【主键】列的开关状态切换为“T”(开启)时,【允许为空】列的开关必须自动切换为“F”(关闭),且不可手动选择“T”。
反向逻辑:当【允许为空】列尝试切换为“T”(开启)时,需校验【主键】的状态。若【主键】当前为“T”,则阻止此次更改,弹出提示框告知用户,并保持原状。



Switch控件定义与模板配置
首先,需要在layui表格配置中添加switch控件。
定义主键列:使用templet模板渲染控件,通过{{ d.isSerial == 'T' ? 'checked' : '' }}表达式设置开关的默认选中状态。
{field :'isSerial' , title :'主键', minWidth : 120, templet: '#switchTpl', unresize : true }
<!-- 定义是否主键的开关 -->
<script id="switchTpl" type="text/html">
<!-- 这里的 checked 的状态是-->
<input type="checkbox" name = "ifKey" value = {{d.colNo}} lay-skin="switch" lay-text="T|F" lay-filter="ifKeyDemo" {{ d.isSerial == 'T' ? 'checked' : '' }}>
</script>
定义允许为空列:同样使用templet模板定义对应的switch控件。
{field :'notNull' , title :'允许为空' , minWidth : 100, templet : '#switchNullTpl', unresize : true}
<!-- 定义是否允许为空的开关 -->
<script id="switchNullTpl" type="text/html">
<input type="checkbox" name="ifNull" value="{{d.colNo}}" lay-skin="switch" lay-text="T|F" lay-filter="ifNullDemo" {{ d.notNull == 'T' ? 'checked' : '' }}>
</script>
JS监听逻辑与状态同步实现
添加监听逻辑:通过lay-filter属性绑定事件监听器,重点处理开关切换时的数据同步与UI更新。
// 给对象主键赋值
tableData[parentTrIndex].isSerial = "T";
// 获取允许为空的div
var switchIfNull=$(parentTr).find("td:eq(6)").find("div:eq(1)");
// 修改div的样式为F的样式,F的值
switchIfNull.prop("class","layui-unselect layui-form-switch");//F的样式
switchIfNull.find("em").text("F"); //F的值
tableData[parentTrIndex].notNull = "F"; //修改数据中F的值
在特定条件下使用layer.tips('此列为主键,不允许为空',obj.othis); 显示提示信息。
// 主键
form.on('switch(ifKeyDemo)', function(obj){
// 获取当前控件
var selectIfKey=obj.othis;
// 获取当前所在行
var parentTr = selectIfKey.parents("tr");
// 获取当前所在行的索引
var parentTrIndex = parentTr.attr("data-index");
if(obj.elem.checked == true){//是主键
// 给对象主键赋值
tableData[parentTrIndex].isSerial = "T";
// 获取允许为空的div
var switchIfNull=$(parentTr).find("td:eq(6)").find("div:eq(1)");
// 修改div的样式为F的样式,F的值
switchIfNull.prop("class","layui-unselect layui-form-switch");//F的样式
switchIfNull.find("em").text("F");
tableData[parentTrIndex].notNull = "F";
layer.lips('此列为主键,不允许为空',obj.othis);
}else{
// 给对象赋值
tableData[parentTrIndex].isSerial = "F";
}
});
添加对【允许为空】开关的监听:逻辑与主键监听类似,但需增加对主键状态的判断。
// 允许为空
form.on('switch(ifNullDemo)', function(obj){
// 获取当前控件
var selectIfKey=obj.othis;
// 获取当前所在行
var parentTr = selectIfKey.parents("tr");
// 获取当前所在行的索引
var parentTrIndex = parentTr.attr("data-index");
// 获取“是否主键”的值
var ifKey=parentTr.find(('td:eq(2)')).text().trim();
if(ifKey == "T"){
// 给对象赋值
// 获取允许为空的div
var switchIfNull=$(parentTr).find("td:eq(6)").find("div:eq(1)");
// 修改div的样式为F的样式,F的值
switchIfNull.prop("class","layui-unselect layui-form-switch");//F的样式
switchIfNull.find("em").text("F");
tableData[parentTrIndex].notNull = "F";
layer.alert('此列为主键,不允许为空;若要为空,请更改主键');
}else{
if(obj.elem.checked == true){//允许为空
// 给对象赋值
tableData[parentTrIndex].notNull = "T";
}else{
// 给对象赋值
tableData[parentTrIndex].notNull = "F";
}
}
});
以上即为layui中通过JS控制switch开关联动的完整实现方案,供参考使用。
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
JS使用constructor判断数据类型可靠吗
2026-11-05 13:49:41
