原生HTML问卷表单需配置action指向真实后端地址、method设为POST、所有控件带name属性,单选/多选同组name一致且value区分选项,配合label包裹提升移动端点击可靠性。
纯 HTML 表单本身不能“收集数据”,它只是前端容器;真正提交需要后端接收(或借助第三方服务)。很多人写完 <form> 发现点提交没反应,本质是没配 action 或目标服务不可用。
实操建议:
立即学习“前端免费学习笔记(深入)”;
action 必须指向一个真实可处理 POST 请求的地址(比如你自己的 PHP/Node.js 接口,或 https://httpbin.org/post 用于测试)method="post" —— GET 会把答案暴露在 URL 里,不安全也不适合长文本<input>、<select>、<textarea> 都得有 name 属性,否则后端收不到字段名name 相同,靠 value 区分选项值(例如 <input type="radio" name="age_group" value="18-25">)浏览器原生不保存未提交的表单状态。如果问卷长、网络差、或用户误操作,容易白填。这不是 HTML 能解决的,但可以用极简 JS 补救。
实操建议:
立即学习“前端免费学习笔记(深入)”;
input 和 change 事件,把当前值存进 localStorage,键名用表单 id + 字段 name
localStorage,自动填充已有值(注意:仅限非敏感字段,如姓名、选项,别存密码类)localStorage.removeItem() 清理缓存,避免下次误填document.getElementById('q1').addEventListener('input', () => { localStorage.setItem('survey_q1', document.getElementById('q1').value);});
这是最常见的语义误解:HTML 规范规定,未勾选的 <input type="checkbox"> 不参与提交;而 radio 同组只允许一个被选中,所以必然只有一个 value 到后端。
实操建议:
立即学习“前端免费学习笔记(深入)”;
<input type="hidden">,值设为 "not_selected",再用 JS 在勾选时移除它$_POST['hobbies'] 是数组,Python Flask 的 request.form.getlist('hobbies'))不是代码错,大概率是 CSS 或事件干扰。iOS Safari 对 <label> 绑定 for 的点击区域容忍度低,安卓部分 WebView 会忽略 touchstart 延迟。
实操建议:
立即学习“前端免费学习笔记(深入)”;
<label> 包裹 <input>,而不是靠 for 关联(更可靠,且无需 ID)<input> 设 width: 0; height: 0; 再用伪元素模拟——这会让 iOS 无法触发原生 focus<meta name="viewport" content="user-scalable=no">
pointer-events: none 没误加在父容器上最常被忽略的点:表单验证靠 required、pattern 等属性只是基础防护,它们可被绕过。真要防脏数据,后端必须重验字段类型、长度、枚举值——前端提示只是用户体验优化,不是安全边界。