type="reset"会强制将hidden输入框的value恢复为HTML初始值,这是浏览器原生行为;应改用type="button"并手动清空可见字段、跳过hidden字段,必要时缓存并恢复其值。
重置按钮默认会清空 hidden 输入框的值,这是浏览器原生行为,layui 无法改变;要保留 hidden 字段值,必须放弃 type="reset",改用 type="button" + 手动控制清空逻辑。
为什么 type="reset" 一定会清除 hidden 输入框
HTML 规范中,type="reset" 会把表单内所有 <input type="hidden"> 的 value 恢复为初始 HTML 中写的值(不是当前 JS 设置的值),哪怕你用 JS 动态改过它。只要它在 <form> 内,点击 reset 就触发——Layui 完全不干预这个过程。
- 现象:
<input type="hidden" name="token" value="abc123">,JS 改成"xyz789",点 reset 后又变回"abc123" - 本质:这是浏览器行为,和 Layui 无关;
form.render()对 hidden 无效,因为它不渲染 hidden 元素 - 别试
form.val()单独设 hidden 值——它只处理有 lay-filter 关联的可见字段,对 hidden 静默忽略
如何用 type="button" 保留 hidden 值并清其他字段
核心思路:不依赖浏览器 reset,自己决定哪些清、哪些不动。hidden 字段跳过操作即可。
- 重置按钮必须写成:
<button type="button" id="resetBtn">重置</button>(type="reset"或没写 type 都不行) - 清空逻辑里,只对 visible 字段调
form.val('filterName', { ... }),不要把 hidden 的 name 写进对象里 - 例如表单有
userName(text)、status(select)、token(hidden),就只传:form.val('searchForm', { userName: '', status: '' }) - 之后必须跟
form.render()刷新 select/checkbox 等 UI,否则看起来没变
hidden 字段被 JS 动态设置后如何确保不丢失
如果你的 hidden 值是通过 JS(比如接口返回后)动态填入的,reset 后要保持它,就得在重置逻辑里“重新赋值”。
- 先缓存 hidden 值:
const savedToken = $('#token').val(); - 执行清空 visible 字段 +
form.render()后,再手动恢复:$('#token').val(savedToken); - 注意:不要在
form.val()里写 hidden 字段名,否则会被覆盖成空字符串 - 如果 hidden 是由 laydate 或 xm-select 等组件间接更新的,得查它们各自的 API(如
xmSelect.setValue())来同步
表格 reload 时 hidden 字段仍参与搜索?
不会。Layui 表格的 where 参数完全由你代码显式传入,和表单 DOM 里的 hidden 字段无关。但如果你在 submit 回调里写了 where: { token: $('#token').val() },那重置按钮没动它,下次 reload 就还会带进去——这属于业务逻辑问题,不是重置本身的问题。
- 检查你的 search 提交逻辑:
form.on('submit(filterName)', function(data){ ... table.reload({ where: data.field }) ... }) - 这里
data.field是form.val()返回的对象,默认不含 hidden 字段(除非你手动加进去) - 真正危险的是:你把 hidden 值硬编码进
table.render({ where: { token: 'xxx' } }),那 reload 永远带它,和 reset 毫无关系
最易被忽略的一点:hidden 字段是否参与搜索,根本不在重置逻辑里控制,而在你每次调 table.reload() 时传的 where 对象里——那个对象怎么构造,它就怎么发。重置按钮只管 UI 和本地表单状态,别让它背锅。


















