应使用 form.on('select(filtername)') 监听并根据 data.value 控制关联 input 显隐,同步更新 lay-verify 属性与表单渲染,确保 dom 同级、清空值与验证规则,避免校验遗漏或样式错位。
直接在 form.on('select(xxx)') 里判断 data.value 是否等于目标值,然后用 show()/hide() 控制对应 input 的显隐即可——但必须注意 dom 位置、渲染时机和验证规则的同步,否则会出现“点了没反应”或“提交不校验”问题。
监听 select 事件并判断选中值
核心是利用 Layui 表单模块的内置事件监听机制,而非监听原生 change。Layui 会把所有 select 的变更统一收口到 form.on('select(filterName)') 中。
- 确保
select元素有lay-filter="xxx"属性,且值唯一 - 在回调函数中通过
data.value获取当前选中项的value,不是文本内容(text) - 若需匹配“其他”“自定义”等语义值,建议用固定字符串(如
"other"),避免用中文或空格导致比对失败 - 不要在回调里直接操作
select的innerHTML或重写option,这会破坏 Layui 的内部状态
动态显示/隐藏 input 并同步验证规则
显示一个关联 input 不只是 CSS 控制 display,还要让它参与表单校验流程,否则 form.verify() 或 lay-verify 会跳过它。
- 给目标
input加上name和lay-verify属性(初始可设为空,比如lay-verify="") - 显示时调用
$(input).attr("lay-verify", "required|length"),再执行form.render('input')让 Layui 重新识别该输入框 - 隐藏时除了
hide(),还应清空值、移除验证属性:$(input).val('').attr("lay-verify", ""),再form.render('input') - 避免用
visibility: hidden或opacity: 0,它们会让元素仍参与校验,造成误报
DOM 结构与样式避坑要点
被控制的 input 必须和 select 处于同一表单项(.layui-form-item)内,否则 form.render() 可能不生效,且样式错位。
- 不要把
input放在select外层容器之外,例如不能塞进另一个.layui-form-item或弹窗 layer 里 - 推荐结构:
<div class="layui-form-item"> <select></select><div class="layui-input-block"><input type="text" id="otherInput"></div> </div> - 如果
input初始是display: none,确保它的父容器(如.layui-input-block)没有设置固定高度或overflow: hidden,否则显示后可能被截断 - 移动端下,部分安卓 WebView 对
display: none → block切换响应滞后,可加一句$(input)[0].offsetHeight强制重排
最易被忽略的是:当用户从“其他”切回普通选项时,必须主动清空 input 的值并移除验证,否则表单提交时会带着脏数据;而这个动作不能只靠用户手动删,得由 JS 完全接管。











