layui中监听select必须用form.on('select(filter)'),且需确保lay-filter一致、包裹在layui-form内、动态插入后调用form.render('select'),否则无法捕获变化。
layui form.on('select(filter)') 是唯一可靠方式
原生 change 事件在 layui 中基本失效——因为 select 被重绘为美化后的 dom,原始元素被隐藏,addeventlistener('change') 或 jquery 的 .on('change') 都监听不到真实变化。必须用 layui 自带的 form.on() 才能捕获渲染后控件的行为。
-
lay-filter属性是硬性要求,且值必须和form.on('select(xxx)')中的xxx完全一致 -
select必须包裹在class="layui-form"的form或div内,否则 form 模块不接管,监听直接无效 - 如果 select 是 JS 动态插入的(比如 ajax 加载后 append),必须手动调用
form.render('select'),否则form.on不会生效
监听函数里 data 对象的三个关键字段
回调函数传入的 data 不是原生 event,而是 layui 封装的对象,常用字段就三个,搞错就取不到值:
-
data.value:当前选中的 option 的value值(字符串),这是你最常需要的 -
data.elem:原始<select></select>DOM 元素,可用于读写name、disabled等属性 -
data.othis:layui 渲染后生成的美化下拉框 DOM(即你看到的那个带箭头的盒子),可用来加样式或定位
别试图用 data.elem.value 或 $(data.elem).val() 取值——它们返回空或旧值,只认 data.value。
动态更新下拉框后必须调用 form.render('select')
常见场景:第一个 select 选中后,用 ajax 拉第二个 select 的选项,然后 innerHTML 或 html() 替换内容。这时新插入的 option 仍是纯 HTML,没被 layui 识别,点击无效,也无法触发后续监听。
- 替换完 HTML 后,必须立刻执行
form.render('select') - 如果页面有多个 select,且只想重绘某一个,可以传选择器:
form.render('select', '#mySelectId') - 漏掉这步,现象是:选项看着有了,但点不动、不触发
form.on、甚至整个表单提交时该字段为空
radio 和 select 监听写法不同,别混用
有人把 form.on('select(filter)') 的写法套到 radio 上,结果完全没反应——radio 的监听事件名是 radio,不是 select:
- radio 正确写法:
form.on('radio(filter)', function(data){ console.log(data.value) }) - 对应 HTML 中 radio 必须有相同
lay-filter="filter",且同组 name 一致 - select 和 radio 的
data结构也不同:radio 没有othis字段,data.elem是 input[type=radio] 原生节点
filter 名字可以一样,但事件类型关键字不能错,这是最容易手滑写错的地方。
layui 的 select 监听本质是“劫持渲染后交互”,不是监听原生 DOM。所有问题几乎都源于漏了lay-filter、没包 layui-form、或者动态操作后忘了 form.render()。这三个点卡住,其他都白搭。











