能提交的问卷核心三点:form需method="post"和有效action;所有可填项必须有name;单选/多选须靠name和value对齐。

能提交的问卷,核心就三点:form 必须带 method="post" 和有效 action;每个可填项必须有 name;单选/多选的语义必须靠 name 和 value 对齐,不能靠 class 或 id。
form 标签不写 method 和 action 就等于没写
浏览器默认用 GET 提交,所有答案拼在 URL 里——既不安全,又容易被截断(URL 长度有限),后端也收不到完整数据。本地测试时 action 可暂设为 "#" 或 "https://httpbin.org/post",但 method="post" 不能省。
-
action值要和后端接口路径严格一致,比如 Flask 写action="/api/survey",Express 写action="/survey/submit" - 别用
onsubmit="return false"挡住原生行为却不手动发请求——点按钮没反应,就是卡在这儿 - 如果只是想看结构、不连后端,
method="post"+action="#"足够让开发者工具 Network 面板显示 POST 请求体
单选题 radio 的 name 和 value 必须成对出现
同组单选题所有 input type="radio" 必须共用一个 name,靠 value 区分选项内容。漏写 value,后端收到的就是空字符串或 undefined;name 写成 q1_a、q1_b,就变成多个独立字段,逻辑全乱。
- 正确:
<input type="radio" name="gender" value="male">男 - 错误:
<input type="radio" name="gender">男(没value) - 错误:
<input type="radio" name="gender_m">男(name不统一) - 至少一个加
checked,否则初始无值;用户未操作就提交,后端收不到该字段
多选题 checkbox 和下拉 select 容易漏掉 name
checkbox 和 select 不像 radio 那样有强分组暗示,新手常只写 id 或直接忽略 name。结果是:用户明明勾了、选了,后端却收不到任何数据。
-
checkbox每个选项都要有value,同组用相同name(如name="hobbies"),后端才能按数组接收 -
select必须写name,option必须带value;首项建议<option value="" disabled selected>请选择</option>,避免用户跳过时提交上一题残留值 -
textarea同样要name,别用id="feedback"代替——id只用于 JS/CSS,表单提交只认name
label 绑定失效、移动端点击无响应的常见原因
不是代码写错了,而是绑定方式或事件干扰导致。iOS Safari 对 for 属性容忍度低,安卓部分 WebView 会忽略 touchstart 延迟,label 没包住 input 又没写对 for,点击区域就只剩 input 本身那么小。
- 推荐写法:
<label><input type="radio" name="q1" value="a">选项A</label>(包裹式,最稳) - 若用
for,必须确保label for="q1_a"和input id="q1_a"完全匹配,大小写、空格都不能错 - 别给
label加display: block却忘了设cursor: pointer,视觉上可点、实际点不中 - 移动端慎用纯 CSS 星星评分——真实
input type="radio"必须存在且可聚焦,否则键盘用户无法操作
真正翻车的点往往不在结构,而在细节:比如 textarea 忘了 name,select 的空值项没设 disabled,或者 radio 组里混进了不同 name。这些地方浏览器不报错,但后端永远收不到数据。











