表单里选了「华东区」,提交上去只有 value 是 3,想同时带上文字,结果 val() 拿不到,data.value 也只有 3。layui 的 select 被渲染成了自定义结构,原生取值方式会失效。
关键是别在别处瞎找。layui 的 select 事件里,回调参数 data 有三个东西:value 是选中值,elem 是原始 select 元素,othis 是渲染出来的那个框。
事件里取文本
form.on('select(area)', function(data){ var text = data.elem.options[data.elem.selectedIndex].text; console.log(data.value, text); });data.elem 还是原来那个 select,selectedIndex 也是同步的,所以直接读 option 的 text 最稳,不依赖 jQuery。要用 jQuery 也行,find 出 option:selected 再取 text(),效果一样。
注意别对 othis 下手。那个是渲染出来的 div,里面确实有一层显示文字的元素,可它的结构随版本变,2.6 和 2.8 就不一样,写死选择器的代码升个版本就废。
不在事件里怎么取
提交前统一收集的话,form.val 只能拿到 value。取文本可以遍历表单里的 select,也可以给每个 option 加 data-text,自己维护一份映射。数据量大时后者更省事,一次遍历建好,后面查表就行。
- 记得给 select 加 lay-filter,事件名要和它一致,写成 select(area)。
- 动态插入的 option,插完要调一次 form.render 传 select,不然界面不更新。
- 多选 select 用 data.elem.selectedOptions 遍历,selectedIndex 只给第一个。
select 放在表格的每一行里,filter 名会重复触发。给每行拼上索引,或者用事件委托在 change 之后从 elem 反查是哪一行,比给每个 select 写一段监听干净。
还有个小坑:option 的 text 里带空格,浏览器会原样保留,拿去提交前 trim 一下。layui 2.6 以后的回调结构没变,老项目升级一般不用改这段。