未调用 e.preventDefault() 会导致表单提交刷新丢数据;必须在 submit 事件首行阻止默认行为;PHP 回填需用 htmlspecialchars() 转义并处理空值防 XSS 和 Notice。

submit 事件里没调 e.preventDefault() 就会刷新丢数据
这是最常踩的坑:Bootstrap 表单本身不干预提交逻辑,一旦没阻止默认行为,浏览器立刻跳转或刷新,所有输入瞬间清空。哪怕你用了 sessionStorage 或 PHP 回填,也根本来不及触发。
必须在监听 submit 的第一行就调用 e.preventDefault(),尤其当表单在模态框、Tab 页或 SPA 页面中时——这些场景下用户对“页面没动”有明确预期。
- 用原生 JS:
form.addEventListener('submit', e => { e.preventDefault(); /* 后续 fetch */ }) - 用 jQuery:
$('form').on('submit', function(e) { e.preventDefault(); }) - 别只给按钮加 click 事件,submit 才是表单真正的提交入口
PHP 重定向回表单页时,$_POST 值要安全回填到 value 属性
传统 PHP 场景(非 AJAX)必然刷新页面,此时唯一可靠的数据源是服务端——你得把原始输入重新塞进 HTML 的 value 属性里,否则浏览器真的一无所知。
关键不是“有没有 echo”,而是怎么 echo:必须用 htmlspecialchars() 转义,且要处理未提交字段的空值,否则会输出 Notice: Undefined index 或 XSS 漏洞。
<input name="email" value="<?php echo htmlspecialchars($_POST['email'] ?? '') ?>"><textarea name="bio"><?php echo htmlspecialchars($_POST['bio'] ?? '') ?></textarea>- 多选
<select multiple></select>要遍历比对:in_array('us', $_POST['country'] ?? [])再加selected - 密码字段别回填,直接留空并提示“请重新输入”
用 sessionStorage 实时存字段,但要注意 checkbox 和 radio 的特殊性
适合 AJAX 提交失败后无刷新还原,比服务端回填更及时,还能保留焦点和滚动位置。但它只管“当前标签页”,关掉就清,所以不用清理旧数据——但也要防 Safari 无痕模式禁用的 fallback。
普通文本框用 input.value 即可,但 checkbox 和 radio 的状态是 checked 属性,不是 value;存的时候漏掉这个,还原时就永远勾不上。
- 存:
sessionStorage.setItem('form_newsletter', input.checked) - 取并还原:
const saved = sessionStorage.getItem('form_newsletter'); if (saved !== null) input.checked = JSON.parse(saved); - 监听用
input事件而非change,否则粘贴、自动填充、中文上屏都捕获不到 - key 名加前缀如
form_login_,避免多个表单同名字段互相覆盖
Bootstrap 模态框里的表单,modal('hide') 不等于表单重置
很多人以为模态框一关,表单就干净了,其实 modal('hide') 只是设 display: none,DOM 还在,所有输入值原封不动。用户下次点开,看到的是上次的脏数据,甚至可能误提交。
重置时机不能靠 hidden.bs.modal 事件——那太晚了,而且会干掉你本想保留的默认值或编辑态回填内容。
- 成功提交后、调
modal('hide')前,立即执行:form.reset()(注意是 DOM 元素的reset()方法,不是 jQuery 的.trigger('reset')) - 如果表单含 JS 动态添加的字段(比如通过
append()加的),reset()不生效,得手动清空对应 DOM 或变量 - 别用
$('input').val('')全局清空,它会破坏select的选中状态和checkbox的勾选逻辑
实际项目里,最麻烦的往往是混合场景:比如 Tab 切换的登录/注册表单,既要用 AJAX 防刷新,又得在失败后还原字段,还要处理切换时的焦点丢失和验证状态同步。这些细节不写死在代码里,光靠框架默认行为撑不住。


















